PHPにMySQLI拡張機能を使用する場合、開発者はしばしばデータベースと対話する必要があります。 MySQLIは、SQLクエリを実行するためのさまざまな機能を提供します。ここでは、 MySQLI_STMT :: Store_Resultはクエリ結果セットを取得するための重要な関数です。この記事では、使用シナリオ、必需品、およびmysqli_stmt :: store_resultを呼び出す必要がある場合を詳細に分析します。
MySQLIでは、SQLクエリを実行した後、 MySQLI_STMTオブジェクトを介して結果を取得できます。具体的には、クエリが実行された後、結果はサーバーのメモリに保存されます。デフォルトでは、MySQLIはクライアント側のバッファリングを使用してクエリ結果を保存します。ただし、このアプローチは、結果を1回だけクエリする単純なクエリに適しています。データに繰り返しアクセスする必要がある場合、または大規模なデータセットを使用して作業する場合、MySQLIはStore_Resultメソッドを提供して、結果をクライアントメモリに明示的にキャッシュします。
mysqli_stmt :: store_resultは、 mysqliがサーバーからクライアントへの実行されたクエリの結果をキャッシュするために提供される関数です。つまり、この関数を呼び出した後、開発者はサーバーのカーソルメカニズムに依存することなくラインごとに読み取ることができますが、局所的に動作し、サーバーによって制限されなくなることを意味します。
store_resultを呼び出した後、すべての結果ラインはメモリに保存され、開発者は結果に複数回アクセス、処理、およびトラバースクエリを実行できます。
次のシナリオでは、 mysqli_stmt :: Store_resultを呼び出す必要があります。
クエリを実行し、結果セットに複数回アクセスする必要がある場合、 store_resultを使用することが不可欠です。 store_resultを呼び出すことなく、結果セットにアクセスするたびにサーバーに依存して[列ごとにデータ]を取得します。これは、特に大量のデータを処理する場合に効率に影響します。
たとえば、クエリの結果をループで複数回処理する必要がある場合、 Store_Resultを呼び出すと、すべてのデータがメモリにロードされ、複数回アクセスできることが保証されます。
<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 FROM users"</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">store_result</span></span><span>(); </span><span><span class="hljs-comment">// 電話する必要があります store_result</span></span><span>
</span><span><span class="hljs-comment">// これで、結果セットへの複数のアクセス</span></span><span>
</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-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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: <span class="hljs-subst">$id</span></span></span><span>, Name: </span><span><span class="hljs-subst">$name</span></span><span>\n";
}
</span></span>クエリが複数の行または列を返すと、 store_resultを使用すると、すべてのデータがキャッシュされ、ローカルで効率的に処理できるようになります。 store_resultが呼び出されない場合、データは線ごとにのみ取得でき、処理プロセスは遅く複雑になります。
ページングクエリに制限またはオフセット句を使用する場合、 store_resultの呼び出しはすべての結果行をメモリに保存します。これにより、クエリ(ページネーションディスプレイなど)で複数の操作を実行する必要がある場合でも、結果セットに簡単にアクセスして処理できます。
<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 FROM users LIMIT 10 OFFSET 20"</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">store_result</span></span><span>();
</span></span>場合によっては、クエリ結果セットが非常に大きい場合、データベースサーバーは、すべてをメモリにロードする代わりに、一時ファイルにデータの一部を保存する場合があります。 Store_Resultを呼び出すことにより、すべての結果がメモリにロードされていることを確認し、サーバー側のキャッシュ制限を回避できます。
MySqliは、デフォルトでカーソルメカニズムを使用して、Query Results Row by Lineを取得します。 Store_Resultが呼び出されず、結果セットを通過するプロセス中にクエリ接続が閉じられている場合、データの損失が発生する可能性があります。したがって、 store_resultを呼び出すことは、クエリの結果が完全でデータが失われないようにするための重要なステップです。
一部のMySQL構成(クライアントバッファリングの無効化など)は、デフォルトのクエリ結果処理に影響を与える可能性があります。この場合、 Store_Resultを呼び出すことでコードの互換性と移植性が保証され、サーバーの構成が異なるため、一貫性のないクエリ動作が回避されます。
store_resultは重要ですが、すべてのクエリと呼ばれる必要はありません。クエリを一度だけ実行し、1行または少数の結果を読み取る必要がある場合は、この手順を完全にスキップできます。たとえば、選択したクエリを実行して、返されたシングルラインの結果にのみ焦点を合わせるか、 bind_resultとfetchを介して行ごとにデータを取得する場合は、 store_resultを呼び出す必要はありません。
<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 name FROM users WHERE id = ?"</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">"i"</span></span><span>, </span><span><span class="hljs-variable">$user_id</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_result</span></span><span>(</span><span><span class="hljs-variable">$name</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-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$name</span></span><span>;
</span></span>この場合、MySQLIは、 store_resultを手動で呼び出すことなく、結果セットを自動的に処理します。
Calling Store_Resultはすべての結果を一度にクライアントメモリにロードするため、大規模なデータセットの場合、メモリの消費量が増加する可能性があります。クエリが非常に大量のデータを返している場合、 store_resultを使用すると、パフォーマンスの劣化やメモリオーバーフローさえも引き起こす可能性があります。この場合、ストリーミングを使用して、結果セット全体をキャッシュする代わりに、データ( mysqli_stmt :: bind_resultやfetchなど)を取得することをお勧めします。
mysqli_stmt :: store_resultは、mysqli拡張機能の非常に便利な機能であり、主にサーバーからクライアントへのクエリの結果をキャッシュするために使用されます。複数の行または列を含むクエリ結果やパジネートクエリなど、複数のアクセスなどのシナリオで重要な役割を果たします。それにもかかわらず、開発者は実際の状況に基づいてそれを呼び出すかどうかを決定する必要があります。なぜなら、より小さなデータセットまたは単一のクエリの場合、MySQLIは結果セットを自動的に処理し、 Store_Resultを呼び出すことは必ずしも必要ではありません。この機能とそのパフォーマンスへの影響をいつ使用するかを理解することで、効率的で保守可能なデータベースアクセスコードの記述に役立ちます。
関連タグ:
mysqli_stmt