Robbie: $res

Hi,
könnt ihr mir sagen für was ($res) gut ist? Den bei meinem Script stolpere ich darüber.

Wie muss man ->while($row=mysql fetch array($res)) hier tun?

  1. Hallo!

    könnt ihr mir sagen für was ($res) gut ist?

    Darin wird irgendetwas gespeichert, weil es eine Variable ist.

    Den bei meinem Script stolpere ich darüber.

    Bei deinem eigenen? Dann solltest du aber wissen, was darin gespeichert wird.

    Wie muss man ->while($row=mysql fetch array($res)) hier tun?

    Das ist kein deutscher Satz. Insofern verstehe ich ihn nicht. Aber es muss mysql_fetch_array heißen. Ohne Leerzeichen. Um dir mehr helfen zu können, sollten wir mehr über das Script und die Fehlermeldungen wissen.

    ciao, ww

    --
    Ein japanisch-deutsches Gedicht
    sh:(  fo:|  ch:~  rl:(  br:>  n4:~  ie:%  mo:)  va:)  de:]  zu:)  fl:(  ss:|  ls:~  js:)
    1. <?
      /* showforen.php */
      //Herstellen der MySQL verbindung
      $con =   mysql_connect($host, $user, $pass);
      $db =   mysql_select_db($datenbank);

      //Herauslesen der Foren
      $res =   mysql_query("select * from foren");

      //Ausgeben der Foren mit Hyperlink
      while($row =   mysql_fetch_assoc ($res)) {
          echo "<a href="showthreads.php?fid=".$row["id"]."">";
          echo $row["name"]."</a><br>";
      }
      ?>
      Das ist der Script, und ich weiß nicht warum bei mir nichts angezeigt wird obwohl ich die ersten 4 ausgefüllt habe (und zwar richtig)

      1. Hi!

        obwohl ich die ersten 4 ausgefüllt habe (und zwar richtig)

        Die ersten 4?
        Du meinst die Variablen $host, $user, $pass und $datenbank?
        Es gibt keine Fehlermeldung, wenn du mysql_connect() aufrufst?
        Dann wird es vermutlich funktioniert haben. Du kannst dir den Inhalt der Varialen ausgeben lassen oder eine Prüfung einbauen, ob alles funktioniert hat.

        $res =   mysql_query("select * from foren");

        Hier sieht man doch ganz deutlich, worum es sich bei $res handelt.
        Du könntest das natürlich auch genausogut $osterhase nennen, weil es sich nur um eine stinknormale Variable handelt. $res ist aber besser, weil es sich hier doch um einen recht aussagekräftigen Namen handelt (res=result).

        und ich weiß nicht warum bei mir nichts angezeigt wird

        Warum wo nichts angezeigt wird?
        Es erfolgt keine Ausgabe innerhalb deiner while-Schleife?
        Was steht denn in $row? Ist ja vielleicht leer. Ich weiß nicht, was in deiner Datenbank steht...
        Laß dir doch mal den Inhalt mit print_r() anzeigen.
        Und bau ein paar Prüfungen in das Script ein, so daß du Meldungen erhälst falls was nicht funktioniert.
        Aus

        $res =   mysql_query("select * from foren");

        würde ich z.B. folgendes machen:
        $res = @mysql_query( "SELECT * FROM foren" ) or die( "Fehler: " . mysql_error() );
        Außerdem würde ich davon abraten, SELECT * zu nutzen.
        "Warum soll ich nicht SELECT * schreiben?"
        http://www.php-faq.de/q/q-sql-select.html

        Schöner Gruß,
        rob

        1. Hello,

          Es gibt keine Fehlermeldung, wenn du mysql_connect() aufrufst?

          mysql_connect() gibt keine Statusmeldungen über die PHP-Fehler-Queue aus.
          Man muss sie sich explizit beschaffen mit

          if($fehler = mysql_errno($con) > 0) echo $fehler;

          oder mit

          if($fehlertext = mysql_error($con) > 0) echo $fehlertext;

          http://www.php.net/manual/en/ref.mysql.php

          Harzliche Grüße vom Berg
          http://www.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau

          1. Hi!

            mysql_connect() gibt keine Statusmeldungen über die PHP-Fehler-Queue aus.

            Man bekommt zwar keine Fehlermeldung, aber ein Warning, wenn man z.B. einen falschen Host angibt:
            Warning: mysql_connect() [function.mysql-connect.html]: Unknown MySQL server host 'gibt_es_nicht' (11001) in blabla on line blabla
            (Das natürlich nur sofern man dieses nicht mit einem vorangestelltem @ unetrdrückt.)

            Naja und entweder erhält man eine Verbindungskennung zurück oder halt FALSE.
            In jedem Fall sollte man erstmal rausfinden, ob überhaupt eine Verbindung zum Server aufgebaut wird oder nicht.

            Statt
            $con =   mysql_connect($host, $user, $pass);
            würde ich
            $con = @mysql_connect( $host, $user, $pass )
                or die( "Fehler! Die Verbindung zum SQL-Server konnte nicht hergestellt werden: " . mysql_error() );
            schreiben und statt
            $db =   mysql_select_db($datenbank);
            würde ich
            $db = @mysql_select_db( $datenbank, $con )
             or die( "Fehler! Die Datenbank konnte nicht geöffnet werden: " . mysql_error() );
            schreiben und statt
            $res =   mysql_query("select * from foren");
            würde ich
            $res = @mysql_query( "SELECT * FROM foren" ) or die( "Fehler: " . mysql_error() );
            schreiben.
            So sollte dann schnell deutlich werden, was an dem Script nicht funktioniert.
            Vielleicht liegt es aber auch an einer leeren Datenbank oder einem falschen Tabellennamen...

            Gruß,
            rob

            1. Hello,

              Statt
              $con =   mysql_connect($host, $user, $pass);
              würde ich
              $con = @mysql_connect( $host, $user, $pass )
                  or die( "Fehler! Die Verbindung zum SQL-Server konnte nicht hergestellt werden: " . mysql_error() );

              Zum Üben und Testen mag das gut genug sein.
              Für den produktiven Betrieb ist die() nur bedingt geeignet.
              Da muss man dann schon ein wenig weiter ausholen (Template-Engine) wenn es noch sinnvoll sein soll, genauso wie $absage in der beliebten Funktion

              function authenticate($ansage,$absage)
              {
                Header("WWW-authenticate: basic realm="$ansage"");
                Header("HTTP/1.0 401 Unauthorized");
                echo $absage;
                exit;
              }

              In $absage muss eigentlich bei Zielausgabe Browser ein valides HTML-Dokument übergeben werden. Genauso hat das die() verdient. Dass man auch einen einfachen String reinschreiben darf, und das immer wieder gemacht wird, ist Pfusch (nicht das Dürfen, sondern das Machen).

              Harzliche Grüße vom Berg
              http://www.annerschbarrich.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

              1. Hi!

                Zum Üben und Testen mag das gut genug sein.

                Darum geht es ja hier, wenn der Fehler im Script gefunden werden soll.

                Ich würde dem User etwaige SQL-Fehlermeldungen auch nicht zeigen. Die würde ich abfangen und dem User nur mitteilen, daß seine Anfrage momentan nicht auszuführen ist oder so was in der Art halt.
                Aber zum Testen und Fehler finden sind solche Ausgaben ja sehr praktisch.

                Für den produktiven Betrieb ist die() nur bedingt geeignet.

                Das ist schon klar.

                ein valides HTML-Dokument übergeben werden. Genauso hat das die() verdient. Dass man auch einen einfachen String reinschreiben darf, und das immer wieder gemacht wird, ist Pfusch (nicht das Dürfen, sondern das Machen).

                Das ist mir neu. Wieso sollte es denn nicht korrekt sein, die() einen einfachen String zu übergeben?
                Laut Handbuch sieht die Syntax folgendermaßen aus:
                void die ( string message );

                Gruß, rob

                1. Hello,

                  Für den produktiven Betrieb ist die() nur bedingt geeignet.
                  Das ist schon klar.
                  ein valides HTML-Dokument übergeben werden. Genauso hat das die() verdient. Dass man auch einen einfachen String reinschreiben darf, und das immer wieder gemacht wird, ist Pfusch (nicht das Dürfen, sondern das Machen).
                  Das ist mir neu. Wieso sollte es denn nicht korrekt sein, die() einen einfachen String zu übergeben?
                  Laut Handbuch sieht die Syntax folgendermaßen aus:
                  void die ( string message );

                  *rarara*

                  Hast Du das Ergebnis einer solchen Ausgabe an die HTTP-Standardausgabe schon mel dem Validator zur Verfügung gestellt?

                  Nicht alles, was die Programmierumgebung ermöglicht, ist in Bezug auf das Zielsystem richtig!

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

                  1. Hast Du das Ergebnis einer solchen Ausgabe an die HTTP-Standardausgabe schon mel dem Validator zur Verfügung gestellt?

                    Ach so meinst du das. Ja, ich schätze mal, daß danach logischerweise kein weiterer Code mehr an den Browser gesendet wird. Somit hat man dann sicherlich nur ein halbes HTML-Dokument.
                    Ich hatte das so verstanden, daß es nicht zulässig wäre, der Funktion einen String zu übergeben.
                    Aber im produktiven Einsatz und ganz besonders, wenn ich PHP zum HTML-Seiten generieren nehme, fange ich meine Fehler ohnehin anders ab.
                    Nichts desto trotz ist es für Tests trotzdem eine gute Möglichkeit, mal schnell einen Fehler zu finden.

                    So, jetzt gehe ich mal, und verdrücke die Wiener Schnitzel, die ich gerade gebraten hab.
                    Die Dinger sehen sooo guuut aus... Aber leider kann ich dir davon keins auf einen Server laden ;)

                    Schöner Gruß,
                    rob

  2. Hello,

    könnt ihr mir sagen für was ($res) gut ist? Den bei meinem Script stolpere ich darüber.

    Wie muss man ->while($row=mysql fetch array($res)) hier tun?

    Das ist der Ressouce-Locator des Queries, das Du mit MySQL ausgeführt hast.
    Hinter dieser Zahl versteckt sich eine Tabelle mit allen Metadaten der Abfrage, inclusive der Zeiger auf die benötigten Methoden und Ergebnisse.

    MySQL_fetch_array() benötigt die Information, um nun bei jedem Aufruf eine Zeile aus der Ergenismenge zu liefern.

    Du erzeugst diesen Locater mit

    $res = mysql_query($sql, $con)

    wobei $sql das SQL-Statement ist und $con das Verbindungshandle für die Datenbankserververbinung. Das ist vergleichbar mit $res. Hinter $con versteckt sich die Tabelle mit den Metadaten für die Verbindung zum Datenbankserver mit z.B. gerade ausgewählter Datenbank, letzter Insert-ID, usw.
    Sie ist verbindungsbezogen!

    Beide Handles ($res, $con) darf man während des Scriptes nicht verlieren, sondt hat man Speicherbereiche belegt und kann sie nicht wieder freigeben. Am Ende eines Scriptes macht PHP das allerdings von alleine. Sooo schlimm ist das Verlieren dann also auch wieder nicht.
    Man kann eben im aktiven Script nur nicht weiterarbeiten.

    Nun frag aber bitte nicht, wie man ein Handle verlieren kann ;-))

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau