PHP PDO 语句:引号中的引号导致查询失败
PHP PDO statement: quotes within quotes cause query to fail
我正在尝试以下操作:
$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 准备好的语句中 'escape' 或 'remove' 引号?
应该有一个优雅的方法来解决这个问题。
我什至懒得尝试绑定参数的一部分。此外,您不能重复使用命名参数(在大多数情况下),请参阅 http://php.net/manual/pdo.prepare.php
You cannot use a named parameter marker of the same name more than once in a prepared statement, unless emulation mode is on.
只需绑定所需的整个值,例如
BETWEEN :start AND :end + INTERVAL 1 MONTH
和...
$date = sprintf('%04d-%02d-01', $year, $month);
$stmt->bindParam(':start', $date);
$stmt->bindParam(':end', $date);
我正在尝试以下操作:
$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 准备好的语句中 'escape' 或 'remove' 引号? 应该有一个优雅的方法来解决这个问题。
我什至懒得尝试绑定参数的一部分。此外,您不能重复使用命名参数(在大多数情况下),请参阅 http://php.net/manual/pdo.prepare.php
You cannot use a named parameter marker of the same name more than once in a prepared statement, unless emulation mode is on.
只需绑定所需的整个值,例如
BETWEEN :start AND :end + INTERVAL 1 MONTH
和...
$date = sprintf('%04d-%02d-01', $year, $month);
$stmt->bindParam(':start', $date);
$stmt->bindParam(':end', $date);