MySQL SELECT 有多个条件

MySQL SELECT with multiple conditions

在搜索可用汽车时,我试图从汽车 table SELECT 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();

效果很好。

但是,当在选定的位置和日期(其中 $bookedCarsIdsNULL)没有已预订的汽车时,就会出现问题。为了处理这个问题,我使用了下面的代码,它抛出了一个语法错误。

$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 查询而不更改其余代码来解决此问题?

谢谢。

如果您使用 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();