1

ほとんどすべての特定のデータベース機能を抽象化するコマンド クラスがあります (Mssql 2005 (ODBC とネイティブの mssql ライブラリを使用)、MySQL、および Oracle でまったく同じアプリケーションを実行しています。実行され、すべてのプレースホルダーをそれぞれの値に置き換えます.しかし、問題は、私が次のものを使用していることです:

if(is_array($Parameter['Value']))
{
    $Statement = str_ireplace(':'.$Name, implode(', ', $this->Adapter->QuoteValue($Parameter['Value'])), $Statement);
}
else
{
    $Statement = str_ireplace(':'.$Name, $this->Adapter->QuoteValue($Parameter['Value']), $Statement);
}

この問題は、session_browser と session_browse_version のように、2 つ以上の類似したパラメーター名がある場合に発生します。最初のものは最後のものを部分的に置き換えます。

もちろん、特定の順序でパラメーターを指定して回ることを学びましたが、「自由な」時間ができたので、より良くしたいので、preg_replaceに切り替えようと考えています...そして、私は正規表現が苦手です... 、':parameter_name` のような文字列を置き換える正規表現を誰か助けてもらえますか?

よろしく、 ブルーノ・BB・マガリャエス

4

1 に答える 1

2

\b メタ文字を使用して単語の境界を一致させる必要があります。これにより、長いパラメーター名内の短いパラメーター名が誤って一致することがなくなります。

また、スカラー値を 1 つのエントリの配列に強制する場合は、配列を特殊なケースにする必要はありません。

preg_replace("/:$Name\b/", 
    implode(",", $this->Adapter->QuoteValue( (array) $Parameter['Value'] )), 
    $Statement);

ただし、識別子または文字列リテラルにパラメーター プレースホルダーのようなパターンが含まれている場合、これは誤検知の一致になる可能性があることに注意してください。

SELECT * FROM ":Name";

SELECT * FROM Table WHERE column = ':Name';

引用符で囲まれた識別子と文字列リテラルにエスケープされた引用符を含めることができる場合、これはさらに複雑になります。

SELECT * FROM Table WHERE column = 'word\':Name';

準備中に変数を SQL 文字列に補間することを再検討することをお勧めします。これは、セキュリティやパフォーマンスに関して準備済みステートメントの利点を無効にしているからです。

IN()すべての RDBMS バックエンドが名前付きパラメーターをサポートしているわけではなく、述語の値のリストに SQL パラメーターを使用できないため、あなたがしていることを理解しています。しかし、あなたはひどく漏れやすい抽象化を作成しています。

于 2009-09-10T23:33:29.440 に答える