2014-10-29 127 views
1

(边注:阻止有问题的标题不停止智能驴象我把U + 203C双感叹号,而不是:P)PDO +评论+? !=错误

快速一轮的调试后,我发现这样的:

$query = <<<END 
    SELECT 
     `column1`, `column2`, 
     SOME_FUNCTION(`column3`) -- process in PHP instead? 
    FROM `tablename` 
    WHERE `condition` BETWEEN ? AND ? 
END; 
$stmt = $pdo->prepare($query); 
$stmt->execute(array(1,10)); 

,并得到这样的:

未捕获的异常» RuntimeException的» PDOException:
SQLSTATE [HY093]:无效的参数编号:绑定变量的数量不符令牌

数你看到了什么问题?

将注释-- process in PHP instead?中的问号解释为将参数绑定到的标记! PDO然后期望三个参数而不是通过的两个参数。

现在,很明显,简单的解决方案是重写评论,但这感觉就像我在避免可能是一个更大的问题。

PDO有可能是错误的,或者有一个选项,我可以设置让它了解MySQL的意见?

回答

2

您可以对它们进行评论,但不包括?或其他类似的内容,例如:x,这些内容可能会被解释为占位符。

PDO不理解SQL语法。它将所有文本视为需要检查占位符的内容。模拟准备好的语句时,会发生什么情况。

+0

啊,我明白了,这是准备好的语句模拟的结果。好的。 mysql驱动程序是否支持没有模拟的准备语句? – 2014-10-29 15:08:28

+0

看起来像PDO [可以做到这一点,但不适用于MySQL](http://stackoverflow.com/questions/10617057/does-pdo-always-use-emulated-prepared-statements-by-default)。 – tadman 2014-10-29 15:09:37

+1

我刚刚尝试禁用'ATTR_EMULATE_PREPARES',它完全执行我准备好的语句 - 甚至更好,它不再对我的问题评论有问题。 – 2014-10-29 15:15:13