在PDO的where子句中使用mysql变量

时间:2019-07-11 10:14:05

标签: php mysql variables pdo prepared-statement

我仍在努力寻找最佳的解决方案,以将一个日期作为变量与PDO绑定在SQL中。到目前为止,我已经用PHP编写了一个函数,该函数可以估计特定日期的时间。我只有一个约会,但是我发现最肮脏的解决方案是将它绑定两次,这样我就不会冒险保持代码的清洁。所以我在考虑设置一个变量,该变量将在Where子句中使用。到目前为止,这就是我的代码:

<?php
function approximateAppo($date){
    $link = OpenDB();
    try {
        $query = "SET @v1 = :date;
                  SELECT from, till
                  FROM termin
                  WHERE from >= CONVERT('@v1 08:00:00', DATETIME) 
                  AND till <= CONVERT('@v1 20:00:00', DATETIME) 
                  AND comp_id=:comp";
        $statement = $link->prepare($query);
        $statement->bindValue(':comp', $_SESSION['comp'],PDO::PARAM_INT);
        $statement->bindValue(':date', $date, PDO::PARAM_STR);
        $statement->execute();
        $row = $statement->fetchAll();
    } catch (PDOException $e){
        p($e);
    }
    CloseDB($link);
    return $row;
}

但是它并不真正起作用,那里可能是什么问题?或解决该问题的最佳解决方案是什么?我仍然没有找到解决问题的类似方法。

1 个答案:

答案 0 :(得分:2)

您不能在一个调用中执行多个查询。

您可以在子查询中初始化变量。

此外,不会在字符串内替换变量,您需要使用CONCAT()

$query = "SELECT from, till
          FROM termin
          CROSS JOIN (SELECT @v1 := :date) AS x
          WHERE from >= CONVERT(CONCAT(@v1, ' 08:00:00'), DATETIME) 
          AND till <= CONVERT(CONCAT(@v1, ' 20:00:00'), DATETIME) 
          AND comp_id=:comp";

但是实际上并不需要该变量,您可以两次使用:date占位符。

$query = "SELECT from, till
          FROM termin
          WHERE from >= CONVERT(CONCAT(:date, ' 08:00:00'), DATETIME) 
          AND till <= CONVERT(CONCAT(:date, ' 20:00:00'), DATETIME) 
          AND comp_id=:comp";