毎日の開発では、MySQLデータベースから結果セットを取得し、結果セットをトラバースする必要があることがよくあります。デフォルトでは、 mysqli_queryによって返される結果セットはクエリ順序で保存されます。結果セットが必要な場合は、それを行う方法がいくつかあります。シンプルで効率的な方法の1つは、PHPのmysqli_result :: data_seek関数を使用することです。
mysqli_result :: data_seekは、PHPが提供するメソッドであり、開発者が結果の内部ポインターを指定された行に移動できるようにします。基本的な使用法は次のとおりです。
<span><span>mysqli_result::</span><span><span class="hljs-title function_ invoke__">data_seek</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span>): </span><span><span class="hljs-keyword">bool</span></span><span>
</span></span>$ offsetは、 0から始まるターゲット行のインデックスを表します。
リターン値はブールタイプです。真が正常に返されると、falseが失敗した場合にfalseが返されます。
結果を逆方向に移動したい場合、最も直接的な方法は、SQLクエリで... DESCで順序を使用せずに、結果セットの最後の行から前方に読み取ることです。これにより、特にデータボリュームが非常に大きい場合は、データベースの圧力を軽減できます。
フィールドIDと名前を含むMySQLテーブルユーザーがいると仮定し、ユーザーリストを逆の順序で出力したいとします。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"接続に失敗しました: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT id, name FROM users"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>) {
</span><span><span class="hljs-variable">$num_rows</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>->num_rows;
</span><span><span class="hljs-comment">// 逆注文トラバーサル結果セット</span></span><span>
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-variable">$num_rows</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> >= </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>--) {
</span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">data_seek</span></span><span>(</span><span><span class="hljs-variable">$i</span></span><span>); </span><span><span class="hljs-comment">// 内部ポインターをに移動します $i わかりました</span></span><span>
</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">", Name: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">free</span></span><span>();
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"クエリに失敗しました: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error;
}
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>$ result-> num_rowsは、結果セットの総数を取得します。
forループは、最後の行$ num_rows -1から始まり、段階的に前進します。
$ result-> data_seek($ i)を使用して、指定された行を見つけます。
$ result-> fetch_assoc()を呼び出して、現在の行データを取得します。
この方法では、SQLクエリ順序を変更する必要はなく、トラバーサル順序を動的に制御するいくつかのシナリオで非常に役立ちます。
アドバンテージ:
シンプルで使いやすい、PHPレベルでのトラバーサル順序を直接制御します。
小さな結果セットには非常に効率的です。
注:
大規模な結果セットの場合、メモリ消費が高すぎる場合、SQLレイヤーで並べ替えるために順序を使用することをお勧めします。
data_seekは、 mysqli_queryによって返されるmysqli_resultオブジェクトにのみ適用され、バッファーされていないクエリには適用されません。
mysqli_result :: data_seekを使用すると、SQLのソート関数に依存せずに、結果セットの逆方向トラバーサルを簡単に実装できます。 PHP開発者に、より柔軟な制御方法を提供します。特に、クエリの結果が動的に処理されるシナリオに適しています。
関連タグ:
mysqli_result