Экранирование или использование строки C в операторе SQL

Я использую 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";

Я пробовал несколько вещей, но безуспешно. Любая помощь будет оценена по достоинству.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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'

не требует ли запрос sql одинарных кавычек? правильно ли username = '% s'?

Ahmad Bilal 10.08.2018 11:52

Да, конечно...

kiran Biradar 10.08.2018 11:54

Мы всегда напоминаем, что эта простая вставка текста не является производственной: xkcd.com/327

Gem Taylor 10.08.2018 11:57

@GemTaylor Было бы полезно, если вы добавите ответ с указанием причины.

Ahmad Bilal 10.08.2018 12:01

кстати, используемая строка очищена, ограничена по размеру, завершена нулем и экранирована должным образом .. мне все еще нужно беспокоиться, Gem?

Ahmad Bilal 10.08.2018 12:02

Хорошо, если он уже продезинфицирован, возможно, ОК. В какой-то момент вам действительно нужно выполнить конкатенацию строк :-)

Gem Taylor 10.08.2018 12:03

Да, вам нужно достаточно памяти, чтобы вместить всю строку. Либо статически, либо динамически.

kiran Biradar 10.08.2018 12:13

Я отредактировал свой ответ, посмотрите.

kiran Biradar 10.08.2018 12:18

char somequery [MAX_QUERY_LENGTH]; char * ghob = "bobmarley"; sprintf (somequery, "ВЫБРАТЬ имя пользователя, пароль из таблицыABC WHERE username = '% s'", ghob);

Ahmad Bilal 10.08.2018 12:25

Если копирование происходит между объектами, которые перекрываются в результате вызова sprintf () или snprintf (), результаты не определены. @ Ахмад Билал понял вашу точку зрения,

kiran Biradar 10.08.2018 12:28

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

Ahmad Bilal 10.08.2018 12:29

Другие вопросы по теме