php pdoのPDOStatementクラスのbindParamメソッドとbindValueメソッドの違い
PDOStatement クラスの 2 つのメソッドの具体的な説明は次のとおりです
bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )<pre name="code" class="php">bool PDOStatement::bindValue ( mixed $parameter , mixed $value [, int $data_type = PDO::PARAM_STR ] )
違い 1:bindParam は指定された変数名にパラメーターをバインドすること、bindValue は値をパラメーターにバインドすることです
<pre name="code" class="php">$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); //$st->bindValue(1,$id,PDO::PARAM_INT);
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $st->bindParam(1,1,PDO::PARAM_INT); //$st->bindValue(1,1,PDO::PARAM_INT);
bindParam は次のエラーを報告しますが、bindValue は正常に実行できます
Fatal error: Cannot pass parameter 2 by reference
違い 2: PDOStatement::bindValue() とは異なり、PDOStatement::bindParam() の変数は参照としてバインドされ、PDOStatement::execute() でのみ呼び出されます。値は
の場合にのみ取得されます。$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindParam(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('select * from tabletest where id = ?'); $id = 1; $st->bindValue(1,$id,PDO::PARAM_INT); $id = 2; $st->execute(); $rs = $st->fetchAll(); print_r($rs);
しかし、bindValue を使用して変数をバインドした後、execute を実行する前に変数の値を変更しても、結果は変わりません。たとえば、上記の例では、$id を 2 に変更しても、bindValue は変数への参照にバインドされておらず、変数として変化しないため、最終的な実行結果は $id = 1 の結果を出力します。変化します。
どちらも SQL パラメーターのバインドを完了できますが、実際のアプリケーションでは、この 2 つにはまだ違いがあります。ここでは、bindParam の不適切な使用例を示します
データ テーブルがあるとします。シェーピングあり ID と文字列名の 2 つのフィールドがあり、前処理を使用して挿入できるデータの配列 $params = array(1,'Zhang San') があり、具体的なコードは次のとおりです
$db = new PDO('mysql:host=localhost;dbname=dbtest;charset=utf8','user','pass'); $st = $db->prepare('insert into tabletest(id,name) values(?,?)'); $params = array(1,'张三'); foreach($params as $k => $v){ $index = $k + 1; $st->bindParam($index,$v); } $st->execute();
insert into tabletest(id,name) values(1,'张三');
insert into tabletest(id,name) values('男','男');
その理由は、bindParamの変数が参照としてバインドされているため、各フィールドに挿入された値が最後のフィールドの値になるためです。現時点では、bindValue を使用すると、この問題は発生しません。この例で説明する必要があるもう 1 つの点は、疑問符プレースホルダーをインデックス配列と組み合わせて使用する場合、bindValue のパラメーター識別子 (このメソッドの最初のパラメーター) に特別な注意を払う必要があることです。デフォルトでは 0 から、bindValue パラメータの識別子は 1 から始まります。インデックス配列の添え字 0 を直接挿入すると、プログラムがエラーを報告するため、使用する場合は注意が必要です。
上記は、PHP PDO の PDOStatement クラスの bindingParam メソッドと bindingValue メソッドの違いを、関連する内容も含めて紹介しています。PHP チュートリアルに興味のある友人に役立つことを願っています。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。
