2009-05-07 10 views
28

私は意味のために...PHP PDO :: bindParam()データ型..どのように動作しますか?

bindParam()(またはbindValue())でのデータ型の宣言が使用されているものを思ったんだけど、私は整数の引数(PDO::PARAM_INT)を定義した場合、引数を変換しなければならないと思いました

$delete->bindParam(1, $kill, PDO::PARAM_INT); 
// should work like 
$delete->bindParam(1, (int)$kill); 

のようなものです。引数が宣言された型でない場合は、少なくともエラーをスローします。しかし、そうではありません。周りグーグル

、私はphp.netアーカイブにことがわかった:

こんにちはすべて、

私は現在、PDOに取り組んでいます。 bindParam()関数のまさに です。第3の パラメータのdata_typeはここにあるようです 値のタイプを強制的にしますか?しかし 、私は試してみてください。

$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)"; 
$stmt = $dbh->prepare($sql); 
$nom = 'Testarossa'; $marque = 'Ferrari' ; 
$stmt->BindValue(':marque',$marque) ; 
$stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ; 

$stmt->execute(); $nom = '250 GTO' ; 
$stmt->execute(); ?> 

は、私はPHP エラーや私のデータベース内intergerのいずれかを持っている期待していました。 しかし、私は持っている私のDBに:

22・テスタロッサフェラーリ23 250 GTO フェラーリ

それは私が三番目のパラメータを持っているか、いない 場合、それは変化しなかったことを意味します。または おそらく私は何かが恋しい。誰かが 私をより多くトールできますか?または誰かが 私に情報を見つけることができる場所に教えてください 。まさに私の状況です

よろしく、

Cyruss

。私の考えはどこが間違っていますか?

+1

"私のデータベースにはPHPエラーかintergerがあるはずです。"私も – VolkerK

答えて

30

数字が適切にバイナリパックされていることを確認することで、ネットワークの効率を向上させることができます。それはPDOのように見えますが、それほど多くはありません。

if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) { 
       if (Z_TYPE_P(param->parameter) == IS_DOUBLE) { 
         char *p; 
         int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter)); 
         ZVAL_STRINGL(param->parameter, p, len, 0); 
       } else { 
         convert_to_string(param->parameter); 
       } 
     } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) { 
       convert_to_long(param->parameter); 
     } else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) { 
       convert_to_boolean(param->parameter); 
     } 

だから、あなたが言うならば、それはSTR(またはあなたが何も言わない場合にすべてのことがデフォルトとして)し、データの内部型は、それが一つの方法を使用して、文字列にそれを向けるだろう、その後、二重です、二重でなければ、別のメソッドを使用して文字列に変換します。

intと言ってもそれは本当にブールですが、それはlongに変換されます。

あなたがブールだと言うなら、それは実際には数字ですし、真のブール値に変換します。

これは本当にstmtソースを見て(すばやく)見ただけですが、ドライバにパ​​ラメータを渡すと追加の魔法をやることができます。だから、私はあなたが得ることは、ドライバー間の行動のあいまいさとばらつきの権利と全部を少しだけ行うことだと思います。

+1

Doh、私は忍者を投稿しました。私はちょうどゆっくりと答えますね^^。 – gradbot

+0

くそー、私はそれが脱出したと思った。 /ホームを実行してコードを修正する。 –

+0

ああ、私はhttp://php.net/manual/en/pdo.prepared-statements.phpを見つけました。 –

5

少なくとも一つの効果PDOがあります:: PARAM_INTはINSERTクエリにあります。ブール値が

$i = true; 
$stmt->bindParam(':i', $v, PDO::PARAM_INT);

pdo_stmt.cに0または1のように変換されます:

else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) { 
     convert_to_long(param->parameter); 
}

+1

ああ..私はこの効果が本当に有用かどうか疑問に思っています..他のdata_typeSはどうですか?文字列など? – Strae

+0

これらの機能に関する信頼性の高いドキュメントは見つかりませんでした。したがって、私は/ ext/pdo *内のすべてのコードを調べることができます。または単にINSERT、UPDATE ...クエリのためにそのパラメータに依存しないでください。 – VolkerK

+0

[OK]を、私はSELECTクエリで試して '問題'のあまりにもそれらを確認するかを試してみましょう... とにかく、DATA_type宣言は、INSERTクエリの墨塗り/フロー制御のためにも役立つだろう。 – Strae

3

私は同じことを試してみましたBindValueと同じ結果が得られますので、表示される動作はbindParamに限定されません。それはあなたが(適切なバインドパラメータをサポートしていないドライバーのための)でライニング値のための適切なエスケープ処理を行うと、向上している作るようなもののために使用することができる他の言語で他のDB抽象化フレームワークで

$stmt->BindValue(':marque', $marque) ; 
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ; 

$stmt->execute(); 
$nom = '250 GTO'; 
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ; 
$stmt->execute(); 
19

私はPHPのソースコードに飛び込むことにしました。これが私が見つけたものです。バージョン5.2.9

if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) { 
    if (Z_TYPE_P(param->parameter) == IS_DOUBLE) { 
     char *p; 
     int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter)); 
     ZVAL_STRINGL(param->parameter, p, len, 0); 
    } else { 
     convert_to_string(param->parameter); 
    } 
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) { 
    convert_to_long(param->parameter); 
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) { 
    convert_to_boolean(param->parameter); 
} 

のライン329上のEXT/PDO/pdo_stmt.cで

static int really_register_bound_paramこれらは結合間にPDOが行う変換があります。

  • PDO :: PARAM_STRは、与えられたものをnull以外の文字列に変換します。
  • PDO :: PARAM_INTは
  • PDO :: PARAM_BOOLはbools

これだけですにlong型に変換long型にboolsを変換します。それ以外は変換されません。 PDOはPARAMフラグを使用してデータ型を変換しないようにSQLを書式設定します。

+0

"PDO :: PARAM_STRは、あなたが与えたものを文字列に変換する" NULL –

関連する問題