Синтаксис SQL-запроса при добавлении дополнительной проверки условий

Я пытаюсь написать SQL-запрос, который извлекает идентификатор и дату. У меня проблемы с правильным синтаксисом:

$query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = ' . $id . ' AND `date` = ' . $date . '');

Изначально у меня это было без второй проверки на дату, и все работало нормально:

$query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = ' . $id . '');

но когда я добавляю чек на дату, все идет не так.

Пожалуйста, помогите мне найти синтаксическую ошибку. Спасибо!

ОБНОВИТЬ:

попробовал это без везения:

$query = $this->pdo->prepare('SELECT * FROM `' . $this->table . '` WHERE `id` = `' . $id. '` AND `date` = `' . $date . '` ');

Потому что $date - это строка, и ее нужно заключать в кавычки.

u_mulder 12.06.2018 18:25

У вас есть лишняя пара одинарных кавычек в конце вашего первого примера. Ставьте ) сразу после $date. $date);

Dave 12.06.2018 18:25

Не могли бы вы добавить на него ответ @u_mulder. Также Дэйв, я попробовал ваше предложение, но не повезло :(

deverguy 12.06.2018 18:32

Вы используете pdo, поэтому вам следует использовать параметризованные запросы. ... и дизайн базы данных, в котором использование переменных для имен таблиц кажется хорошей идеей, обычно ошибочен.

Uueerdo 12.06.2018 18:55

хорошо, но не возражает ли кто-нибудь показать мне правильный синтаксис того, что я опубликовал выше?

deverguy 12.06.2018 18:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
119
1

Ответы 1

Как отмечали другие выше, у вас не было цитат вокруг свидания. Ваш синтаксис создаст этот SQL:

... WHERE `id` = 123 AND `date` = 2018-06-12 -- WRONG

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

... WHERE `id` = 123 AND `date` = '2018-06-12' -- RIGHT

Ваша вторая попытка с обратными тиками также неверна. Обратные галочки предназначены для идентификаторов с разделителями, таких как имена столбцов или имена таблиц. Этот синтаксис будет означать, что вы сравниваете id со столбцом с именем 123, и я предполагаю, что у вас нет такого столбца. То же самое для обратных тиков вокруг даты - это интерпретируется как столбец с именем 2018-06-12, что маловероятно. MySQL не обрабатывает обратные тики как одинарные кавычки.

... WHERE `id` = `123` AND `date` = `2018-06-12` -- WRONG

Однако есть гораздо более простое решение. Вам не придется беспокоиться о кавычках, если вы используете параметры запроса:

$sql = "SELECT * FROM `{$this->table}` WHERE `id` = ? AND `date` = ?";
$stmt = $this->pdo->prepare($sql);
$stmt->execute([$id, $date]);

Вы уже используете prepare(), поэтому вы должны использовать его в максимальной степени и использовать параметры запроса (заполнители ?) вместо интерполяции переменных в строку запроса SQL.

При использовании параметров вам не нужны кавычки для строк или дат. Фактически, вы НЕ должны использовать кавычки для разделения заполнителей параметров ?.

Обратите внимание, что я также показываю синтаксис PHP для помещения переменной непосредственно в строку без разрыва строки и использования . для конкатенации. Вы можете сделать это, если ваша строка PHP заключена в двойные кавычки. Прочтите http://php.net/manual/en/language.types.string.php#language.types.string.parsing для подробностей.

Большое спасибо за подробное объяснение! работает отлично

deverguy 12.06.2018 19:23

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