我正在尝试以下方法:
$stmt = $db->prepare("SELECT * FROM table WHERE date
BETWEEN :year-:month-01 AND :year-:month-01 +
INTERVAL 1 MONTH");
$stmt->bindValue(':year', $year, PDO::PARAM_STR);
$stmt->bindValue(':month', $_POST["month"], PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
当$year
等于2015且$_POST["month"]
等于06时,查询应该给出结果,但事实并非如此。我可以将$year
设为PDO::PARAM_INT
,但这仍然留给我$_POST["month"]
,这是一个字符串(01 .. 12)。
但是,在使用这种小调整进行测试时,请删除绑定...
BETWEEN "2015-06-01" AND "2015-06-01" +
INTERVAL 1 MONTH");
查询成功,结果显示。我认为这是因为服务器收到的日期之间如下所示:
'2015'-'06'-01
所以,我的问题如下:
如何在PDO准备好的声明中“逃避”或“删除”引号? 应该有一种优雅的方法来解决这个问题。
答案 0 :(得分:1)
我甚至不想尝试绑定参数的某些部分。此外,您无法重复使用命名参数(在大多数情况下),请参阅http://php.net/manual/pdo.prepare.php
除非启用仿真模式,否则不能在预准备语句中多次使用同名的命名参数标记。
只需绑定所需的全部值,例如
BETWEEN :start AND :end + INTERVAL 1 MONTH
和...
$date = sprintf('%04d-%02d-01', $year, $month);
$stmt->bindParam(':start', $date);
$stmt->bindParam(':end', $date);