preg_replace-请勿在已更换的零件中更换

问题描述 投票:-1回答:2

给出带有占位符的SQL查询:

SELECT * FROM table WHERE `a`=? AND `b`=?

和查询参数['aaa','bbb'],我想将?占位符替换为相应的参数。所以,我这样做:

$sql = preg_replace(array_fill(0, count($params), '#\?#'), $params, $sql, 1);

((在此问题中,我们不专心于mysql的转义,引用等)。

一切正常,我知道

SELECT * FROM table WHERE `a`=aaa AND `b`=bbb

但是如果我们的第一个参数看起来像这样:“?aa”,那么一切都会失败:

SELECT * FROM table WHERE `a`=bbba AND `b`=?

显然,第一次替换通过更改为“ a =?”变成“ a =?aa”,第二遍将这个(刚刚插入的)问号变成“ bbb”。

问题是:如何绕开这种令人困惑的preg_replace行为?

php preg-replace
2个回答
0
投票

我不会使用preg_replacestr_replace执行此操作。我将使用preg_split,以便可以删除空的回报(如果explode具有空的删除选项,我会使用该选项)。为此,迭代返回并添加值。您也可以使用此引用值。我想这是为了调试参数化查询。

$sql = 'SELECT * FROM table WHERE `a`=? AND `b`=?';
$v = array('1?1', "222");
$e = preg_split('/\?/', $sql, NULL, PREG_SPLIT_NO_EMPTY);
$c = '';
foreach($e as $k => $v1){
    $c .= $v1 . "'" . $v[$k] ."'"; 
}
error_log($c);

然后您的错误日志将具有:

SELECT * FROM table WHERE `a`='1?1' AND `b`='222'

0
投票

您可以使用preg_replace_callback一次使用$params中的一项来进行替换。

$sql = 'SELECT * FROM table WHERE `a`=? AND `b`=?';
var_dump('Original: ' . $sql);
$params=['aaa','bbb'];

$sql = preg_replace_callback("/\\?/",function($m) use (&$params) {
    return array_shift($params);
}, $sql);

var_dump('Result: ' . $sql);

让我知道

© www.soinside.com 2019 - 2024. All rights reserved.