現在の位置: ホーム> 最新記事一覧> クエリの行の数を効率的に取得する方法は、mysql_fetch_assocおよびmysql_num_rows関数と組み合わせて組み合わせていますか?ベストプラクティス共有

クエリの行の数を効率的に取得する方法は、mysql_fetch_assocおよびmysql_num_rows関数と組み合わせて組み合わせていますか?ベストプラクティス共有

gitbox 2025-09-28

データベース操作にPHPを使用する場合、 mysql_fetch_assoc()mysql_num_rows()は、クエリ結果セットの単一行データと結果セットの行数をそれぞれ取得するために使用される2つの一般的に使用される関数です。通常、これら2つの機能を組み合わせて、特にクエリデータだけでなく、結果行の数も取得するシナリオで、クエリ結果を効率的に処理する必要があります。

1. mysql_fetch_assoc()およびmysql_num_rows()の基本的な使用

これらの2つの機能を組み合わせる方法について議論する前に、それらの機能の簡単なレビューです。

  • MySQL_FETCH_ASSOC($ result) :結果をset set $ setからデータの行を取得し、配列のキーがフィールド名であり、値がフィールドの値である連想配列を返します。それが呼び出されるたびに、結果セットの次のデータの行は、データが読み取られるまで返されます。

     <span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
    </span></span>
  • mysql_num_rows($ result) :結果セットの行数、つまりクエリ結果に含まれる行数を返します。通常、クエリが成功しているかどうかを判断し、データの取得前または後にデータの総数を決定するために使用されます。

     <span><span><span class="hljs-variable">$num_rows</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_num_rows</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
    </span></span>

2。一般的な誤った使用法

Many developers often encounter a problem when using these two functions: if mysql_num_rows () is called before calling mysql_fetch_assoc () , then mysql_num_rows () will get the number of rows in the entire result set, but after calling mysql_fetch_assoc() , the result pointer has moved downward, so we cannot get the number of rows again, resulting in a logical error.

3.行数とデータを効率的に取得するにはどうすればよいですか?

上記の問題を解決するために、まずmysql_num_rows()を呼び出して結果セットの行数を取得し、次にmysql_fetch_assoc()を使用して行ごとにデータを読み取ります。キーは、クエリ結果のカーソル(ポインター)位置を管理する方法です。いくつかの一般的で効率的なプラクティスがあります。

1.最初に行数を計算してから、結果セットを通過します

最も一般的な方法は、クエリ結果の行の数を取得した後、 mysql_fetch_assoc()を使用して行ごとにデータ行を読み取ることです。この方法の利点は、最初にデータの総量を決定できることです。これにより、後続の処理が容易になります。

 <span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_query</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);

</span><span><span class="hljs-variable">$num_rows</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_num_rows</span></span><span>(</span><span><span class="hljs-variable">$result</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">"クエリの結果はあります <span class="hljs-subst">{$num_rows}</span></span></span><span> ラインデータ。";

</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$result</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">"ユーザー名: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">"&lt;br&gt;"</span></span><span>;
}
</span></span>

この時点で、 mysql_num_rows()は最初に行の総数を計算し、次にmysql_fetch_assoc()が行ごとにデータを読み取ります。この場合、 mysql_fetch_assoc()を呼び出した後に結果セットへのポインターが移動したため、 mysql_num_rows()が提供する行の数は、レコードの総数を表示するために使用され、実際のデータ読み取り順序に関連しなくなります。

2。mysql_fetch_assoc ()を使用してデータを取得してカウントします

結果の移動中に行数を計算する必要がある場合は、mysql_num_rows ()に依存せずにmysql_fetch_assoc )に直接カウントできます。このアプローチは、データベースによって返される行の総数を気にしないが、データの処理のみに関心があるお客様に適用されます。

 <span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_query</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);

</span><span><span class="hljs-variable">$row_count</span></span><span> = </span><span><span class="hljs-number">0</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">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>)) {
    </span><span><span class="hljs-comment">// 各行は読み取られます,1つをカウントします</span></span><span>
    </span><span><span class="hljs-variable">$row_count</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">$row</span></span><span>[</span><span><span class="hljs-string">'username'</span></span><span>] . </span><span><span class="hljs-string">"&lt;br&gt;"</span></span><span>;
}

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"クエリの結果はあります <span class="hljs-subst">{$row_count}</span></span></span><span> ラインデータ。";
</span></span>

この方法では、 mysql_fetch_assoc()を介して各データを取得し、カスタム$ row_count変数を介して手動でカウントするため、 mysql_num_rows()への複数の呼び出しによって引き起こされるパフォーマンスの負担を回避します。

3。大規模なデータセットを効率的に処理します(事前に行の総数を計算しないでください)

非常に大きなデータセットで作業する場合、行の総数を計算することは、パフォーマンスの負担になる可能性があります。効率を向上させるには、データを読む前に行数をカウントしないようにすることをお勧めしますが、データを直接処理することをお勧めします。 mysql_fetch_assoc()を使用してデータループを処理し、行数を動的に計算できます。

 <span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_query</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);

</span><span><span class="hljs-variable">$row_count</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mysql_fetch_assoc</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>)) {
    </span><span><span class="hljs-variable">$row_count</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">"合計があります <span class="hljs-subst">{$row_count}</span></span></span><span> ラインデータ。";
</span></span>

このアプローチの利点は、特に大量のデータ量を照会する場合、追加の計算を実行せずにデータを直接処理するときにパフォーマンスを大幅に改善できることです。

4。概要

  1. mysql_num_rows()への複数の呼び出しを避けますmysql_num_rows()への呼び出しは、結果セット全体をスキャンしてパフォーマンスに影響します。行の総数を必要とせずに、 mysql_fetch_assoc()を介してデータを直接通過することが最善です。

  2. 実際のニーズに応じてプランを選択します。実際に行数を照会する必要がある場合は、最初にmysql_num_rows()に電話することができます。データの各行を処理する必要がある場合は、 mysql_fetch_assoc()を介して実装し、手動でカウントできます。

  3. 大規模なデータセットでMySQL_NUM_ROWS()を使用しないでください。クエリの結果が非常に大きい場合、行数を事前に行数を事前に行うと、不必要なパフォーマンスオーバーヘッドが得られる場合があります。データを直接移動し、リアルタイムで処理することは、より効率的なアプローチです。

これら2つの機能を合理的に使用することにより、クエリの結果のデータをより効率的に取得して処理し、システムのパフォーマンスと応答速度を改善できます。