我在mySQL中使用PDO
。
对ATTR_EMULATE_PREPARES
有疑问 - 我必须同时拥有true
和false
。
如果ATTR_EMULATE_PREPARES
设置为true
PDO将数字值作为字符串返回('列' =>' 1'而不是'列& #39; = GT; 1)
当我将ATTR_EMULATE_PREPARES
设置为false
时,我无法多次使用相同的参数(我在查询前后出错:"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
< / p>
有解决方法吗?
答案 0 :(得分:0)
没有直接的解决方案。
您不能在预准备语句中多次使用同名的命名参数标记,除非启用模拟模式。
您可以为每个参数事件添加唯一标记,并多次绑定参数值:
在:
...:value,...:value,...:value
后:
...:value,...:value02,...:value03
您可以将preg_replace
与lambda函数一起使用来执行此操作。假设你有一个功能
function runSQL($query, $params) {
}
例如$params = [ 'value' => [ 42, PDO::INT ] ]
你可以使用从0开始的增量计数器运行preg_replace
,如果计数器为0则不替换,否则你将计数器(可能带有前缀)附加到变量名称,然后添加,例如,{{ 1}}到[ ":{$key}_02", $params[$i][0], $params[$i][1] ]
。之后,您$params
周期内bindParam
$params
。