pdostatement :: bindvalue()の変数タイプをどのように定義しますか?
-
27-10-2019 - |
質問
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、私はそれが他のRDBMでどのように機能するかを本当に知っているわけではないため、それは完璧に機能します。なぜなら、使用する前に文字列を整数に戻す方法を知っているからです。
タイプ付きパラメーターと文字列に違いをもたらすというユースケースは何ですか?
解決
私はPDO-Expertではありませんが、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
この質問に対する別の答えで説明しました...
パラメーターがキャスト可能なデータにバインドされていない場合
キャスト能力を備えたデータベースでさえ、常に変数を正しくキャストできるとは限りません。
$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..."
他のヒント
これは主に、正しいタイピングが必要なデータベースとの対話のためです。たとえば、MySQLで厳密なモードを有効にすると、タイプの不一致があるときに警告の代わりにエラー(失敗したクエリ)が表示されます。
デフォルトでは、MySQLはデータを適切に変換するために最善を尽くします。しかし、日付フィールドで0000-00-00を見たことがあるなら、それはMySQLが文字列を日付に変換して失敗しようとする結果である可能性が非常に高いです。厳密なモードでは、結果が何であれ、変換して使用しようとするのではなく、クエリが失敗します。
pdostatementへのデータ型パラメーター:: bindValue()は、それほど有用ではありません。本質的に:
- pdo :: param_strと言うと、値を文字列に変換します。
- pdo :: param_intを伝え、ブール波を渡すと、それを長い間変換します。
- pdo :: param_boolにそれを長く渡すと、それをブール値に変換します。
他に変換されているようには見えません。見る ここ ソースコードをすばやくご覧ください。おそらく最も重要なことは、PDOが例外をスローしたり、渡されたデータ型と一致しないタイプでデータを渡す場合、エラーを作成したりしないことです。