preg_replace - 不要更换已更换的部件

给定带有占位符的 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行为?


富国沪深
浏览 103回答 2
2回答

婷婷同学_

您可以使用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);

喵喔喔

我不会用 或 这样做。我会使用,所以空的返回可以被删除(如果有空的删除选项,我会使用它)。因为在那里循环访问返回并添加值。您也可以用这个来引用这些值。我推测这样做的目的是调试参数化查询。preg_replacestr_replacepreg_splitexplode$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'
打开App,查看更多内容
随时随地看视频慕课网APP