Как правильно форматировать кавычки и двойные кавычки в запросе mysql

В настоящее время я использую соединение PDO для выполнения некоторых запросов mysql, и, поскольку я использую команду $conn->prepare("HERE THE QUERY"), я хочу знать, как форматировать символы, такие как кавычки и двойные кавычки.

Когда у меня есть такие случаи:

$conn->prepare("SELECT * FROM ('SELECT DISTINCT (user_id) FROM table1')");

Это нормально, потому что во вложенном SELECT нет конкретного символа, который может вызвать проблемы. Но как мы можем справиться с такими частными случаями?

Вот странный пример (забудьте mysql ... это совершенно неважно, сосредоточьтесь на ситуации с кавычками) с кавычками и двойными кавычками внутри вложенного SELECT:

$conn->prepare("SELECT * FROM ('SELECT user_id, CONCAT('[\"",GROUP_CONCAT(DISTINCT(cat) ORDER BY user_id DESC SEPARATOR "\",\""),"\"]') cat_grouped FROM table_1') select1");

Каким должен быть правильный синтаксис кавычек в соответствии с этим примером запроса? Если я использую ' вместо " при подготовке запроса, проблема решена, но я хочу понять, есть ли разумный способ сохранить двойные кавычки.


person UgoL    schedule 15.06.2017    source источник
comment
Что мне не хватает? В любом случае, разве этот SQL не полностью недействителен?   -  person Álvaro González    schedule 15.06.2017
comment
@ ÁlvaroGonzález mysql не имеет отношения к этому вопросу - сосредоточьтесь на цитатах   -  person treyBake    schedule 15.06.2017
comment
Ах ... Вы хотите получить ответ на свой вопрос, а не решить вашу проблему. Ничего страшного, я пойду дальше. Извините за беспокойство.   -  person Álvaro González    schedule 15.06.2017
comment
@ ÁlvaroGonzález: SO не следует использовать для полного решения проблем людей. ТАК должен отвечать на вопросы, которые ставят разработчика в тупик, а не кодировать полные решения   -  person treyBake    schedule 16.06.2017


Ответы (1)


во-первых, я рекомендую использовать одинарные кавычки - они быстрее: D

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

Смотрите простым языком:

"string has star"ted"

Как видите, первая двойная кавычка, в которую попадает файл, идет после звезды. Это закрывает строку после звезды, отображая ted" с фатальной ошибкой.

Что вы хотите сделать, так это избежать кавычек, которые конфликтуют с вводной цитатой. Одинарные кавычки внутри двойных кавычек допустимы, и наоборот.

Избегайте одинарных кавычек внутри одинарных кавычек и двойных кавычек внутри двойных кавычек - все остальное можно оставить. Также я рекомендую использовать обратные кавычки для ваших таблиц и полей mysql, чтобы избежать некоторых ошибок в будущем, если они решили добавить новое ключевое слово, которое просто так совпало с вашим именем таблицы / поля

e.g.

при использовании одинарных кавычек:

$conn->prepare('SELECT * FROM table WHERE string_field = \'value\'');

при использовании двойных кавычек:

$conn->prepare("SELECT * FROM table WHERE string_field = \"value\"");

при смешивании:

$conn->prepare('SELECT * FROM table WHERE string_field = "value"');

\ - это escape-символ, используемый в подобных ситуациях :)

Альтернатива - объединение строк:

$conn->prepare('SELECT * FROM table WHERE field = '. $foo);

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

person treyBake    schedule 15.06.2017
comment
Я думаю, что с вашим ответом вы полностью поняли смысл моего вопроса ... так что, в случае конкатенации, такой как ("'.implode("','", (array)$value)."'), какое, по вашему мнению, будет самым разумным решением, чтобы избежать ошибки синтаксического анализа? - person UgoL; 15.06.2017
comment
Спасибо @ThisGuyHasTwoThumbs, теперь эта концепция понятна - person UgoL; 16.06.2017
comment
@UgoL не волнуйся, рад, что помог :) - person treyBake; 16.06.2017