PHP中的原子字符串替换
在我们的web应用程序中,我们有一个类,它模拟准备好的语句以正确转义SQL参数 现在,我认为只使用PHP中的原子字符串替换,php,sql,string,replace,Php,Sql,String,Replace,在我们的web应用程序中,我们有一个类,它模拟准备好的语句以正确转义SQL参数 现在,我认为只使用PDO会更好,但是这个应用程序非常旧,重构可能相当长,所以目前我只想修复我发现的一个bug 考虑使用我们的类的这段代码: $s = Q()->statement("SELECT * FROM DUAL WHERE 1 = :a AND 2 = :b AND 3 = :c"); $s->bindValue('c', ':b'); $s->bindValue('b', ':a'); $
PDO
会更好,但是这个应用程序非常旧,重构可能相当长,所以目前我只想修复我发现的一个bug
考虑使用我们的类的这段代码:
$s = Q()->statement("SELECT * FROM DUAL WHERE 1 = :a AND 2 = :b AND 3 = :c");
$s->bindValue('c', ':b');
$s->bindValue('b', ':a');
$s->bindValue('a', ':c');
var_dump($s->prepared);
第一行创建语句,然后绑定一些值,然后转储准备好的语句
其结果如下:
SELECT * FROM DUAL WHERE 1 = ':c' AND 2 = '':c'' AND 3 = ''':c'''
这是因为从最后一个到第一个,一次替换一个参数
我还尝试在单个函数调用中进行替换,使用带有数组参数的str_replace()
,但没有效果
因此,我想知道是否有一种方法可以使这个操作以某种方式“原子化”,这样,如果占位符值是另一个有效占位符,它就不会被替换
编辑:
下面是我的类中进行替换的方法:
protected function prepare() {
if (!$this->db) {
trigger_error (__METHOD__ . ': no Connection available to properly quote the value', E_USER_WARNING);
return false;
}
$this->prepared = str_replace(
array_map(array($this, 'getPlaceholderName'), array_keys($this->params)),
array_map(array($this->db, 'quote'), array_values($this->params)),
$this->original
);
return true;
}
您可能需要使用数组签名对good old进行一次调用: 字符串strtr(字符串$str,数组$replace\u对)
当然,纯字符串替换只是一种技巧,永远无法替换正确的SQL解析器,但我想您已经知道了。这是您想要使用的代码:
$queryString = strtr($queryString, array(":a" => "b",":b"=>"c", ":c" => "a"));
bindValue
只需在内部参数数组中插入一个key=>value对,它不负责字符串中的实际替换,这是通过prepare
方法完成的,我将在我的问题中发布该方法。strtrtr
不是只针对单个字符吗?