MYSQL ИНТЕРВАЛ X МИНУТ с переменной при переходе от C - PullRequest
1 голос
/ 20 апреля 2019

Когда я запускаю свой код для обновления записи MYSQL этим кодом, он работает:

const char *update_query = "UPDATE `Time_Action_Settings` SET time= DATE_ADD(NOW(), INTERVAL 10 MINUTE) WHERE attribute='next_run'";

, когда я пытаюсь передать переменную в C с помощью snprintf, код запускается, я получаю сообщение об ошибке:У вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с "% d) МИНУТОМ) WHERE attribute = 'next_run'" в строке 1

const char *update_query = "UPDATE `Time_Action_Settings` SET time= DATE_ADD(NOW(), INTERVAL %d MINUTE) WHERE attribute='next_run'";

if (mysql_query(conn, update_query) != 0)
{
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);

} else {

    if (snprintf(buffer, sizeof(buffer), update_query, variable) >= sizeof(buffer))
    {
        printf("Issue with Buffer \n");
        exit (-1);
    }
}

1 Ответ

1 голос
/ 20 апреля 2019

Сначала необходимо вызвать snprintf(), а затем использовать буфер в качестве запроса, который вы передаете mysql_query().

const char *update_query = "UPDATE `Time_Action_Settings` SET time= DATE_ADD(NOW(), INTERVAL %d MINUTE) WHERE attribute='next_run'";
if (snprintf(buffer, sizeof(buffer), update_query, variable) >= sizeof(buffer)) {
    printf("Issue with Buffer \n");
    exit (-1);
} else if (mysql_query(conn, buffer) != 0){
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);
}

Вам также следует изучить возможность использования подготовленных операторов вместо подстановки в строку SQL. Это защитит от SQL-инъекций, если вы заменяете строки вместо чисел, и вам не нужно беспокоиться о выделении достаточно большого буфера.

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