9

PDOStatement :: bindValue()メソッドは、バインドされた変数のタイプを指定する方法を提供します。

PDOStatement :: bindValue($ parameter、$ value [、$ data_type = PDO :: PARAM_STR ])

データ型を指定する目的は何ですか?デフォルト(PARAM_STR)のままにすると、データベースは最終的に値を使用する前に適切な型にキャストしますか?

たとえば、INTEGERフィールドに対して次のクエリがある場合:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;

そして、PHPで整数をバインドすると、PDOはデフォルトでそれを文字列としてバインドします。これは次のように相当します。

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;

SQLデータベース(少なくともMySQL、他のRDBMSでどのように機能するかはわかりません)は、文字列を使用する前に整数に変換する方法を知っているため、これは問題なく機能します。

バインドされた型付きパラメーターと文字列に違いが生じるユースケースは何ですか?

4

3 に答える 3

7

私はPDOの専門家ではありませんが、data_typeパラメーターが有用であり、必要でさえあるいくつかのシナリオを考えることができます。

出力パラメータ

出力または入出力パラメーターを定義するときは、予想される出力パラメーターのタイプと長さの両方を指定する必要があります。

参照:http ://www.php.net/manual/en/pdo.prepared-statements.php

例4

$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

例5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

暗黙的なキャストのないDBM

この質問に対する別の回答で説明されています...

パラメータがキャスト可能なデータにバインドされていない場合

キャスト機能を備えたデータベースでさえ、変数を正しくキャストできるとは限りません。

参照:PDOでパラメーターを強く入力する理由は?

$limit = 1;

$dbh->prepare("SELECT * FROM items LIMIT :limit");
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
// Will throw "You have an error in your SQL syntax..."
于 2011-09-10T17:20:34.127 に答える
3

これは主に、正しい入力が必要なデータベースとやり取りするためのものです。たとえば、MySQLで厳密モードを有効にすると、タイプの不一致がある場合に警告ではなくエラー(クエリの失敗)が発生します。

デフォルトでは、MySQLはデータを適切に変換するために最善を尽くします。しかし、日付フィールドに0000-00-00が表示されたことがある場合は、mysqlが文字列を日付に変換しようとして失敗した結果である可能性が非常に高くなります。厳密モードでは、変換を試みて結果が何であれ使用する代わりに、クエリは失敗します。

于 2011-09-10T17:01:49.110 に答える
1

PDOStatement :: bindValue()のデータ型パラメーターはそれほど有用ではありません。基本的に:

  • PDO :: PARAM_STRと指定すると、値が文字列に変換されます。
  • PDO :: PARAM_INTと指定し、ブール値を渡すと、longに変換されます。
  • PDO :: PARAM_BOOLと指定し、それを長く渡すと、ブール値に変換されます。

他に何も変換されていないようです。ソースコードの簡単な説明ともう少し良い説明については、ここを参照してください。おそらく最も重要なことは、渡したデータ型と一致しない型のデータを渡した場合でも、PDOが例外をスローしたりエラーを生成したりしないことです。

于 2011-09-10T16:27:48.697 に答える