1

テーブル名とフィールド名に自動的にバッククォートを付けようとすると、 str_replaceに問題が発生します。

次の配列があると仮定します。

$match = array('rooms.roomID','r_rooms.roomID');
$replace = array('`rooms`.`roomID`','`r_rooms`.`roomID`');
$subject = 'rooms.roomID = r_rooms.roomID';

str_replace($match,$replace,$subject);

私が期待する結果は次のとおりです。

`rooms`.`roomID` = `r_rooms`.`roomID`

しかし、代わりに私はこれを得ています:

`rooms`.`roomID` = r_`rooms`.`roomID`

ただし、r_roomsr_oomsに変更すると、結果は期待どおりになります

`rooms`.`roomID` = `r_ooms`.`roomID`

preg_replaceを使用して同じ手順を試しましたが、これでも同じ出力が得られます。

4

2 に答える 2

3

クイックフィックスは、このような並べ替え$match$replace配列です...

$match = array('r_rooms.roomID', 'rooms.roomID');
$replace = array('`r_rooms`.`roomID`', '`rooms`.`roomID`');

元のアプローチの問題は、各ステップで文字列全体をカバーしようとして配列要素を要素ごとにstr_replace処理し、見つかった部分をすぐに置き換えることです。$match

文字列はとrooms.roomIDの両方に「一致」し、それに応じてこれらを置換するため、2 回目の反復は何もしません。[rooms.roomID]r_[rooms.roomID]


私が言ったように、それはただの簡単な修正です。この場合preg_replace、代わりに使用して、実際の検索を\b(単語境界アンカー) で囲みます。

繰り返しになりますが、ここで XY 問題の匂いがします。のためにあなた自身のルーチンを作ろうとしていませんquoteIdentifierか?それはすでに解決されています(そしてここで何度も尋ねました)。

于 2013-05-14T17:12:58.610 に答える
1

正しいです。最初に置き換えられる値は、rooms.roomID からroomsです。roomID(2 回) $match テーブルと $replace テーブルの順序を変更して、期待どおりの結果を得る

$match = array('r_rooms.roomID','rooms.roomID');
$replace = array('`r_rooms`.`roomID`','`rooms`.`roomID`');
于 2013-05-14T17:13:34.007 に答える