PHP Anzahl Zeilen aus MySQL Tabelle

ClocxHD

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
376
Hallo,

ich möchte mir die Anzahl der Zeilen einer MySQL-Tabelle in ausgeben lassen.
Folgendes habe ich versucht:
PHP:
$zanfrage = "SELECT COUNT(timestamp) FROM squid_access";
$zeilen = mysql_query($zanfrage);
$menge = mysql_fetch_row($zeilen);
$menge = $menge[0];
echo "<div style='font-width: 2em;'>" . $menge . "</div>";

(Die Verbindung mit der Datenbank wird hergestellt, er gibt auch, wie er soll, die Tabelle aus (anderes SQL Statement))

Dort, wo er die Anzahl anzeigen soll, wird nichts angezeigt.

Mit freundlichen Grüßen
ClocxHD
 
PHP:
$result = mysql_query("SELECT * FROM table1");
$num_rows = mysql_num_rows($result);

echo $num_rows;
 
@ForestKoepp: Habe ich bereits versucht, genau das gleiche
@bnoob: MySQLi verwende ich ja eigentlich auch, nur dafür habe ich nichts gefunden
 
jep, idealerweise den Primary Key. Der funktioniert als Index gleich noch ne ganze Ecke anders als reguläre Indizes und ist noch performanter.

Dein Code hätte halbwegs stimmen sollen, die Frage ist also wirklich: Was steht in $menge? Mach deine Test-Ausgaben nicht mit echo, sondern verwende entweder print_r() oder, noch besser, var_dump(). Var_dump sagt dir den Datentyp dazu, was spätestens bei der Unterscheidung zwischen einem leeren String, NULL, 0 oder FALSE extrem wichtig wird.
 
Das ist der Code:
PHP:
$zres = mysql_query("SELECT * FROM squid_access");
$menge = mysql_num_rows($zres);

var_dump($menge); gibt mir NULL aus.
 
Mit was verbindest du eigentlich? Du sagst selbst, dass du MySQLi nutzt, hier nutzt du aber durchgehend MySQL-Funktionen.
 
Das ist der ganze Code:
PHP:
<html>
        <head>
                <title>Netzwerkaufrufe</title>
                <link rel="stylesheet" type="text/css" href="style.css" />
                <meta charset="utf-8" />
        </head>

        <body>

<center><button onclick="location.reload();">Neu laden</button></center>
<?php
$con = mysqli_connect("localhost", "benutzer", "passwort", "zentyal");
$anfrage = "SELECT * FROM squid_access ORDER BY timestamp DESC";
$res = $con->query($anfrage);

/*$zanfrage = "SELECT COUNT(timestamp) FROM squid_access";
$zeilen = mysql_query($zanfrage);
$menge = mysql_fetch_row($zeilen);
$menge = $menge[0];*/

$zres = mysql_query("SELECT * FROM squid_access");
$menge = mysql_num_rows($zres);

//echo "<div style='font-width: 2em;'>" . $zres . "</div>";

var_dump($menge);

echo "<table border='1'>";
        echo "<tr>";
                echo "<th>" . "Zeitstempel" . "</th>";
                echo "<th>" . "Remotehost" . "</th>";
                echo "<th>" . "Methode" . "</th>";
                echo "<th>" . "URL" . "</th>";
                echo "<th>" . "Domain" . "</th>";
                echo "<th>" . "Mimetype" . "</th>";
                echo "<th>" . "Event" . "</th>";
        echo "</tr>";
while($row = mysqli_fetch_object($res))
{
        echo "<tr>";
                echo "<td>" . $row->timestamp . "</td>";
                echo "<td>" . $row->remotehost . "</td>";
                echo "<td>" . $row->method . "</td>";
                echo "<td>" . "<a target='_blank' href='" . $row->url . "'>" . "Link" . "</a>" . "</td>";
                echo "<td>" . $row->domain . "</td>";
                echo "<td>" . $row->mimetype . "</td>";
                echo "<td>" . $row->event . "</td>";
        echo "</tr>";
}
echo "</table>";
?>

        </body>
</html>
 
Du bekommst in Zeile 14 ein mysqli_result-Objekt zurück. Nutz das auch weiter und verwende anschließend keine mysql_*-Funktionen. Anschließend kannst du über das Result auch num_rows ansprechen.
 
Yuuri schrieb:
Übrigens wäre es besser, wenn du ne indexierte Spalte zählst, was timestamp denke ich nicht sein wird.
Und noch besser wäre es, er nimmt statt einer Spalte einen Stern, um MySQL zu sagen, dass er wirklich Zeilen zählen möchte. Gibst du hingegen eine Spalte an, sagst du MySQL er soll die non-Null Values des Index zählen.

Das Verhalten ist zwar identisch, aber die Stern-Variante korrekter. Denn mit der Stern-Variante sagst du MySQL es kann den Weg wählen, der am effizientesten ist, mit der Spalten/Index-Variante gibst du strikt vor, wie gezählt werden soll.
 
PHP:
try {
   $dbh = new PDO('mysql:host=localhost;dbname=test', 'root', '');
   foreach ($dbh->query('SELECT count(*) as zeilen from testtabelle') as $row) {
	  echo"komplette Zeile des Ergebnisses:<br>";
      print_r($row);
	  echo"<br>Nur ein Wert aus den Result;<br>";
      echo $row[0]. " oder " . $row['zeilen'];
   }
   $dbh = null;
} catch (PDOException $e) {
   print "Error!: " . $e->getMessage() . "<br/>";
   die();
}
Soweit ich weiß geht count(*) sofern vorhanden eh auf den PK index. Also ist count(pk_spalte) im Prinzip das selbe wie count(*). Aber ohne gewähr.
Viel wichtiger: Was soll das erst ein select * abzufragen und dann die Zeilen zu zählen statt direkt nen Count(*) zu machen?!?
Gibst du hingegen eine Spalte an, sagst du MySQL er soll die non-Null Values des Index zählen.
Stimmt. Das kommt noch dazu!
 
Zuletzt bearbeitet:
gaunt schrieb:
Soweit ich weiß geht count(*) sofern vorhanden eh auf den PK index. Also ist count(pk_spalte) im Prinzip das selbe wie count(*). Aber ohne gewähr.

Stimmt, es macht das, weil es die z.Z. effizienteste Ausführung ist, es kann morgen aber eine effizientere Variante geben.
Bei MyISAM als Beispiel gibt es ja die Tabellen-Metadaten, da wird ein COUNT(*) also in die Metadaten schauen und nicht die Index-Daten bemühen müssen. COUNT(pk) wiederum wird aber für MyISAM auch wissen, dass die Metdadaten effizienter sind und der Query-Planer wird es in ein COUNT(*) "umschreiben".

Es bietet sich aber eben an gleich die Variante zu wählen, die effizienter ist bzw. sein kann. Zudem ist COUNT(*) ausdrucksstärker als COUNT(index), denn das Ergebnis von COUNT(*) kann von COUNT(index) abweichen, wenn der index NULL values erlaubt. Somit ist streng genommen bei einem COUNT(index) noch immer ein Blick in die DB-Definition nötig, um zu wissen, wie genau gezählt werden soll.
 
Nun gut, bei COUNT(index) mag das passieren, aber bei COUNT(pk)? Seit wann gibts NULL als PK? So gesehen sollten COUNT(*) und COUNT(pk) quasi identisch sein.

Unabhängig davon: Wie oft macht man in der Praxis einen COUNT ohne jegliche Parameter? Ist mir seit Ewigkeiten nicht mehr passiert. Irgend ein WHERE, z.B. auf einen FK, eine "Veröffentlicht"-Spalte, ne Zeit,... hat man in der Praxis doch immer. Da wars das auch mit den Metadaten.
 
Daaron schrieb:
Nun gut, bei COUNT(index) mag das passieren, aber bei COUNT(pk)? Seit wann gibts NULL als PK? So gesehen sollten COUNT(*) und COUNT(pk) quasi identisch sein.
ja wird es auch, hab ich ja geschrieben.

Daaron schrieb:
Unabhängig davon: Wie oft macht man in der Praxis einen COUNT ohne jegliche Parameter? Ist mir seit Ewigkeiten nicht mehr passiert. Irgend ein WHERE, z.B. auf einen FK, eine "Veröffentlicht"-Spalte, ne Zeit,... hat man in der Praxis doch immer. Da wars das auch mit den Metadaten.
Neija nehmen wir das Beispiel "SELECT COUNT(pk) FROM table WHERE index = 0". Streng genommen würdest du die Datenbank zwingen den Index zu nutzen, alle Ergebniszeilen zu "selecten" um dann eben über den PK zu zählen. Aber durch den Index hast du schon die Anzahl der Datensätze wenn du COUNT(*) nutzt, denn ein Index-Eintrag wird wiederum auf eine Zeile zeigen, die durch den PK repräsentiert wird. Aber auch hier ist es wieder so, dass die Datenbank erkennt was du eigentlich haben willst, und deinen Query "umschreibt" damit es effizienter ist.

Ich habe ja schon zuvor gesagt, in der Praxis wird in der Ausführung fast nie ein Unterschied sein (außer eben bei COUNT(index is nullable)), aber es ist eben "falsch" einfach zu empfehlen COUNT(pk) zu nutzen statt COUNT(*) zu nutzen, denn COUNT(index) ist ein Spezialfall von COUNT(*) und sollte daher eben auch nur genutzt werden, wenn dieser Spezialfall genutzt werden soll. Ansonsten ist es einfach eine "Überdefinition" des Querys, jedoch ohne jeglichen Vorteil und mit dem Nachteil des komplexeren Verständnis (soll hier der Spezialfall genutzt werden?).
 
Zurück
Oben