Я пытаюсь написать 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. $date);
Не могли бы вы добавить на него ответ @u_mulder. Также Дэйв, я попробовал ваше предложение, но не повезло :(
Вы используете pdo, поэтому вам следует использовать параметризованные запросы. ... и дизайн базы данных, в котором использование переменных для имен таблиц кажется хорошей идеей, обычно ошибочен.
хорошо, но не возражает ли кто-нибудь показать мне правильный синтаксис того, что я опубликовал выше?






Как отмечали другие выше, у вас не было цитат вокруг свидания. Ваш синтаксис создаст этот 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 для подробностей.
Большое спасибо за подробное объяснение! работает отлично
Потому что
$date- это строка, и ее нужно заключать в кавычки.