$sql = "SELECT * FROM table WHERE id LIKE CONCAT('%', :id, '%') LIMIT :limit1, :limit2";
我仍然想像这样使用数组输入:
$stmt->execute($array);
否则,我无法重用相同的方法来执行查询。
同时,:limit1和:limit2不能正常工作,除非将其像这样放置:
$stmt->bindParam(':limit1', $limit1, PDO::PARAM_INT);
我试图两者都做,但是不能用bindParams执行:
$stmt->bindParam(':limit2', $limit2, PDO::PARAM_INT); $stmt->execute($array);
怎么回事?
我以为我可以扩展PDOStatement并添加一个新的方法“ bindLimit”之类的东西,但是我无法弄清楚PDO用来将参数绑定到变量的内部方法是什么。
如果您关闭的默认设置PDO::ATTR_EMULATE_PREPARES,那么它将起作用。我刚刚发现mysql的默认设置是打开的,这意味着您实际上从未使用过准备好的语句,php在内部为您创建了动态sql,引用了您的值并替换了占位符。是的,主要的wtf。
PDO::ATTR_EMULATE_PREPARES
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $pdo->prepare($sql); $stmt->execute(array(5)); //works!
由于性能原因,默认情况下会模拟准备。
另请参见 PDO MySQL:是否使用PDO :: ATTR_EMULATE_PREPARES?