在 PDO 准备语句中将查询与 if else 连接

Posted

技术标签:

【中文标题】在 PDO 准备语句中将查询与 if else 连接【英文标题】:Concatenating Queries with if else in PDO Prepared Statements 【发布时间】:2015-03-23 08:41:42 【问题描述】:

我试图将简单的 mysqli 查询转换为 PDO 准备语句 这是旧代码

if($mode=='')

    $query="SELECT * FROM items WHERE 1";
    if($CuisineId != '')
    
        $query=$query. " AND CuisineId='$CuisineId' ";
    
    if($CategoryId != '')
    
        $query=$query. " AND CategoryId='$CategoryId'  ";
    
    if($DietId != '')
    
        $query=$query. " AND DietId='$DietId' ";
    

    $query=$query. " ORDER BY Name ";

    $result= execute_query($con,$query) or die(mysqli_error($con));
    echo "<option value=''>Select One</option>";
    while ($row=mysqli_fetch_array($result)) 
        echo "<option value=". $row['Id'] .">" . $row['Name'] . "</option>";
    

带有预处理语句的新代码看起来像这样,并且工作正常

if($mode=='')

    $query="SELECT * FROM items WHERE 1";
    if($CuisineId != '')
    
        $query=$query. " AND CuisineId=? ";
    
    if($CategoryId != '')
    
        $query=$query. " AND CategoryId=?  ";
    
    if($DietId != '')
    
        $query=$query. " AND DietId=? ";
    

    $query=$query. " ORDER BY Name ";
    $stmt = $con->prepare($query);
    $stmt->execute(array($CuisineId,$CategoryId,$DietId));
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    echo "<option value=''>Select One</option>";
    while($row = $stmt->fetch()) 
        echo "<option value=". $row['Id'] .">" . $row['Name'] . "</option>";
    

这个新代码运行良好,但这是新代码中最坏的情况。 如果$CuisineId$CategoryId$DietId 为空怎么办?查询不会连接,会在这一行抛出错误

$stmt->execute(array($CuisineId,$CategoryId,$DietId));

如果我开始做 IF ELSE 将所有可能性,它会使我的代码太长。有没有办法解决这个问题?

提前谢谢你:)

【问题讨论】:

【参考方案1】:

您不需要与此查询连接

SELECT * 
FROM items 
WHERE (? is null or CuisineId = ?)
  and (? is null or CategoryId = ?)
  and (? is null or DietId = ?)
ORDER BY Name

【讨论】:

以上是关于在 PDO 准备语句中将查询与 if else 连接的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 准备语句——MySQL LIKE 查询

PDO 准备状态与手动查询的结果不同

从 PDO 准备好的语句中获取查询 [重复]

从 PDO 准备语句中检索(或模拟)完整查询

在查询中使用 PDO 准备好的语句和 LIMIT 时出错 [重复]

在 If / Else 语句中将文本存储到标量中 - Robot Framework