ホームページ  >  記事  >  バックエンド開発  >  PHP PDOStatement:bindParam 挿入データエラーの問題分析_PHP チュートリアル

PHP PDOStatement:bindParam 挿入データエラーの問題分析_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:25:16778ブラウズ

早速、コードを直接見てみましょう:

コードをコピーします コードは次のとおりです:

$dbh = new PDO('mysql:host=localhost;dbname=test) ', "テスト") ;

$query = << INSERT INTO `user` (`username`, `password`) VALUES (:username, :password);
QUERY;
$statement = $dbh->prepare ($query);

$bind_params = array(':username' => "laruence", ':password' => "weibo");
foreach( $bind_params as $key = > $value ){
$statement->bindParam($key, $value);
}
$statement->execute();

すみません、最後に実行された SQL ステートメントは何ですか?上記のコードに問題はありますか?
OK、ほとんどの学生は、最後に実行される SQL は次のようになると思います:
INSERT INTO `user` (`username`, `password`) VALUES ("laruence", "weibo");
しかし、残念ながら、あなたは間違っています。はい、最後に実行される SQL は次のとおりです:
INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");
これは大きな落とし穴ですか?
これ今日の質問です バグレポート: #63281
その理由は、bindParam と bindingValue の違いは、bindParam では 2 番目のパラメーターが参照変数 (reference) である必要があることです。
上記のコードの foreach を逆アセンブルしてみましょう。このforeach:
コードをコピー コードは次のとおりです:

foreach( $bind_params as $key => $value ){
$statement->bindParam($key, $value) ;
}

は以下と同等です:
コードをコピー コードは次のとおりです:

//最初のループ
$value = $bind_params[":username" ];
$statement ->bindParam(":username", &$value); //このとき、:usernameは$value変数への参照です

//2番目のループ
$value = $bind_params[ ":password"]; //おっと!$value は:password
$statement->bindParam(":password", &$value);

の値に上書きされるため、bindParam を使用する場合は特に注意してください。 foreach と組み合わせて使用​​する場合、このトラップは何ですか?
1. foreach を使用せず、手動で値を割り当てます
コードは次のとおりです。 $statement->bindParam(":username ", $bind_params[":username"]); //$value は参照変数です$statement->bindParam(":password", $bind_params [":password"]);

2.bindParam の代わりに、bindValue を使用するか、パラメータ配列全体を実行で直接渡します。
3.foreach と参照を使用します (推奨されません)


コードをコピーします

コードは次のとおりです:
foreach( $bind_params as $key => &$value ) { //ここに注意してください $statement->bindParam($key, $value);
}


最後に、パラメータを参照する必要があり、遅延がある関数については、foreach を使用するときに注意してくださいと展開します。


http://www.bkjia.com/PHPjc/825167.html
www.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/825167.html技術記事早速、コードを見てみましょう。 コードを次のようにコピーします。 ?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test"); $query = QUERY INSERT INTO `user ` (`ユーザー名`、`パスワード...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。