小编典典

如何传递PDO参数数组但仍指定其类型?

mysql

$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用来将参数绑定到变量的内部方法是什么。


阅读 312

收藏
2020-05-17

共1个答案

小编典典

如果您关闭的默认设置PDO::ATTR_EMULATE_PREPARES,那么它将起作用。我刚刚发现mysql的默认设置是打开的,这意味着您实际上从未使用过准备好的语句,php在内部为您创建了动态sql,引用了您的值并替换了占位符。是的,主要的wtf。

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $pdo->prepare($sql);
$stmt->execute(array(5)); //works!

由于性能原因,默认情况下会模拟准备。

另请参见 PDO MySQL:是否使用PDO ::
ATTR_EMULATE_PREPARES?

2020-05-17