При поиске свободных машин я пытаюсь SELECT
из таблицы cars WHERE
ID не включать уже забронированные автомобили.
Для этого я использовал:
$result = $pdo->prepare("SELECT * FROM cars
WHERE id NOT IN (" . implode(',', $bookedCarIds) . ")
AND (location = '$fromlocation' AND fromdate BETWEEN '$fromdate' AND '$todate')
");
$result->execute();
$availableCars = [];
$availableCars = $result->fetchAll();
Который отлично работает.
Однако проблема возникает, когда в выбранном месте и на выбранные даты нет уже забронированных автомобилей (где $bookedCarsIds
равно NULL). Чтобы решить эту проблему, я использовал следующий код, который выдает синтаксическую ошибку.
$result = $pdo->prepare("SELECT * FROM cars
WHERE id NOT IN (" . implode(',', $bookedCarIds) . ") AND
(location = '$fromlocation' AND fromdate BETWEEN '$fromdate' AND '$todate')
OR WHERE location = '$fromlocation' AND fromdate BETWEEN '$fromdate' AND '$todate'
");
$result->execute();
$availableCars = [];
$availableCars = $result->fetchAll();
Как я могу решить эту проблему, внеся изменения только в этот запрос MySQL, не изменяя остальную часть моего кода?
Спасибо.
Ошибка: SQLSTATE[42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с ') AND (location =..
перед вашим оператором подготовки добавьте строку, например array_push($bookedCarId, -1);
Что-то связанное: Удаление строк с помощью запроса PDO с использованием массивов PHP с NOT IN с выражением конструктора строк и условием IN
Если вы используете PDO
, вам нужно создать динамическое предложение WHERE
с параметрами, как в этом примере:
$whereClause = [];
$params = [];
if (!empty($bookedCarIds)) {
$whereClause[] = 'id NOT IN (?' . str_repeat(', ?', count($bookedCarIds) - 1) . ')';
$params = $bookedCarIds;
}
if (!empty($fromlocation)) {
$whereClause[] = 'location = ?';
$params[] = $fromlocation;
}
if (!empty($fromdate) && !empty($todate)) {
$whereClause[] = 'fromdate BETWEEN ? AND ?';
$params[] = $fromdate;
$params[] = $todate;
}
$whereClause = !empty($whereClause) ? 'WHERE ' . implode(' AND ', $whereClause) : '';
$result = $pdo->prepare("SELECT * FROM cars $whereClause");
$result->execute($params);
$availableCars = $result->fetchAll();
Я проголосую за него, так как, хотя вопрос является дубликатом, нам нужно больше хороших примеров переполнения стека, а не Тихий океан очень плохого кода, который остается здесь на века.
какой тип ошибки выдается, вы должны указать, что