Phil: Einzelne Einträge mit PHP und MYSQL (Distinct)

Hallo Zusammen,

Stehe irgendwie gerade auf der Leitung.

$sql = "select distinct 'ip' from 'counter' where server='1.1.1.1'";
$ergebnis = mysql_query($sql);
echo $ergebnis;

Irgendwie funktioniert das ganze überhaupt nicht. Die Ausgabe funktioniert nicht. Hat jemand einen Tipp? Vielen Dank und ein schöner Sonntag! Grüsse!

  1. Hallo Phil,

    $sql = "select distinct 'ip' from 'counter' where server='1.1.1.1'";

    counter scheint ein Spaltenname zu sein.
    Spaltennamen dürfen im SQL-Dialekt von MySQL *nicht* in einfache Anführungszeichen eingeschlossen werden. Du kannst

    - den Backtick nutzen.
     - auf Behandlung verzichten, da der Spaltenname counter nicht behandelt
       werden muss.
     - ANSI-Quotes einschalten und doppelte Anführungszeichen nutzen.

    $ergebnis = mysql_query($sql);

    liefert Dir daher einen MySQL-Fehler zurück.

    echo $ergebnis;

    $ergebnis enthält daher false, wie Du der Doku entnehmen kannst.

    Im Erfolgsfall musst Du anschließend die Ergebniszeilen mittels der mysql_fetch-Funktionen wie z.B. mysql_fetch_array() durchlaufen. Ja auch dann, wenn es nur eine einzigen Datensatz mit einer einzigen Spalte gibt.

    Noch besser wäre es, wenn Du die zwar wohldokumentierten und in Tausenden Tutorials erläuterten aber genauso veralteten und wenig leistungsfähigen mysql_*-Funktionen überhaupt nicht mehr verwendest und Dich statt dessen zum Beispiel der wesentlich leistungsfähigeren mysqli-Erweiterung von PHP zuwendest.

    Freundliche Grüße

    Vinzenz

    1. Hallo Ingrid,

      $sql = "select distinct 'ip' from 'counter' where server='1.1.1.1'";

      counter scheint ein Spaltenname zu sein.

      ich vermute außerdem, dass der OP nicht die konstante Zeichenkette

      ip

      auslesen will, sondern den Inhalt einer Spalte, die den Namen

      ip

      trägt. Für diese Spalte gelten selbstverständlich ebenfalls die Ausführungen:

      Spaltennamen dürfen im SQL-Dialekt von MySQL *nicht* in einfache Anführungszeichen eingeschlossen werden. Du kannst

      • den Backtick nutzen.
      • auf Behandlung verzichten, da der Spaltenname counter nicht behandelt
           werden muss.
      • ANSI-Quotes einschalten und doppelte Anführungszeichen nutzen.

      Freundliche Grüße

      Vinzenz

      1. Hallo!

        Vielen Dank für deine ausführliche Hilfe! Sehr nett! Wenn ich das alles richtig verstanden habe, müsste das ganze so aussehen?

        $sql = "select distinct ip from counter where server='1.1.1.1'";
        $ergebnis = mysql_query($sql);
        $ausgabe = mysql_fetch_array($ergebnis);
        echo $ausgabe;

        Irgendwie haut das aber noch nicht so hin...

        Den Tip mit MYSQLli werde ich mir sicher mal noch genauer ansehen :) Danke!

        1. Hallo,

          Vielen Dank für deine ausführliche Hilfe! Sehr nett! Wenn ich das alles richtig verstanden habe, müsste das ganze so aussehen?

          $sql = "select distinct ip from counter where server='1.1.1.1'";
          $ergebnis = mysql_query($sql);

          Du solltest hier *immer* überprüfen, ob die Abfrage erfolgreich ausgeführt werden konnte. MySQL-Fehler liefert Dir übrigens mysql_error(). Das häufig zu findende

          " or die(mysql_error());"

          ist übrigens *keine* Fehlerbehandlung. Wenn etwas schiefgegangen ist, dann gib dem Benutzer eine nette "Tut-mir-leid-geht-im-Moment-nicht-Nachricht" und logge für *Dich* den Fehler in einer Datei, die Du Dir regelmäßig anschaust ....

          $ausgabe = mysql_fetch_array($ergebnis);
          echo $ausgabe;

          mysql_fetch_array liefert, wie der Name es schon vermuten läßt, immer ein Array. Wenn es nur eine Spalte gibt, ein Array mit einem Element. Da Deine Spalte den Namen "ip" trägt, kannst Du über

          $ausgabe[0]

          oder

          $ausgabe['ip']

          auf den Inhalt dieser Spalte zugreifen. Diesen Komfort bietet Dir diese Funktion, deren Handbuchseite ich Dir ja bereits verlinkt habe.

          Freundliche Grüße

          Vinzenz

          1. Danke! Wie immer super Hilfe! Sie sollten Unterricht geben :)

            $sql = "select distinct ip from counter where server='1.1.1.1'";
            $ergebnis = mysql_query($sql);
            $ausgabe = mysql_fetch_array($ergebnis);
            echo $ausgabe[0];

            liefert mir folgende Ausgabe

            Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/web4/html/admin.php on line 24

            Das mit dem Array hätte ich auch selbst merken sollen, sorry!

            1. Es ist mir ein Fehler unterlaufen! Nun klappt alles! Vielen Dank und ein schöner Nachmittag! Grüsse

              1. hallo!

                Ich muss mich leider nochmals melde. Ich bin etwas über das Ergebnis meines Codes verwirrt. Mein Ziel war es eigentlich, dass ich alle Einträge der Spalte zählen kann. Dabei wird aber kein Eintrag doppelt gezählt.

                Das Resultat meines Scriptes ist jedoch eine IP Adresse und nicht ein Nummer. Wenn ich zusätzlich count verwende, ergibt mein Ergebnis 2 obwohl mindestens 30 verschiedene IP's in der Spalte gespeichert sind. Was übersehe ich? Danke!

                1. Man müsste halt selbst etwas überlegen.

                  $sql = "select count(distinct(ip)) from counter where server='1.1.1.1'";

                  Das wars von mir! Ein schöner Nachmittag! Grüsse!

            2. Hallo,

              Danke! Wie immer super Hilfe!

              bitte, gerne :-)

              Sie sollten Unterricht geben :)

              Kein "Sie" bitte. Es soll vorkommen, dass ich von Zeit zu Zeit Deinen Tipp befolge. Zum Glück nicht Vollzeit :-)

              $sql = "select distinct ip from counter where server='1.1.1.1'";
              $ergebnis = mysql_query($sql);
              $ausgabe = mysql_fetch_array($ergebnis);
              echo $ausgabe[0];

              liefert mir folgende Ausgabe

              Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/web4/html/admin.php on line 24

              dies bedeutet, dass $ergebnis nicht auf eine gültige Ergebnisressource verweist. Daraus folgt, dass mysql_query nicht erfolgreich war, sondern einen Fehler zurückgeliefert hat (hab' ich Dir schon ans Herz gelegt):

              // Stelle die Abfrage zusammen.  
              // Hinweis: Es ist eine gute Idee, Daten, die sich verändern können  
              //          kontextgemäß zu behandeln. Du hast hier einen SQL-Kontext  
              //          und die dazu passende Funktion heißt [link:http://www.php.net/manual/de/function.mysql-real-escape-string.php@title=mysql_real_escape_string].  
              // Dabei musst Du noch aufpassen, dass Dir das gut gemeinte PHP-Feature  
              // [link:http://www.php.net/manual/de/security.magicquotes.php@title=Magic Quotes] keinen Strich durch die Rechnung macht.  
              // Schau dort nach, wie man diese ausschaltet, falls nötig.  
              $sql = "select distinct `ip` from `counter` where server='1.1.1.1'";  
              $ergebnis = mysql_query($sql);  
                
              // Überprüfe auf Erfolg  
              if (!$ergebnis) {  
                  // mysql_query hat FALSE zurückgeliefert  
                  // versorge den Benutzer mit einer tröstenden Meldung  
                
                  // *Nur für Debugging während der Entwicklung!*  
                  // *NICHT in der Produktionsumgebung verwenden!*  
                  // für Debug-Zwecke, gib den Fehler aus  
                  // Gib das SQL-Statement und die MySQL-Fehlermeldung aus  
                  echo $sql, '<br>', mysql_error();  
              }  
              else {  
                  // Erfolg, greife auf die Daten zu  
                  $ausgabe = mysql_fetch_array($ergebnis);  
                  echo $ausgabe['ip'];  
              }  
              

              Freundliche Grüße

              Vinzenz