在带有 PDO 的 where 子句中使用 mysql 变量
using mysql variable in where clause with PDO
我仍在努力寻找将一个日期作为 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;
}
但它并没有真正起作用,那里可能有什么问题?或者解决问题的最佳解决方案是什么?我仍然没有找到任何类似的东西来解决我的案子。
您不能在一次调用中执行多个查询。
您可以在子查询中初始化变量。
此外,字符串中的变量不会被替换,您需要使用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";
我仍在努力寻找将一个日期作为 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;
}
但它并没有真正起作用,那里可能有什么问题?或者解决问题的最佳解决方案是什么?我仍然没有找到任何类似的东西来解决我的案子。
您不能在一次调用中执行多个查询。
您可以在子查询中初始化变量。
此外,字符串中的变量不会被替换,您需要使用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";