PHP PDO语句:引号内的引号导致查询失败

时间:2015-01-26 22:40:44

标签: php mysql string pdo escaping

我正在尝试以下方法:

$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准备好的声明中“逃避”或“删除”引号? 应该有一种优雅的方法来解决这个问题。

1 个答案:

答案 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);