MySQL команда для удаления строки в C не работает - PullRequest
0 голосов
/ 07 февраля 2019

Я обычно не пишу код с использованием языка программирования C, но я выучил его в школе (поэтому, пожалуйста, потерпите меня, потому что я все еще новичок).
Короче, мне недавно было поручено написать код на C дляудалить строки из таблицы в базе данных MySQL.

Я использовал стек переполнение и другие ресурсы, чтобы помочь мне с этим кодом!

Это мой код (не весь):

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;
}

Итак, приведенный выше код компилируется и выполняется без ошибок, он выводит идентификаторы строк, которые я хочу удалить.Но когда я иду в базу данных, чтобы проверить строки, они все еще там!

Есть ли что-то, чего мне не хватает?

1 Ответ

0 голосов
/ 07 февраля 2019

Хорошо, я наконец-то понял!
Я изменил %d на %s в следующей строке:
sprintf(deletion_query, "DELETE FROM WHERE id = %d", row[i]);.
Поскольку row[i] - это строка, я былслеп к этому.

Я смог выяснить это, напечатав всю команду MySQL, и заметил, что переданный идентификатор неверен!

Спасибо всем за ваши попытки помочь мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...