Leslie: SELECT COUNT(*) macht mich verrückt

Hey,

ich werde ich gerade total verrückt.
Habe den Befehl "SELECT COUNT(*) FROM tabelle_gb" unter phpMyAdmin direkt ausgeführt, wo er mir die richtige Anzahl von Zeilen zurück gibt.
Aber wenn ich das mit einer PHP-Abfrage mache:

$query = "SELECT COUNT(*) FROM tabelle_gb";
$gesamt = mysql_query($query) OR die(mysql_error());
echo $gesamt;

Wird mir "Resource id #5" ausgegeben. Was mache ich denn bloß falsch??

Danke, Leslie

  1. hi,

    $query = "SELECT COUNT(*) FROM tabelle_gb";
    $gesamt = mysql_query($query) OR die(mysql_error());
    echo $gesamt;

    Wird mir "Resource id #5" ausgegeben. Was mache ich denn bloß falsch??

    weiß nicht, aber tipp von mir: gib der count() funktion einen Spaltennamen mit, also kein "*" und wenn möglich den primKey oder Index, falls vorhanden.

    --roro

    1. weiß nicht, aber tipp von mir: gib der count() funktion einen Spaltennamen mit, also kein "*" und wenn möglich den primKey oder Index, falls vorhanden.

      Danke, aber gleicher Fehler. Noch eine Idee?

      Gruß Leslie

      1. Moin Leslie,

        Danke, aber gleicher Fehler. Noch eine Idee?

        $strSQL="select count(*) as Gesamt from tabelle_gb";
        $hErgebnis = @mssql_query($strSQL, $hVerbindung);

        $result = mssql_fetch_array($hErgebnis);
        $Gesamt = $result['Gesamt'] ;

        regds
        Mike©

        --
        Freunde kommen und gehen. Feinde sammeln sich an.
        1. $strSQL="select count(*) as Gesamt from tabelle_gb";
          $hErgebnis = @mssql_query($strSQL, $hVerbindung);

          $result = mssql_fetch_array($hErgebnis);
          $Gesamt = $result['Gesamt'] ;

          Genau das war mein Fehler, man sollte halt das $result schon richtig behandeln.

          Danke auch dir,
          Gruß Leslie

  2. Hi,

    $query = "SELECT COUNT(*) FROM tabelle_gb";
    $gesamt = mysql_query($query) OR die(mysql_error());

    Was ist das Ergebnis eines mysql_query-Aufrufes?

    echo $gesamt;

    Richtig, ein Result-Handle.
    Was macht man damit? Man liest die Werte aus, z.B. mit mysql_fetch_array, in welchem Fall du dein Ergebnis in der ersten Zeile, [0]-Position findest, oder du gibst wie von Rolf vorgeschlagen noch einen Namen an und benutzt mysql_fetch_assoc und greifst dann über den Namen zu.

    MfG
    Rouven

    --
    -------------------
    Death is nature's way of telling you to slow down.
    1. Oje.. dummer Fehler.

      Umso größeren Dank für deine Hilfe!

      Gruß Leslie

      1. Hi

        Umso größeren Dank für deine Hilfe!

        wenn ich da mal kurz dazwischenfunken dürfte. Rouven hat dir zwei sinnvolle Funktionen genannt, um Ergebnisse aus einem Ressource-Handle herauszubekommen.
        Die einfachste Art, dies zu tun, ist aber die Funktion mysql_result(). Die zwei von Rouven genannten Funktionen sind ein bisschen zu komplex, man kann es da (in diesem Fall) wirklich einfacher mit mysql_result haben.

        AABER:
        Wieso zählst du denn die Zeilen schon in der MySQL-Syntax? Nimm doch die Funktion mysql_num_rows. Wenn dein Projekt für das du den gefragten Code brauchst sehr gut besucht sein wird, ist es wirklich sinnvoller, mysql_num_rows zu nehmen, um den MySQL-Server nicht unnötig zu belasten.
        Mir ist es schon ein mal passiert, dass plötzlich der MySQL-Server angedankt hat, weil ich einen Query zu viel abgesetzt habe. Der war auch noch dummerweise in einer for-Schleife zusammen mit einem anderen Query, die 300 mal durchlaufen wurde. Kaum online gestellt, schon gehen 30 Benutzer gleichzeitig auf die Seite (auch noch die Startseite) und ich bekam die Krise, weil plötzlich _gar nichts_ mehr ging.
        Wie gut dein Projekt besucht sein wird, weiß ich nicht. Ich empfehle aber, lieber jetzt schon unnötige Querys wegzulassen.
        Aber man kann es auch - wie ich - auf die harte Tour erfahren.

        Viele Grüße
        Robber

        1. Moin!

          wenn ich da mal kurz dazwischenfunken dürfte. Rouven hat dir zwei sinnvolle Funktionen genannt, um Ergebnisse aus einem Ressource-Handle herauszubekommen.
          Die einfachste Art, dies zu tun, ist aber die Funktion mysql_result(). Die zwei von Rouven genannten Funktionen sind ein bisschen zu komplex, man kann es da (in diesem Fall) wirklich einfacher mit mysql_result haben.

          Finde ich nicht. mysql_fetch_assoc() liefert ein ziemlich simpel handhabbares Resultat. Bei mysql_result() hat man keine nennenswerte Vereinfachung - sie wird nur verlagert.

          AABER:
          Wieso zählst du denn die Zeilen schon in der MySQL-Syntax? Nimm doch die Funktion mysql_num_rows. Wenn dein Projekt für das du den gefragten Code brauchst sehr gut besucht sein wird, ist es wirklich sinnvoller, mysql_num_rows zu nehmen, um den MySQL-Server nicht unnötig zu belasten.

          Mit diesem Statement outest du dich als kompletter Anfänger.

          Wenn man mit MySQL "SELECT COUNT(*) FROM tabelle" macht, schaut MySQL ganz schnell nach, wieviele Datensätze in der Tabelle gespeichert sind, und überträgt exakt eine Zahl in den PHP-Puffer.

          Dein Vorschlag würde bedeuten, dass man "SELECT * FROM tabelle" machen muß. MySQL liest dann nicht schnell aus der Indextabelle, sondern muß die gesamte Tabelle auslesen und in den PHP-Puffer übertragen. Bei kleinen Tabellen sicher kein riesiger Unterschied, aber wenn mehrere zehntausend Datensätze in der Tabelle stehen, wird der Unterschied immer größer. Und das GERADE BEI stark besuchten Projekten.

          Abgesehen davon: Das COUNT-Ergebnis benötigt viel weniger Bytes im PHP-Speicher (der begrenzt ist!), als die komplette Tabelle.

          Mir ist es schon ein mal passiert, dass plötzlich der MySQL-Server angedankt hat, weil ich einen Query zu viel abgesetzt habe. Der war auch noch dummerweise in einer for-Schleife zusammen mit einem anderen Query, die 300 mal durchlaufen wurde. Kaum online gestellt, schon gehen 30 Benutzer gleichzeitig auf die Seite (auch noch die Startseite) und ich bekam die Krise, weil plötzlich _gar nichts_ mehr ging.

          Dann hast du einen strukturellen Fehler in deinem Datendesign oder deiner Abfragetaktik gemacht. Das dürfte deiner wenigen Erfahrung zuzuschreiben sein, denn du offenbarst ganz deutlich, dass du noch an den Anfängen deiner Datenbankerfahrung stehst.

          Nur so als Hinweis: Für eine einzige Seitendarstellung in einer Schleife 300 Querys abzusetzen ist ganz ganz schlecht, da kann man mit Sicherheit sehr viel optimieren. Und ein Schritt dieser Optimierung ist, eben nur exakt das abzufragen, was man von der Datenbank wirklich wissen will, keinesfalls mehr.

          Wenn nur die Anzahl der Datensätze einer Tabelle gebraucht wird, fragt man sie eben mit COUNT ab - und nicht stattdessen die ganze Tabelle. Daran geht die Performance einer Datenbank nämlich auch schnell zu Ende.

          Wie gut dein Projekt besucht sein wird, weiß ich nicht. Ich empfehle aber, lieber jetzt schon unnötige Querys wegzulassen.

          Wenn die gesamte Tabelle bereits abgefragt wurde, hättest du Recht, die Dopplung wäre vermeidbar. Davon ist aber nach Lage der Information nicht auszugehen.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."