【问题标题】:using mysql variable in where clause with PDO在带有 PDO 的 where 子句中使用 mysql 变量
【发布时间】:2019-11-21 00:52:01
【问题描述】:

我仍在努力寻找将一个日期绑定为 SQL 中的变量与 PDO 的最佳解决方案。到目前为止,我在 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;
}

但它并没有真正起作用,那里可能有什么问题?或者解决问题的最佳解决方案是什么?我还没有找到类似的东西来解决我的问题。

【问题讨论】:

  • 您在一个查询中运行多个查询语句。将它们分开,我认为它应该可以工作。

标签: php mysql variables pdo prepared-statement


【解决方案1】:

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

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

另外,字符串中的变量不会被替换,您需要使用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";

【讨论】:

  • 是的,CONCAT 是关键。因为当我尝试使用 :date 占位符两次时出现错误
  • 占位符也不能在字符串中使用。您可能遇到错误,因为它没有找到占位符。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多