MySQL SELECT с несколькими условиями

При поиске свободных машин я пытаюсь 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, не изменяя остальную часть моего кода?

Спасибо.

какой тип ошибки выдается, вы должны указать, что

IAMSTR 26.12.2020 05:12

Ошибка: SQLSTATE[42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 Ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с ') AND (location =..

mante 26.12.2020 05:17

перед вашим оператором подготовки добавьте строку, например array_push($bookedCarId, -1);

udit rawat 26.12.2020 06:28
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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 и хотите разрабатывать...
3
4
431
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если вы используете 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();

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

Your Common Sense 26.12.2020 08:29

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