为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
富国沪深 2022-08-05 18:46:06
给定带有占位符的 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行为?
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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


查看完整回答
反对 回复 2022-08-05
?
喵喔喔

TA贡献1735条经验 获得超5个赞

我不会用 或 这样做。我会使用,所以空的返回可以被删除(如果有空的删除选项,我会使用它)。因为在那里循环访问返回并添加值。您也可以用这个来引用这些值。我推测这样做的目的是调试参数化查询。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'


查看完整回答
反对 回复 2022-08-05
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信