<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// コンテンツのこの部分は、記事の主題とは何の関係もありません</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"私へようこそPHP研究メモ!\n"</span></span><span>;
</span><span><span class="hljs-variable">$today</span></span><span> = </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d"</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"今日の日付はです: <span class="hljs-subst">$today</span></span></span><span>\n";
</span></span>
データベース操作にPHPを使用する場合、特に作成されたステートメントにMySQLI拡張機能を使用する場合、パフォーマンスの最適化は見落とされがちです。この記事では、mysqli_stmt :: $ field_countとmysqli_stmt :: bind_resultを組み合わせて、コードの保守性とセキュリティを確保しながらクエリ効率を改善する方法を紹介します。
$ field_countプロパティは、現在のプリプロセシングステートメント結果セットのフィールドの数を返すために使用されます。このプロパティは、SQLクエリが動的に生成される、または無期限のフィールドが必要なシナリオに非常に役立ちます。それを使用して、フィールド名を事前に知らずに結果変数を動的に結合します。
例:
<span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT id, name, email FROM users WHERE status = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"s"</span></span><span>, </span><span><span class="hljs-variable">$status</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-comment">// フィールドの数を取得します</span></span><span>
</span><span><span class="hljs-variable">$fieldCount</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>->field_count;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"このクエリの合計があります <span class="hljs-subst">$fieldCount</span></span></span><span> フィールド。";
</span></span>
$ field_countを使用すると、フィールド名を知らずに結果セットを動的に処理でき、それによりコードの普遍性が向上します。
通常、 bind_resultを使用して各フィールドを手動で結合します。
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$id</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>);
</span></span>
フィールドの数が大きい場合、またはフィールドが変更される場合がある場合、この方法は非効率的でエラーが発生しやすいです。 $ field_countと組み合わせて、動的バインディングを実装できます。
<span><span><span class="hljs-comment">// 結果メタデータを取得します</span></span><span>
</span><span><span class="hljs-variable">$meta</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">result_metadata</span></span><span>();
</span><span><span class="hljs-variable">$fields</span></span><span> = [];
</span><span><span class="hljs-variable">$bindVars</span></span><span> = [];
</span><span><span class="hljs-comment">// フィールドの数に基づいて変数を動的に生成します</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$field</span></span><span> = </span><span><span class="hljs-variable">$meta</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_field</span></span><span>()) {
</span><span><span class="hljs-variable">$fields</span></span><span>[] = </span><span><span class="hljs-variable">$field</span></span><span>->name;
</span><span><span class="hljs-variable">$bindVars</span></span><span>[] = &${</span><span><span class="hljs-variable">$field</span></span><span>->name}; </span><span><span class="hljs-comment">// 引用に注意してください</span></span><span>
}
</span><span><span class="hljs-comment">// 動的結合結果</span></span><span>
</span><span><span class="hljs-title function_ invoke__">call_user_func_array</span></span><span>([</span><span><span class="hljs-variable">$stmt</span></span><span>, </span><span><span class="hljs-string">'bind_result'</span></span><span>], </span><span><span class="hljs-variable">$bindVars</span></span><span>);
</span><span><span class="hljs-comment">// データを取得します</span></span><span>
</span><span><span class="hljs-variable">$results</span></span><span> = [];
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>()) {
</span><span><span class="hljs-variable">$row</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$fields</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$field</span></span><span>) {
</span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-variable">$field</span></span><span>] = ${</span><span><span class="hljs-variable">$field</span></span><span>};
}
</span><span><span class="hljs-variable">$results</span></span><span>[] = </span><span><span class="hljs-variable">$row</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$results</span></span><span>);
</span></span>
このようにして、クエリがいくらのフィールドに戻っても、結果はアレイに効率的に保存され、バインディングコードの手動の変更を回避し、メンテナンスとパフォーマンスを改善できます。
重複コードを削減する:クエリごとにbind_resultを手動で書き込む必要はありません。特に、フィールドが頻繁に変更されるシナリオに適しています。
効率の向上:連想配列とfetch_assoc()の繰り返しの使用を避け、バインディング変数を介してデータを直接取得します。
非常にユニバーサル:SQLクエリを動的に生成したり、データベーステーブルからフィールド名を自動的に取得するために使用できます。
動的バインディングを使用する場合、可変参照( & )に注意を払う必要があります。そうしないと、値を正しく取得できません。
大規模なデータクエリの場合、 bind_resultは、完全な配列を生成するのではなく、データを変数に直接バインドするため、 fetch_assocよりも多くのメモリを保存します。
少数のフィールドのみを照会する場合、手動のbind_resultには明らかなパフォーマンスの違いはありませんが、ダイナミックバインディングは、フィールドが不確実であるか、頻繁にクエリが変更されるシナリオで明らかな利点があります。
mysqli_stmt :: $ field_countとmysqli_stmt :: bind_resultを組み合わせて、効率的で一般的で保守可能な前処理ステートメントクエリソリューションを実現できます。コードの量を減らすだけでなく、大規模なデータボリュームと動的クエリシナリオのパフォーマンスを向上させます。これは、PHP開発でマスターする価値のあるスキルです。