2009-07-22 9 views
3

Vor einiger Zeit stöberte ich mit SQLite herum und versuchte, einige meiner Seiten zu portieren, um sie anstelle von MySQL zu verwenden. Ich habe auf das Fehlen einer Funktion zum Zählen der Ergebnisse, wie PHP mysql_num_rows() hängen. Nachdem ich etwas gesucht hatte, entdeckte ich this mail list, was (wie ich es verstehe) sagt, dass SQLite diese Funktionalität nicht hat, weil es ineffizient ist. Es besagt, dass es eine schlechte Form ist, Code zu schreiben, der wissen muss, wie viele Zeilen zurückgegeben werden.Ist mysql_num_rows effizient und/oder Standard-Praxis?

Ich verwende allgemein mysql_num_rows, um auf leere Rückkehrergebnisse zu überprüfen. Zum Beispiel:

$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>"; 
} 

Die heftige Abneigung gegen den Begriff der mysql_num_rows() in der SQLite-Gemeinschaft macht mich fragen, ob es das schrecklich effizient für regelmäßige MySQL in PHP ist.

Gibt es einen besseren, akzeptierten Weg zur Überprüfung der Größe eines MySQL-Ergebnissatzes in PHP neben mysql_num_rows()?

EDIT: Ich verwende nicht nur mysql_num_rows, um die Anzahl zu bekommen - ich würde eine COUNT Abfrage dafür verwenden. Ich benutze es, um zu prüfen, ob es Ergebnisse gibt, bevor alles ausgegeben wird. Dies ist nützlich für die Anzeige von Suchergebnissen - es ist nicht immer garantiert, dass Ergebnisse angezeigt werden. In SQLite-Welt muss ich eine COUNT Abfrage senden, überprüfen, ob es etwas gibt, und dann eine SELECT Abfrage senden, um alles zu bekommen.

Antwort

10

Sie haben schon etwas, was man sagt, wenn Sie die Ergebnisse in mysql_fetch_array() haben. Es gibt false zurück, wenn keine weiteren Zeilen mehr abzurufen sind (von 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 existieren - ich nicht über die falsche Rückkehr von mysql_query nicht kannte. – Andrew

+1

Ja. Deshalb funktioniert das while ($ row = ...). –

0

Unabhängig davon, ob Sie tatsächlich verwenden, was Sie SELECT ed, alle Zeilen werden immer noch zurückgegeben. Das ist furchtbar ineffizient, weil Sie die Ergebnisse einfach wegwerfen, aber Sie machen immer noch Ihre Datenbank die ganze Arbeit für Sie erledigen. Wenn du nur zählst, machst du die ganze Verarbeitung für nichts. Ihre Lösung ist einfach zu verwenden COUNT (*). Tauschen Sie einfach COUNT (*) in, wo Sie Ihre SELECT Aussage haben würden, und Sie sind gut zu gehen.

Dies gilt jedoch meistens für Personen, die es als vollständigen Ersatz für COUNT verwenden. In deinem Fall ist die Nutzung nicht wirklich schlecht. Sie müssen sie nur manuell in Ihrer Schleife zählen (dies ist die bevorzugte Lösung für SQLite-Benutzer).

Der Grund dafür liegt in der zugrunde liegenden SQLite-API. Es doesn't return the whole result set auf einmal, so hat es keine Möglichkeit zu wissen, wie viele Ergebnisse es gibt.

+0

Ich zähle nicht nur obwohl - ich Schleifen und zum Ausgeben alle ausgewählten Zeilen, aber nur, wenn sie – Andrew

0

Wie auf der Mailing-Liste erläutert, die Sie gefunden haben. Es ist ineffizient, die Anzahl der Zeilen zurückzugeben, da Sie viel Speicher reservieren müssen, um die gesamte (verbleibende) Ergebnismenge zu speichern. Sie können einfach einen booleschen Wert verwenden, um zu testen, ob Sie etwas ausgegeben haben.

$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>"; 
}