【问题标题】:PHP PDO statement: quotes within quotes cause query to failPHP PDO 语句:引号内的引号导致查询失败
【发布时间】:2015-01-26 22:40:44
【问题描述】:

我正在尝试以下操作:

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

【问题讨论】:

  • 编辑,记录一下:我忘记在我的“调整”中添加引号。 2015-06-01 的两个实例都应该用引号引起来。我已经相应地编辑了我的问题。

标签: php mysql string pdo escaping


【解决方案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);

【讨论】:

  • TBH Phil,我并不完全确定我的答案。我已经删除了。
  • 谢谢,这比我想象的更优雅地解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多