Herb3: Ausgabe eines einzelnen DB-Feldes: Kein Array?

Hallo allerseits

Ich versuche, mein eigenes Login-script zu schreiben. Das Übergeben der Felder-Werte klappt soweit. Aber beim Vergleich dieser Werte mit den Werten aus der DB, aber auch bei der Analyse dieses Problems, scheitere ich.
Eigentlich erwarte beim submitten die Ausgabe der User-ID des sich einloggenden Benutzers und das Formular. Da ist aber nur das Formular...

print_r($_POST) gibt erst "Array ()" und dann "Array ( [nick] => user [userpass] => user )" aus. Und ein Feld aus der Datenbank auslesen klappt auch.
(Den Aufbau zur Datenbank habe ich hier entfernt)

Für Tipps bin ich natürlich sehr dankbar.

<html><body>
<?php

$nick = $_POST['nick'];
 $userpass = $_POST['userpass'];
 $qry = "SELECT user_id FROM users WHERE nickname='".$nick."' AND userpass='".$userpass."'";

$row =  mysql_fetch_assoc($qry);
 echo $row['user_id'];

?>

<form type="submit" action="http://url/index.php" method="post">
 Nick<input name="nick" type="text"><br />
 Pass<input name="userpass" type="password"><br />  <input type="submit" value="senden">
</form></body></html>

  1. Hallo!

    $nick = $_POST['nick'];
    $userpass = $_POST['userpass'];
    $qry = "SELECT user_id FROM users WHERE nickname='".$nick."' AND userpass='".$userpass."'";

    $row =  mysql_fetch_assoc($qry);
    echo $row['user_id'];

    mysql_fetch_assoc erwartet ein Resultset als Parameter. Du übergibts aber einen String. Wenn du die Fehlerausgabe in php einschalten würdest, würdest du das auch als Fehler bekommen.

    Du brauchst noch ein mysql_query() dazwischen.

    mfg
      frafu

    1. super, unverschlüsselt funktionierts jetzt. Danke

      Zum Aktivieren der Fehlerausgabe: Sind da mit
      error_reporting(1+2+4+8);
      alle Fehler abgedecket?

      1. Hi herb3,

        Zum Aktivieren der Fehlerausgabe: Sind da mit
        error_reporting(1+2+4+8);
        alle Fehler abgedecket?

        Nein, 6143 ist doch noch etwas mehr als 15 ;-) Übrigens ist es hilfreich die entsprechenden Konstanten zu verwenden. Eventuell willst du auch noch E_STRICT zusätzlich zu E_ALL aktivieren.

        Du hast übrigens noch einen weiteren, schwerwiegenden Fehler in deinem Script. Die Usereingaben werden nicht korrekt behandelt (Stichwort magic_quotes rückgängig machen falls es aktiviert war und anschließend mysql_real_escape_string() arbeiten lassen), sodass dein Script in der vorhin geposteten Variante für SQL-Injektionen anfällig ist.

        Viele Grüße,
          ~ Dennis.

        1. aus der Beschreibung meine ich eigentlich, dass mysql_real_escape_string meine Ausgabe (im echo) eigentlich nicht beeinflussen sollte, oder täusche ich mich da? wenn ich die funktion einbinde, bin ich nämlich wieder genau an der selben Stelle wie vorher. Aber es kommt auch kein Error..?

          error_reporting(E_ALL);
           $nick = $_POST['nick'];
           $userpass = $_POST['userpass'];
           $qry = "SELECT user_id FROM users WHERE nickname='".$nick."' AND userpass='".$userpass."'";
           $res = mysql_real_escape_string($qry);
           $out = mysql_query($res);
           $row =  mysql_fetch_assoc($qry);
           echo $row['user_id'];

          1. Hi,

            aus der Beschreibung meine ich eigentlich, dass mysql_real_escape_string meine Ausgabe (im echo) eigentlich nicht beeinflussen sollte, oder täusche ich mich da?

            Schau doch bitte im Manual nach, worauf man die Funktion anwendet.

            wenn ich die funktion einbinde, bin ich nämlich wieder genau an der selben Stelle wie vorher.

            Natuerlich. Auf die komplette Query angewendet, ergibt es Bloedsinn, den die DB nicht versteht.

            Aber es kommt auch kein Error..?

            Du *fragst* nicht nach Fehlern. Das wuerde man naemlich mit mysql_error() machen.

            MfG ChrisB

          2. Hallo

            aus der Beschreibung meine ich eigentlich, dass mysql_real_escape_string meine Ausgabe (im echo) eigentlich nicht beeinflussen sollte, oder täusche ich mich da?

            Weißt du überhaupt, was mysql_real_escape_string macht und an welcher Stelle es angewandt wird? Hast du Dennis' Links verfolgt und dir den dortigen Text auch durchgelesen?

            Ich vermute nicht, sonst würdest du nicht mysql_real_escape_string mit echo in Verbindung bringen.

            wenn ich die funktion einbinde, bin ich nämlich wieder genau an der selben Stelle wie vorher. Aber es kommt auch kein Error..?

            error_reporting(E_ALL);  
            display_errors(1);  
            # Das gehoert an den Anfang des Skripts,  
            # dann gibt's auch Fehlermeldungen auf's Display gezaubert
            

            $nick = $_POST['nick'];
            $userpass = $_POST['userpass'];
            $qry = "SELECT user_id FROM users WHERE nickname='".$nick."' AND userpass='".$userpass."'";
            $res = mysql_real_escape_string($qry);

            Schau bitte in das Handbuch, _dies_ ist die falsche Stelle für mysql_real_escape_string.

            $out = mysql_query($res);
            $row =  mysql_fetch_assoc($qry);
            echo $row['user_id'];

            mysql_fetch_assoc gibt, egal wieviele Zeilen das Abfrageergebnis hat, ein mehrdimensionales Array aus. Die erste Dimension bezeichnet die Zeile, ist also numerisch, die zweite Dimension ist die der Feldnamen.

            Tschö, Auge

            --
            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
            (Victor Hugo)
            Veranstaltungsdatenbank Vdb 0.2
            1. Moin!

              $qry = "SELECT user_id FROM users WHERE nickname='".$nick."' AND userpass='".$userpass."'";
              $res = mysql_real_escape_string($qry);

              Schau bitte in das Handbuch, _dies_ ist die falsche Stelle für mysql_real_escape_string.

              $out = mysql_query($res);
              $row =  mysql_fetch_assoc($qry);
              echo $row['user_id'];

              mysql_fetch_assoc gibt, egal wieviele Zeilen das Abfrageergebnis hat, ein mehrdimensionales Array aus. Die erste Dimension bezeichnet die Zeile, ist also numerisch, die zweite Dimension ist die der Feldnamen.

              Schau bitte ins Handbuch, deine Beschreibung von mysql_fetch_assoc() ist falsch. Es gibt keine zwei Dimensionen, die einzige Dimension ist der Feldname.

              - Sven Rautenberg

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

                $out = mysql_query($res);
                $row =  mysql_fetch_assoc($qry);
                echo $row['user_id'];

                mysql_fetch_assoc gibt, egal wieviele Zeilen das Abfrageergebnis hat, ein mehrdimensionales Array aus. Die erste Dimension bezeichnet die Zeile, ist also numerisch, die zweite Dimension ist die der Feldnamen.

                Schau bitte ins Handbuch, deine Beschreibung von mysql_fetch_assoc() ist falsch. Es gibt keine zwei Dimensionen, die einzige Dimension ist der Feldname.

                Nachguck, ähh ja, logisch, stimmt.
                ... Bleibt die Tatsache, dass die Zeilen im Ergebnis drin sind, auch wenn es nur eine Ergebniszeile gibt. Auch die eine einzige Zeile muss als solche angesprochen werden. Der obige Code tut dies, im Gegensatz zum Beispiel im Manual (while-Schleife), so er vollständig ist, nicht.

                Tschö, Auge

                --
                Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                (Victor Hugo)
                Veranstaltungsdatenbank Vdb 0.2
                1. Moin!

                  $row =  mysql_fetch_assoc($qry);
                  echo $row['user_id'];
                  ... Bleibt die Tatsache, dass die Zeilen im Ergebnis drin sind, auch wenn es nur eine Ergebniszeile gibt. Auch die eine einzige Zeile muss als solche angesprochen werden. Der obige Code tut dies, im Gegensatz zum Beispiel im Manual (while-Schleife), so er vollständig ist, nicht.

                  So? Sehe ich anders.

                  - Sven Rautenberg

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

                    $row =  mysql_fetch_assoc($qry);
                    echo $row['user_id'];
                    ... Bleibt die Tatsache, dass die Zeilen im Ergebnis drin sind, auch wenn es nur eine Ergebniszeile gibt. Auch die eine einzige Zeile muss als solche angesprochen werden. Der obige Code tut dies, im Gegensatz zum Beispiel im Manual (while-Schleife), so er vollständig ist, nicht.

                    So? Sehe ich anders.

                    Dann aber alles:

                    $qry = "SELECT user_id FROM users WHERE nickname='".$nick."' AND userpass='".$userpass."'";
                     $res = mysql_real_escape_string($qry);
                     $out = mysql_query($res);
                     $row =  mysql_fetch_assoc($qry);
                     echo $row['user_id'];

                    Darüber, den ganzen Query mit mysql_real_escape_string zu behandeln, habe ich schon was geschrieben (bzw. angedeutet). Ich will jetzt auch nicht darauf hinaus, dass herb3 den unbehandelten Query ($qry) anstatt des Abfrageergebnisses ($out) durch mysql_fetch_assoc schickt.

                    Aber auch wenn nur eine Zeile im Ergebnis drin ist, was $out[0] entspräche, wird er mit der Zeile $row = mysql_fetch_assoc($out); ($out ist die Kennung des vollständigen Ergebnisses) keine brauchbaren Daten erhalten.

                    Oder worauf willst du hinaus?

                    Tschö, Auge

                    --
                    Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                    (Victor Hugo)
                    Veranstaltungsdatenbank Vdb 0.2
                    1. Hi,

                      $out = mysql_query($res);
                      [...]
                      Aber auch wenn nur eine Zeile im Ergebnis drin ist, was $out[0] entspräche,

                      Nein, das taete es nicht.
                      $out ist eine Ressource-ID (im Erfolgsfalle, sonst false).
                      $out ist aber ganz sicher kein Array (welcher Art auch immer).

                      wird er mit der Zeile $row = mysql_fetch_assoc($out); ($out ist die Kennung des vollständigen Ergebnisses) keine brauchbaren Daten erhalten.

                      Doch, wird er.
                      mysql_fetch_assoc holt den jeweils naechsten Datensatz des (erfolgreichen) Abfrageergebnisses, auf welches die Ressource-ID $out "verweist", und stellt diesen in Form eines assoziatives Arrays zur Verfuegung. (Bzw. liefert false in dem Falle, dass es keinen naechsten Datensatz mehr gibt.)

                      MfG ChrisB

                      1. Hallo

                        Hi,

                        $out = mysql_query($res);
                        [...]
                        Aber auch wenn nur eine Zeile im Ergebnis drin ist, was $out[0] entspräche,

                        Nein, das taete es nicht.
                        $out ist eine Ressource-ID (im Erfolgsfalle, sonst false).
                        $out ist aber ganz sicher kein Array (welcher Art auch immer).

                        Das ist mir klar. Deshalb steht da explizit "entspräche".

                        wird er mit der Zeile $row = mysql_fetch_assoc($out); ($out ist die Kennung des vollständigen Ergebnisses) keine brauchbaren Daten erhalten.

                        Doch, wird er.
                        mysql_fetch_assoc holt den jeweils naechsten Datensatz des (erfolgreichen) Abfrageergebnisses, auf welches die Ressource-ID $out "verweist", und stellt diesen in Form eines assoziatives Arrays zur Verfuegung.

                        _Das_ wollte ich wissen. Das mysql_fetch_row so funktioniert (Zitat Handbuch: "Wiederholtes Aufrufen von mysql_fetch_row() liefert den nächsten Datensatz des Anfrageergebnisses oder FALSE, wenn keine weiteren Datensätze verfügbar sind."), war mir klar. Aus der Handbuchseite für mysql_fetch_assoc geht diese Möglichkeit der Verwendung nicht hervor.

                        Tschö, Auge

                        --
                        Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                        (Victor Hugo)
                        Veranstaltungsdatenbank Vdb 0.2
                        1. Ich habe mir die letzten Tage die von euch geposteten Links noch einmal ganz genau unter die Lupe genommen und viele Funktionen ausprobiert. Auf php.net war ich erst ziemlich überfordert, da ich 20% der Befehle noch nicht kenne. Ich hatte mir zu viel einfach zusammengereimt. Aber es geht wohl nicht anders, als alle in den Beispielen verwendeten Funktionen wirklich zu verstehen, um zu verstehen, wie das Beispiel funktioniert.

                          Nun habe ich das Script sogar noch ausgebaut und es funktioniert trotzdem noch :-)

                          Vielen Dank euch allen, ihr wart eine grosse Hilfe!

                          1. Hallo

                            Ich habe mir die letzten Tage die von euch geposteten Links noch einmal ganz genau unter die Lupe genommen und viele Funktionen ausprobiert. Auf php.net war ich erst ziemlich überfordert, da ich 20% der Befehle noch nicht kenne. Ich hatte mir zu viel einfach zusammengereimt. Aber es geht wohl nicht anders, als alle in den Beispielen verwendeten Funktionen wirklich zu verstehen, um zu verstehen, wie das Beispiel funktioniert.

                            Da nur irgendwas zusammenzuschreiben, ohne nachvollziehen zu können, was die einzelnen Teile tun, funktioniert nur im Glücksfall und zufälligerweise. Gerade mysql_fetch_assoc hält ja ein ausführliches und meiner Meinung nach auch anschauliches Beispiel einer Datenbankabfrage incl. Verbindungsaufnahme und Auswertung bereit. Sich dann über Aufbau, Arbeitsweise und Rückgabewert der einzelnen Funktionen zu informieren, sollte einfach sein. Man ist ja mitten drin in der Doku.

                            Und wenn dann immernoch Fragen da sind, gibt es ja auch noch das Forum. :-)

                            Nun habe ich das Script sogar noch ausgebaut und es funktioniert trotzdem noch :-)

                            Na bitte, geht doch.

                            Tschö, Auge

                            --
                            Die Musik drückt aus, was nicht gesagt werden kann und worüber es unmöglich ist zu schweigen.
                            (Victor Hugo)
                            Veranstaltungsdatenbank Vdb 0.2