2009-07-22 6 views
3

Il y a quelque temps, je cherchais avec SQLite, essayant de porter certains de mes sites pour l'utiliser au lieu de MySQL. Je me suis accroché à l'absence d'une fonction pour compter les résultats, comme mysql_num_rows() de PHP. Après avoir cherché un peu, j'ai découvert this mail list, qui dit (si je comprends bien) que SQLite n'a pas cette fonctionnalité, car il est inefficace. Il indique que c'est une mauvaise forme d'écrire du code qui a besoin de savoir combien de lignes sont retournées.mysql_num_rows est-il efficace et/ou standard?

J'utilise généralement mysql_num_rows pour vérifier les résultats de retour vides. Par exemple:

$query = "SELECT * FROM table WHERE thing = 'whatever'"; 
$results = mysql_query($query); 

if (mysql_num_rows($results)) { 
    while ($row = mysql_fetch_array($results)) { 
     echo "<p>$row[whatever]</p>"; 
    } 
} else { 
    echo "<p>No results found</p>"; 
} 

Le dégoût véhémente pour le concept de mysql_num_rows() dans la communauté SQLite me demande si elle est terriblement efficace pour que MySQL régulière en PHP.

Existe-t-il un moyen mieux accepté de vérifier la taille d'un ensemble de résultats MySQL en PHP en plus de mysql_num_rows()?

EDIT: Je n'utilise pas simplement mysql_num_rows pour obtenir le nombre - j'utiliserais une requête COUNT pour cela. Je l'utilise pour vérifier s'il y a des résultats avant de tout sortir. C'est utile pour quelque chose comme l'affichage des résultats de recherche - il n'est pas toujours garanti qu'il y aura des résultats. Dans le monde SQLite, je dois envoyer une requête COUNT, vérifier s'il y a quelque chose, puis envoyer une requête SELECT pour obtenir tout.

Répondre

10

Vous avez déjà quelque chose qui vous dit si vous avez des résultats dans mysql_fetch_array(). Il renvoie false s'il n'y a plus de lignes à récupérer (à partir de php.net).

$query = "SELECT * FROM table WHERE thing = 'whatever'"; 
$results = mysql_query($query); 
if($results) { 
    $row = mysql_fetch_array($results); 
    if($row) { 
     do { 
      echo "<p>{$row[whatever]}</p>"; 
     } while($row = mysql_fetch_array($results)); 
    } else { 
     echo "<p>No results found</p>"; 
    } 

} else { 
    echo "<p>There was an error executing this query.</p>"; 
} 
+1

excellent - Je ne savais pas le faux retour de mysql_query. – Andrew

+1

Oui. C'est pourquoi le truc while ($ row = ...) fonctionne. –

0

Que vous utilisiez ou non réellement ce que vous SELECT ed, toutes les lignes sont toujours renvoyées. C'est terriblement inefficace parce que vous êtes en train de jeter les résultats, mais vous faites toujours votre base de données faire tout le travail pour vous. Si tout ce que vous faites est en train de compter, vous faites tout ce traitement pour rien. Votre solution consiste simplement à utiliser COUNT (*). Il suffit d'échanger COUNT (*) où vous auriez votre SELECT déclaration et vous êtes prêt à partir.

Cependant, cela s'applique principalement aux personnes l'utilisant comme un substitut complet pour COUNT. Dans votre cas, l'utilisation n'est pas vraiment mauvaise du tout. Vous devrez juste les compter manuellement dans votre boucle (c'est la solution préférée pour les utilisateurs de SQLite).

La raison en est dans l'API SQLite sous-jacente. Il doesn't return the whole result set à la fois, donc il n'a aucun moyen de savoir combien de résultats il y a.

+0

Je ne compte pas seulement si - je boucle à travers et sortir toutes les lignes sélectionnées, mais seulement si elles existent – Andrew

0

Comme expliqué sur la liste de diffusion que vous avez trouvée. Il est inefficace de renvoyer le nombre de lignes car vous devez allouer beaucoup de mémoire pour contenir l'ensemble des résultats (restants). Ce que vous pouvez faire, c'est simplement utiliser un booléen pour tester si vous avez quelque chose en sortie.

$query = "SELECT * FROM table WHERE thing = 'whatever'"; 
$results = mysql_query($query); 

$empty_result = true; 
while ($row = mysql_fetch_array($results)) { 
    echo "<p>$row[whatever]</p>"; 
    $empty_result = false; 
} 

if ($empty_result) { 
    echo "<p>No results found</p>"; 
}