亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 134 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號