给出带有占位符的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行为?
我不会使用preg_replace
或str_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'
您可以使用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);
让我知道