我正在将 PDO
与 mySQL 结合使用。
ATTR_EMULATE_PREPARES
存在问题 - 我必须同时拥有 true
和 false
。
如果 ATTR_EMULATE_PREPARES
设置为 true
,PDO 将数字值作为字符串返回('column'=>'1' 而不是 'column'=>1)。
当我将 ATTR_EMULATE_PREPARES
设置为 false
时,我无法多次使用相同的参数(查询 ex: "select id, (select 1 from outtable o WHERE o.id=table.id and o.value=:value) FROM table WHERE (select 1 from outtable o WHERE o.id=table.id and o.value=:value)=1"
- 参数 $params['value']=1
有解决办法吗?
最佳答案
没有直接的解决方案。
来自documentation :
You cannot use a named parameter marker of the same name more than once in a prepared statement, unless emulation mode is on.
您可以为每个参数出现添加唯一标记,并多次绑定(bind)参数值:
之前:
...:值,...:值,...:值
之后:
...:值,...:值02,...:值03
您可以将 preg_replace
与 lambda 函数结合使用来执行此操作。假设你有一个函数
function runSQL($query, $params) {
}
例如, $params = [ 'value' => [ 42, PDO::INT ] ]
您可以使用从 0 开始的增量计数器运行 preg_replace
,如果计数器为 0,则不替换,否则将计数器(可能有前缀)附加到变量名称,然后添加,例如, [ ":{$key}_02", $params[$i][0], $params[$i][1] ]
到 $params
。之后,您在 foreach
循环中 bindParam
$params
。
关于php - 结果同时为数字和多个参数 - ATTR_EMULATE_PREPARES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27101224/