Cedrixxx: Ob Datensatz schon existiert!

Hay,
ich habe ein kleines php-Script und will testen, ob ein gewisser Datensatz schon existiert. Ich habe schon viele Vorschläge, aber keiner hat funktioniert. Hier ist das Script:

<?
// ueberpruefen, ob username schon existiert!
$db_host = "localhost";
$db_user = "web252";
$db_pwd  = "geheim";

mysql_connect($db_host,$db_user,$db_pwd);
mysql_select_db("usr_web252_1");

// Sql-Befehl
$username = $_POST['username'];
$sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";

// Befeh ausf&uuml;hren
if ($resultat = mysql_query($sql_befehl)) {
echo "Der Username ist schon vergeben!";
mysql_close();
exit;
}

mysql_close();

?>

Irgendwie gibt es auch die Meldung, dass der Datensatz existiert, wenn er in Wirklichkeit nicht existiert. Kann Jemand bitte meinen Code verbessern und ihn hier posten??? Wäre sehr nett.
MfG

Cedric N.

  1. mysql_query() gibt false nicht etwa zurück, wenn kein Datensatz gefunden wurde, sondern wenn es einen Fehler gab.

    Verwendet mysql_num_rows() o.ä., da kannst du dann einfach überprüfen, ob mysql_num_rows($resultat) > 0 ist.

    1. echo $begrüßung;

      mysql_query() gibt false nicht etwa zurück, wenn kein Datensatz gefunden wurde, sondern wenn es einen Fehler gab.
      Verwendet mysql_num_rows() o.ä., da kannst du dann einfach überprüfen, ob mysql_num_rows($resultat) > 0 ist.

      Wenn man nur die Anzahl der Datensätze ermitteln möchte, ist mysql_num_rows() nicht der richtige Weg, obwohl er zum Ergebnis führt. Um die Anzahl der Datensätze ermitteln zu können, muss PHP diese zunächst vom DBMS auslesen, sie also zu sich übertragen. Dies macht es bei jedem Aufruf von mysql_query() unbemerkt im Hintergrund. Vergleiche mysql_unbuffered_query(). Sie dann nach einer Nur-Zählung wegzuwerfen verbraucht nur unnötig Ressourcen.

      Um Datensätze zu zählen, sollte man besser SELECT COUNT(*) AS anzahl FROM ... verwenden. Dabei entsteht eine Ergebnisdatenmenge von einer einzigen Zeile, die man auf dem üblichen Weg abfragen kann.

      echo "$verabschiedung $name";

  2. Hallo Cedrixxx,

    $username = $_POST['username'];
    $sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";

    Dir ist klar, dass das gegen SQL injection anfällig ist, und eine ziemlich große Sicherheitslück bedeutet?

    Jonathan

    1. Hi,

      $username = $_POST['username'];
      $sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";

      Dir ist klar, dass das gegen SQL injection anfällig ist, und eine ziemlich große Sicherheitslück bedeutet?

      Wie soll er denn sonst den Member raussuchen? Bei einer Webanwendung mit DB-Anbindung, wo $username als Parameter kommt?

      Viele Grüße,
      Horst

      1. Wie soll er denn sonst den Member raussuchen? Bei einer Webanwendung mit DB-Anbindung, wo $username als Parameter kommt?

        Mit mysql_real_escape_string().

        $sql_befehl = "SELECT * FROM members WHERE userNAME='".mysql_real_escape_string($username)."'";

        1. Hi,

          Mit mysql_real_escape_string().

          $sql_befehl = "SELECT * FROM members WHERE userNAME='".mysql_real_escape_string($username)."'";

          Ja danke!

          Viele Grüße auch an Vinzenz und die Anderen,
          Horst

      2. Hallo

        $username = $_POST['username'];
        $sql_befehl = "SELECT * FROM members WHERE userNAME='$username'";

        Dir ist klar, dass das gegen SQL injection anfällig ist, und eine ziemlich große Sicherheitslück bedeutet?

        Wie soll er denn sonst den Member raussuchen? Bei einer Webanwendung mit DB-Anbindung, wo $username als Parameter kommt?

        Zum Beispiel mit
        $sql_befehl = "SELECT userNAME FROM members WHERE userNAME = ". [link:http://www.php.net/manual/de/function.mysql-real-escape-string.php@title=mysql_real_escape_string]($_POST['username']);

        Daten sind stets kontextgemäß zu maskieren. Natürlich sollten dabei derzeit noch die unsäglichen Magic Quotes berücksichtigt werden, so wie es auf der Handbuchseite von mysql_real_escape_string() steht.

        Freundliche Grüße

        Vinzenz

  3. Hello,

    Wie ich sehe, wurde Deine Frge bisher nicht beantwortet...

    <?php            ### keine short-open-tags benutzen!

    // ueberpruefen, ob username schon existiert!

    $db_host = "localhost";     ### diese Daten sollten später ausgelagert werden
      $db_user = "web252";        ### möglichst in eine Datei außerhalb des Doc-Root
      $db_pwd  = "geheim";        ### und dann mit require_once() zugeladen werden

    $con = mysql_connect($db_host,$db_user,$db_pwd);   ### Den Link-Identifier (Handle) benötigt
                                                         ### man später noch!

    if (!$con)  ### Keine Verbindung zum Datenbankserver verfügbar
      {
        html_ausgebe($fehlermeldung, "Der Datenbankserver ist nicht erreichbar: ");
        exit;    ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
      }

    $db = mysql_select_db("usr_web252_1");  ## Auch diesen Link-Identifier könnte
                                              ## man später noch brauchen

    if (!$db)  ### Keine Verbindung zur angeforderten Datenbank
      {
        html_ausgebe($fehlermeldung, "Die angeforderte Datenbank ist nicht auffindbar: ");
        exit;    ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
      }

    // Sql-Befehl

    $username = mysql_real_excape_string($_POST['username']);  ### nagic_quotes_gpc sind aus

    ### Die Datenübernahme sollte man nicht mitten im Script machen, sondern gleich am Anfang
      ### dort können dann ggf. auch Maskierungen (Magic Quotes) gleich entfernt werden, falls
      ### das "Feature" eingeschaltet ist

    $fieldlist = "id\_menbers, userName";   ### oder was man wirklich braucht

    ### bitte keine Queries auf '*' durchführen, wenn Du nicht wirklich ALLE Spalten benötigst

    $sql_befehl = "SELECT $fieldlist FROM members WHERE userNAME ='$username'";

    // SQL-Query ausführen

    if ($resultat = mysql_query($sql_befehl))

    {
        if(mysql_num_rows($resultat) > 0)
        {
           mysql_close($con);
           html_ausgabe($fehlermeldung, "Der Username ist schon vergeben!";
           exit;
        }
      }
      else   ### es konnte keine Abfrage durchgeführt werden
      {
         mysql_close($con);
         html_ausgabe($fehlermeldung, mysql_error($con));
         exit;
      }

    ### hier normal weiterarbeiten.
      ### nicht vergessen: Resultset wieder freigeben, wenn man es nicht mehr braucht

    ?>

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Oke, danke viel mal, werde es gerade testen!
      Hab schon viele Foren gesehen, aber das hier ist wohl eines der Besten. Vielen Dank

      Cedrixxx

      1. Hallo Cedrixxx!
                   ^^^

        Ah, hast Du auch eine Logitech-Tastatur bei der abwechselnd die xxx- oder die +-Taste klemmen?

        Gestern war +, heute ist es wieder xxxxx (wie man sieht) ;)

        Viele Grüße aus Frankfurt/Main,
        Patrick

        --

        _ - jenseits vom delirium - _
        [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
        Nichts ist unmöglich? Doch!
        Heute schon gegökt?
        1. Nein, eigentlich nicht. Also wenn mal Cedri+++ oder so stand, dann wars nicht ich.
          Meine Tastatur wurde zum Hp mitgeliefert und tut seinen Dienst Perfekt! =)
          Gruss

          CedrixXx (besser? =) )

          1. Hallo Cedrixxx!

            Also wenn mal Cedri+++ oder so stand, dann wars nicht ich.

            Nein, ich meinte bei _meiner_ Logitech spinnte gester die +-Taste, heute ist es wieder die xxxx-Taste ;)

            Somit brauche ich nur Cedrixxxx mit nur einem X zu tippen und erhalte Deinen Nick (ja, manchmal kommt noch ein xx dazu) ;)

            Mir ist aber lieber, dass wie heute das xxxx spinnt, denn das + braucht man beim Proggen öfters, und da heißt es aufpassen!

            Meine Tastatur wurde zum Hp mitgeliefert und tut seinen Dienst Perfekt! =)

            Bei mir wird es die letzte Logitech gewesen sein: die erlauben sich einfach zu viel, wie die [Einf]-Taste aus dem POS1/BILD/ENDE-Block einfach entfernt und wo anders, fast unsichtbar, platziert zu haben. Stattdessen hat die Taste eine Uhr und ein Taschenrecher, wer braucht denn sowas (die Uhrzeit habe ich in der Systray immer im Blickfeld und calc.exe ist eh besser als ein Rechner auf der Tastatur)?

            Viele Grüße aus Frankfurt/Main,
            Patrick

            --

            _ - jenseits vom delirium - _
            [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
            Nichts ist unmöglich? Doch!
            Heute schon gegökt?
            1. Hallo Patrick,

              Nein, ich meinte bei _meiner_ Logitech spinnte gester die +-Taste, heute ist es wieder die xxxx-Taste ;)

              Somit brauche ich nur Cedrixxxx mit nur einem X zu tippen und erhalte Deinen Nick (ja, manchmal kommt noch ein xx dazu) ;)

              das ist bei meiner Tastatur (Generalkeys) der Fall, wenn die Akkus fast leer sind. Erst werden einfach ein paar Buchstaben "vergessen" (ist Mist, wenn man sich seinen Text nicht nochmal durchliest), dann klemmt auf einmal eine gerade betätigte Taste. Der Buchstabe wird dann so lange wiederholt, bis man die Akkus herausnimmt.

              Wenn ich also mal einen Text mit fehlenden Buchstaben hier schreibe, war einfach der Akku fast leer. ;-)

              Bei mir wird es die letzte Logitech gewesen sein: die erlauben sich einfach zu viel, wie die [Einf]-Taste aus dem POS1/BILD/ENDE-Block einfach entfernt und wo anders, fast unsichtbar, platziert zu haben. Stattdessen hat die Taste eine Uhr und ein Taschenrecher, wer braucht denn sowas (die Uhrzeit habe ich in der Systray immer im Blickfeld und calc.exe ist eh besser als ein Rechner auf der Tastatur)?

              Das ist natürlich blöd, weil man sich ja doch an die normale Tastenanordnung gewöhnt hat. Da verzweifle ich immer, wenn ich mal mit dem Notebook arbeiten muss.

              Viele Grüße

              Jörg

              1. Hallo Jörg!

                Der Buchstabe wird dann so lange wiederholt, bis man die Akkus herausnimmt.

                Akkus scheinen aber nicht leer zu sein, und das jeweilige Zeichen wird nur ein paar Mal wiederholt: xxxxx xxxx xxxx xxxx xxxx. Und heute ist definitv xxxxx betroffen ;)

                Da verzweifle ich immer, wenn ich mal mit dem Notebook arbeiten muss.

                Da verzweifle ich nicht, da fluche ich ;)

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
                1. Re!

                  Und heute ist definitv xxxxx betroffen ;)

                  Heute ist es das ßßßß. Wie süßßßß!

                  Viele Grüße aus Frankfurt/Main,
                  Patrick

                  --

                  _ - jenseits vom delirium - _
                  [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                  Nichts ist unmöglich? Doch!
                  Heute schon gegökt?
                  1. Guten Morgen,

                    Und heute ist definitv xxxxx betroffen ;)

                    Heute ist es das ßßßß. Wie süßßßß!

                    hmmmmmmmmmmm … ;-)

                    Viele Grüße

                    Jörg

                2. Hi,

                  Und heute ist definitv xxxxx betroffen ;)

                  ist das ein neuer Pr0n-Sender, "Defini-TV XXX"?

                  *scnr*

                  Schönen Sonntag noch!
                  O'Brien

                  --
                  Frank und Buster: "Heya, wir sind hier um zu helfen!"
          2. Hi,

            Meine Tastatur wurde zum Hp mitgeliefert und tut seinen Dienst Perfekt! =)

            wieso tut _die_ Tastatur _seinen_ Dienst?

            Derartige Formulierungen fallen mir in letzter Zeit imer häufiger, sogar in den Printmedien, auf. :-(

            Schönen Sonntag noch!
            O'Brien

            --
            Frank und Buster: "Heya, wir sind hier um zu helfen!"
    2. Hallo,
      danke viel Mal für dieses Script.
      Funktioniert Tadellos!
      Merci MfG

      CedrixXx

    3. Guten Morgen Tom!

      Wie ich sehe, wurde Deine Frge bisher nicht beantwortet...

      Wie ich sehe bist du noch nicht ganz munter ... :-)

      if (!$con)  ### Keine Verbindung zum Datenbankserver verfügbar
        {
          html_ausgebe($fehlermeldung, "Der Datenbankserver ist nicht erreichbar: ");
          exit;    ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
        }

      Diese Fehlermeldungen in HTML auszugeben hat wenig Sinn. Der Anwender, der sie zu lesen bekommt kann sowieso nichts damit anfangen, geschweige denn am Zustand was ändern. Eine unspezifische Vertröstmeldung und eine Benachrichtigung des Administrators (z.B. per Mail) wäre in meinen Augen sinnvoller. (Das muss man ja nicht in aller Schönheit hier darstellen, aber die Fehlerbehandlung in der Richtung anzudeuten fände ich sinnvoller.)

      $db = mysql_select_db("usr_web252_1");  ## Auch diesen Link-Identifier könnte
                                                ## man später noch brauchen

      mysql_select_db() gibt ein booleschen Wert zurück, keinen Linkidentifier. Aber es schadet nicht, den Linkidentifier vom Connect hier explizit als Argument anzugeben (dito bei mysql_query()).

      echo "$verabschiedung $name";

      1. Hello,

        Wie ich sehe bist du noch nicht ganz munter ... :-)

        *gähn*

        if (!$con)  ### Keine Verbindung zum Datenbankserver verfügbar
          {
            html_ausgebe($fehlermeldung, "Der Datenbankserver ist nicht erreichbar: ");
            exit;    ### das sollte eigentlich am Ende der Funktion html_ausgabe() stehen.
          }

        Diese Fehlermeldungen in HTML auszugeben hat wenig Sinn.

        Es hat wohl Sinn, grundsätzlich eine valide HTML-Seite auszugeben und dem Client keinen losen String mit "die()" entgegenzuschleudern.
        In dieser Seite sollten dann auch geeignete Rücklinks zum Projekt enthalten sein und eine kleine Erkläreung/ Entschuldigung, warum der User die angefragte Leisttung nicht erhalten hat.

        $db = mysql_select_db("usr_web252_1");  ## Auch diesen Link-Identifier könnte
                                                  ## man später noch brauchen

        mysql_select_db() gibt ein booleschen Wert zurück, keinen Linkidentifier.

        Danke, das stimmt wohl ;-)
        Aber abfragen sollte man das Ergebnis schon, dafür ist es nämlich da!

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. echo $begrüßung;

          Diese Fehlermeldungen in HTML auszugeben hat wenig Sinn.
          Es hat wohl Sinn, grundsätzlich eine valide HTML-Seite auszugeben und dem Client keinen losen String mit "die()" entgegenzuschleudern.

          Ja, da stimme ich mit dir überein. die() ist schlechter, benutzerunfreundlicher Stil. Die Meldung in den sonst üblichen Seitenaufbau zu integrieren, so dass auch die Menüs, Fußzeilen und dergleichen zu sehen sind, ist wesentlich angenehmer für den Anwender.

          In dieser Seite sollten dann auch geeignete Rücklinks zum Projekt enthalten sein und eine kleine Erkläreung/ Entschuldigung, warum der User die angefragte Leisttung nicht erhalten hat.

          Den Benutzer interessieren aber die Details des Datenbankabfragefehlers nicht. Er muss im Prinzip noch nicht mal wissen, dass eine Datenbank im Spiel ist. Er kann bei dieser Art von Fehler nichts weiter ausrichten, weswegen er auch keine Details benötigt. Eine allgemeine Tröstmeldung mit dem Vorschlag, es später noch einmal zu probieren, reicht in meinen Augen aus. (Am besten mit einem Temporary Unavailable, aber diesen HTTP-Statuscode scheint es nicht zu geben.)

          echo "$verabschiedung $name";

          1. Hello,

            Eine allgemeine Tröstmeldung mit dem Vorschlag, es später noch einmal zu probieren, reicht in meinen Augen aus. (Am besten mit einem Temporary Unavailable, aber diesen HTTP-Statuscode scheint es nicht zu geben.)

            Da stimme ich Dir nun wieder zu.
            HTTP ud seine Entwicklungsstufe nebst HTML-Spezifikationen  sind immer noch arg verbesserungswürdig.

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

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
            Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

            1. Moin!

              Eine allgemeine Tröstmeldung mit dem Vorschlag, es später noch einmal zu probieren, reicht in meinen Augen aus. (Am besten mit einem Temporary Unavailable, aber diesen HTTP-Statuscode scheint es nicht zu geben.)

              Da stimme ich Dir nun wieder zu.
              HTTP ud seine Entwicklungsstufe nebst HTML-Spezifikationen  sind immer noch arg verbesserungswürdig.

              500 Internal Server Error paßt doch perfekt.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hello,

                [...] aber diesen HTTP-Statuscode scheint es nicht zu geben.)

                500 Internal Server Error paßt doch perfekt.

                Man soll ja auch bloß nicht zuviel verraten,
                lieber wieder ein paar bunte Bilder mitschicken ;-)

                Aber einen passenden Rücklink sollte man dem User schon mitsenden.

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

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau
                Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

                1. Moin!

                  500 Internal Server Error paßt doch perfekt.

                  Man soll ja auch bloß nicht zuviel verraten,
                  lieber wieder ein paar bunte Bilder mitschicken ;-)

                  Welchen Menschen interessiert denn der HTTP-Statuscode? Das ist ein Maschinencode für Maschinen. Für den Menschen ist der HTTP-Body relevant.

                  - Sven Rautenberg

                  --
                  "Love your nation - respect the others."
                  1. Hello,

                    Man soll ja auch bloß nicht zuviel verraten,
                    lieber wieder ein paar bunte Bilder mitschicken ;-)

                    Welchen Menschen interessiert denn der HTTP-Statuscode? Das ist ein Maschinencode für Maschinen. Für den Menschen ist der HTTP-Body relevant.

                    Sag ich doch ;-)

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

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau
                    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)