Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中删除一行的MySQL命令无效_Mysql_C - Fatal编程技术网

在C中删除一行的MySQL命令无效

在C中删除一行的MySQL命令无效,mysql,c,Mysql,C,我通常不使用C编程语言编写代码,但我是在学校学的(所以请容忍我,因为我还是个新手)。 简而言之,我最近被指派用C编写代码,以便从MySQL数据库的表中删除行 我使用了stackoverflow和其他资源来帮助我编写这段代码 这是我的代码(不是全部): void delete_行(MYSQL*con) { 字符选择_查询[256]; 字符删除_查询[256]; sprintf(选择_查询,“从其中选择id状态=‘处理’\ 并开始用户,); strcpy(参数->通过,); strcpy(参数->数

我通常不使用C编程语言编写代码,但我是在学校学的(所以请容忍我,因为我还是个新手)。
简而言之,我最近被指派用C编写代码,以便从MySQL数据库的表中删除行

我使用了stackoverflow和其他资源来帮助我编写这段代码

这是我的代码(不是全部):

void delete_行(MYSQL*con)
{
字符选择_查询[256];
字符删除_查询[256];
sprintf(选择_查询,“从其中选择id状态=‘处理’\
并开始主机,);
strcpy(参数->用户,);
strcpy(参数->通过,);
strcpy(参数->数据库,);
MYSQL*连接数据库(数据库连接参数*PARAMS);
con=连接数据库(参数);
//我们不再需要结构了
自由(参数);
params=NULL;
//终止不完整/挂起的进程
删除_行(con);
//关闭mysql连接
mysql_close(con);
返回退出成功;
}
因此,上面的代码编译并运行时没有任何错误,它打印出我要删除的行的ID。但是当我去数据库检查行时,它们仍然在那里


有什么我遗漏的吗?

好的,我终于弄明白了
我在下一行中将
%d
更改为
%s

sprintf(删除查询,“从id=%d的位置删除”,第[i]行)
因为
行[i]
是一个字符串,所以我对此一无所知

我可以通过打印整个MySQL命令来解决这个问题,并注意到传递的id是错误的


谢谢大家对我的帮助

猜猜看?您不能调用
mysql\u query
,同时仍然从上一个查询中获取结果?是否有任何类型的事务正在启动但未提交?与您的问题无关,但您应该使用
sntf
而不是
sprintf
,这样可以避免可能的缓冲区溢出。更好的是,不要使用字符串格式,而是绑定参数。具体如何使用MySQL我不知道,但是浏览他们的文档或一些教程,应该会清楚如何使用它。在这个事务之前可能什么都没有,但是如果删除都是隐式回滚的事务的一部分,那么这可能解释了问题。只是猜测而已;如果您知道没有生成任何事务,那么这显然不是问题:)mysql\u查询中的代码是什么?是的,请始终将您的语句打印到屏幕上,以便在遇到此类问题时可以对其进行分析。这会立即告诉您问题是出在C代码上,还是将语句传输到服务器上。分而治之!
void delete_rows(MYSQL *con)
{
    char selection_query[256];
    char deletion_query[256];

    sprintf(selection_query, "SELECT id FROM <table> WHERE status = 'PROCESSING'\
    AND started < DATE(NOW()) - INTERVAL %d DAY", expire_processing_days);
    if (mysql_query(con, selection_query))
    {
        finish_with_error(con);
    }

    MYSQL_RES *result = mysql_store_result(con);

    if (result == NULL) 
    {
        finish_with_error(con);
    }

    int num_fields = mysql_num_fields(result);

    MYSQL_ROW row; 

    while ((row = mysql_fetch_row(result))) 
    {
        for(int i = 0; i < num_fields; i++) 
        { 
            printf("Deleting process with id: %s ", row[i] ? row[i] : "NULL");
            sprintf(deletion_query, "DELETE FROM <table> WHERE id = %d", row[i]);
            if (mysql_query(con, deletion_query))
            {
                finish_with_error(con);
            }
            mysql_commit(con);
        } 
            printf("\n"); 
    }

    mysql_free_result(result);
}

int main()
{
    MYSQL *con;
    DB_CONN_PARAMS *params = calloc(1,sizeof(DB_CONN_PARAMS));

    //just an alternative way of passing connection params, find a struct easier
    strcpy(params->host, <host>);
    strcpy(params->user, <user>);
    strcpy(params->pass, <password>);
    strcpy(params->db, <database>);

    MYSQL * connect_db(DB_CONN_PARAMS *params);
    con = connect_db(params);

    //we don't need the struct anymore
    free(params);
    params = NULL;

    //kill processes that are incomplete/hanging
    delete_rows(con);

    //close mysql connection
    mysql_close(con);

    return EXIT_SUCCESS;
}