12

私はこれら2つの機能Bindvalue()を混同していますBindParam()

  1. %私は php.net でそれがエスケープしないことを読んだ_ので、使用するときは注意してLIKEください。BindValue()したがって、LIKEクエリを使用している場合は使用されないと思います。
  2. LIKEクエリを使用する場合に使用BindParam()されます。私が知っているように、BindParam はこれら%_.
  3. BindValue()SQL インジェクションに対する保護は提供しません。これについてはよくわかりませんが、本当ですか?

友人は、私がこれらの 3 点で言及したことが正しいか間違っているかを教えてくれます。私はPDOの初心者なので、わかりやすく説明してください..

4

2 に答える 2

52

値をエスケープする方法とエスケープしない方法に違いはないはずです。変数を参照し、ステートメントの実行時にのみ値をバインドするという点でbindParam異なります。すぐにを取ります。説明する:bindValuebindValue

$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');

$foo = 'foo';
$stmt->bindValue(':foo', $foo);
$foo = 'bar';

$stmt->execute();

上記は次のように実行されSELECT * FROM table WHERE foo = 'foo'ます。

$stmt = $db->prepare('SELECT * FROM `table` WHERE foo = :foo');

$foo = 'foo';
$stmt->bindParam(':foo', $foo);
$foo = 'bar';

$stmt->execute()

上記は のように実行されSELECT * FROM table WHERE foo = 'bar'ます。

一般的に言えば、構文に関する限り特殊文字ではなく、データベースドライバーはコンテキストを分析してワイルドカードまたは特殊文字のどちらを意味するの_判断できないため、特殊文字も特殊文字も気にしないのは事実です。クエリのコンテキストにおける実際の文字「%」 。% %LIKE

どちらも SQL インジェクションから保護します。

于 2013-01-19T10:37:04.930 に答える
5

まあ、あなたはそれをすべて間違って受け取りました。

Bindvalue()BindParam()は、引数の型を除いてどちらの方法でも等しいです。

  • Bindvalue() は値のみをバインドします。ハード コピーのようなものです。
  • BindParam() は変数をバインドし、変数が変更されると、バインドされた値も変更されます。

どちらも % と _ をエスケープしませんが、これはあまり問題ではありません。このようなエスケープは、返される結果の信頼性にのみ影響し、「注入」には影響しません。

于 2013-01-19T10:40:06.033 に答える