Lorsque vous utilisez PHP pour les opérations de base de données, MySQL_FETCH_ASSOC () et MySQL_NUM_ROWS () sont deux fonctions couramment utilisées, qui sont utilisées pour obtenir respectivement les données à ligne unique de l'ensemble de résultats de requête et le nombre de lignes de l'ensemble de résultats respectivement. Habituellement, nous devons combiner ces deux fonctions pour traiter efficacement les résultats de la requête, en particulier dans le scénario où nous avons besoin non seulement de données de requête, mais aussi d'obtenir le nombre de lignes de résultat.
Avant de commencer à discuter de la façon de combiner ces deux fonctions, une brève revue de leurs fonctions.
mysql_fetch_assoc ($ Résultat) : Obtenez une ligne de données à partir du résultat Résultat $ Result et renvoie un tableau associatif où la clé du tableau est le nom de champ et la valeur est la valeur du champ. Chaque fois qu'il est appelé, la ligne suivante de données dans l'ensemble de résultats est renvoyée jusqu'à la lecture des données.
<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) : renvoie le nombre de lignes dans l'ensemble de résultats, c'est-à-dire le nombre de lignes contenues dans le résultat de la requête. Il est généralement utilisé pour déterminer si la requête est réussie et déterminer le nombre total de lignes des données avant ou après avoir obtenu les données.
<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>De nombreux développeurs rencontrent souvent un problème lors de l'utilisation de ces deux fonctions: si mysql_num_rows () est appelé avant d'appeler mysql_fetch_assoc () , alors mysql_num_rows () obtiendra le nombre de lignes dans l'ensemble des résultats, mais après l'appel Mysql_fetch_assoc () , la logique a évolué, donc nous ne pouvons pas obtenir le numéro de Rows de Rows, ce qui a été logique.
Pour résoudre le problème ci-dessus, nous pouvons d'abord appeler mysql_num_rows () pour obtenir le nombre de lignes de l'ensemble de résultats, puis utiliser mysql_fetch_assoc () pour lire la ligne de données par ligne. La clé est de savoir comment gérer la position du curseur (pointeur) du résultat de la requête. Voici plusieurs pratiques courantes et efficaces.
La méthode la plus courante consiste à utiliser mysql_fetch_assoc () pour lire la ligne de données par ligne après avoir obtenu le nombre de lignes du résultat de la requête. L'avantage de cette méthode est que la quantité totale de données peut être déterminée en premier, ce qui facilite le traitement ultérieur.
<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">// Obtenez d'abord le nombre de lignes</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Les résultats de la requête ont <span class="hljs-subst">{$num_rows}</span></span></span><span> Données de ligne。";
</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">// 处理每一Données de ligne</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"nom d'utilisateur: "</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">"<br>"</span></span><span>;
}
</span></span>À l'heure actuelle, mysql_num_rows () calcule d'abord le nombre total de lignes, puis MySQL_Fetch_assoc () lira la ligne de données par ligne. Dans ce cas, puisque le pointeur vers l'ensemble de résultats a déplacé après l'appel MySQL_Fetch_assoc () , le nombre de lignes fourni par MySQL_NUM_ROWS () est utilisé pour afficher le nombre total d'enregistrements et n'est plus lié à l'ordre de lecture de données réel.
Si vous devez calculer le nombre de lignes pendant la traversée des résultats, vous pouvez compter directement dans mysql_fetch_assoc () sans compter sur mysql_num_rows () . Cette approche s'applique à vous qui ne se soucie pas du nombre total de lignes renvoyées par la base de données, mais ne se soucient que du traitement des données.
<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">// Utilisé pour compter</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">// Chaque ligne est lue,Compter un</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">"nom d'utilisateur: "</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">"<br>"</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Les résultats de la requête ont <span class="hljs-subst">{$row_count}</span></span></span><span> Données de ligne。";
</span></span>Dans cette méthode, nous obtenons chaque ligne de données via mysql_fetch_assoc () et la comptons manuellement via une variable $ ROW_COUNT personnalisée, évitant ainsi le fardeau des performances provoqué par plusieurs appels vers MySQL_NUM_ROWS () .
Le calcul du nombre total de lignes peut être un fardeau de performances lorsque vous travaillez avec de très grands ensembles de données. Afin d'améliorer l'efficacité, il est préférable d'éviter de compter le nombre de lignes avant de lire les données, mais de traiter directement les données. Vous pouvez utiliser mysql_fetch_assoc () pour traiter les boucles de données et calculer dynamiquement le nombre de lignes.
<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">// Traitement des données</span></span><span>
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Il y a un total de <span class="hljs-subst">{$row_count}</span></span></span><span> Données de ligne。";
</span></span>L'avantage de cette approche est qu'il peut améliorer considérablement les performances lors du traitement des données directement sans effectuer de calculs supplémentaires, en particulier lors de l'interrogation de grands volumes de données.
Évitez plusieurs appels vers mysql_num_rows () : l'appel vers mysql_num_rows () analysera l'ensemble des résultats, ce qui affectera les performances. Il est préférable de parcourir les données directement via mysql_fetch_assoc () sans nécessiter le nombre total de lignes.
Choisissez un plan en fonction des besoins réels : si vous avez vraiment besoin d'interroger le nombre de lignes, vous pouvez d'abord appeler mysql_num_rows () . Si vous avez juste besoin de traiter chaque ligne de données, vous pouvez les implémenter via mysql_fetch_assoc () et les compter manuellement.
Évitez d'utiliser MySQL_NUM_ROWS () sur de grands ensembles de données : Precalculant le nombre de lignes à l'avance peut apporter des surcharges de performances inutiles lorsque les résultats de la requête sont très importants. La traversée directe des données et le traitement en temps réel est une approche plus efficace.
En utilisant ces deux fonctions raisonnablement, vous pouvez obtenir et traiter plus efficacement les données dans les résultats de la requête, améliorant les performances et la vitesse de réponse du système.