Я использую Connector C API для подключения к базе данных mysql. У меня проблема с использованием значения строки c в операторе sql.
char *somequery = "SELECT username, password from tableABC WHERE username='john'";
Вышеупомянутое работает нормально, если я использую простой текст «john». Но если я заменю его строкой (которая установлена ранее в программе), она не сработает и выйдет из строя с ошибкой 500.
char *ghob = "john";
char *somequery = "SELECT username, password from tableABC WHERE username=ghob";
Я пробовал несколько вещей, но безуспешно. Любая помощь будет оценена по достоинству.
sprintf () позволяет хранить отформатированные данные в виде строки. Используя sprintf (), вы можете сохранить значение ghob в некотором запросе.
Как показано ниже.
#define MAX_QUERY_LENGTH 1024 //defines max possible query lengh
char *somequery = malloc(sizeof(char) * MAX_QUERY_LENGTH);
char *ghob = "bobmarley";
sprintf(somequery, "SELECT username, password from tableABC WHERE username='%s'",ghob);
Или
char somequery[MAX_QUERY_LENGTH];
char *ghob = "bobmarley";
sprintf(somequery, "SELECT username, password from tableABC WHERE username='%s'",ghob);
В любом случае все должно быть хорошо.
printf("%s", somequery);
печать некоторого запроса приведет к
SELECT username, password from tableABC WHERE username='bobmarley'
Да, конечно...
Мы всегда напоминаем, что эта простая вставка текста не является производственной: xkcd.com/327
@GemTaylor Было бы полезно, если вы добавите ответ с указанием причины.
кстати, используемая строка очищена, ограничена по размеру, завершена нулем и экранирована должным образом .. мне все еще нужно беспокоиться, Gem?
Хорошо, если он уже продезинфицирован, возможно, ОК. В какой-то момент вам действительно нужно выполнить конкатенацию строк :-)
Да, вам нужно достаточно памяти, чтобы вместить всю строку. Либо статически, либо динамически.
Я отредактировал свой ответ, посмотрите.
char somequery [MAX_QUERY_LENGTH]; char * ghob = "bobmarley"; sprintf (somequery, "ВЫБРАТЬ имя пользователя, пароль из таблицыABC WHERE username = '% s'", ghob);
Если копирование происходит между объектами, которые перекрываются в результате вызова sprintf () или snprintf (), результаты не определены. @ Ахмад Билал понял вашу точку зрения,
оставьте этот последний свой комментарий как есть, так как он будет полезен другим, остальные вы можете удалить.
не требует ли запрос sql одинарных кавычек? правильно ли username = '% s'?