PHP中的原子字符串替换

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'); $

在我们的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');
$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
不是只针对单个字符吗?