mysql и c — использовать переменную в запросе

#c #mysql

#c #mysql

Вопрос:

Я пишу программу на C с подключением к базе данных mysql, и у меня возникают трудности с созданием моих запросов mysql…

я хочу указать вам переменную integer в моем запросе mysql, но, похоже, я не могу правильно понять…

мой текущий запрос выглядит следующим образом…

 mysql_query(conn, "INSERT INTO markerherkenning (MARKER_ID, DATETIME) values(1, CURRENT_TIME())");
  

мое значение marker_ID должно быть значением переменной, чтобы я мог сократить свой код…

я использовал это руководство, чтобы начать работу… (http://zetcode.com/tutorials/mysqlcapitutorial)

спасибо за помощь

Комментарии:

1. можете ли вы встроить ее в строку? IE: «ВСТАВИТЬ В markerherkenning (MARKER_ID, DATETIME) значения(» переменная «CURRENT_TIME())» забыл, как это сделать в точности на c, но такого рода вещи

2. @Крис: пожалуйста, не предлагайте людям открывать себя для внедрения SQL.

3. @Chris: создание SQL statments путем слепого объединения строк — это путь к катастрофе.

4. @Wooble: не уверен, как внутреннее преобразование целочисленного значения в строку открывает вам путь к атаке с использованием инъекций.

5. @jordi: вы используете mysql или C? mysql — это библиотека для C .

Ответ №1:

Что-то вроде этого:

 
sprintf(request, "INSERT INTO markerherkenning (%d, DATETIME) values(1, CURRENT_TIME())", marker_id);
  

Сначала вы создаете строку с вашим запросом с помощью sprintf (или snprintf), а затем используете ее для sql-запроса.

Ответ №2:

Если это то, что вам нужно выполнить более одного раза, вы можете захотеть использовать подготовленную инструкцию. Это немного больше работы, но это обеспечивает вам некоторую безопасность и производительность. Не говоря уже о том, что вам не нужно постоянно конвертировать между строками и другими типами.

Комментарии:

1. да, но теперь это 50 строк кода … и это изменилось бы на 100… поэтому я предпочитаю изменить 🙂

2. @Jordi: c’est la logiciel . Очевидно, что есть компромиссы; если это игрушечное приложение для вашего собственного развлечения, оно может не стоить дополнительных усилий. Однако, если это то, что предназначено для запуска в жизнь, вы определенно хотите приложить к этому дополнительные усилия.

Ответ №3:

Вы должны преобразовать MARKER_ID в строку, затем добавить его к первой части вашего запроса, а затем добавить остальную его часть.

 char *query = malloc(80);
char num[11];

num = atoi(MARKER_ID);    

strcpy(query, "INSERT INTO markerherkenning (");
strcat(query, num);
strcat(query, ", DATETIME) values(1, CURRENT_TIME())");
  

Комментарии:

1. @Брайан Дрюери: да, исправил это. Спасибо 🙂

2. и как мне реализовать это в моем запросе mysql? mysql_query(conn, запрос); ? моя программа разбилась @ char * num = atoi (var);

3. num = atoi (var) не распознан Ошибка 11 ошибка C2106: ‘=’ : левым операндом должно быть l-значение … :s

4. мое решение… спасибо за помощь char *state; буфер символов [256]; state = «ВСТАВИТЬ В ЗНАЧЕНИЯ markerherkenning (MARKER_ID, DATETIME) (‘%d’,CURRENT_TIME())»; len = sprintf(буфер, состояние, t); mysql_real_query(conn, buffer, len); это работает 🙂