Announcement

Collapse
No announcement yet.

Abfragenfehler

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfragenfehler

    Hallo alle zusammen!

    Seit Stunden hock ich an nem Registrierformular mit zugehörigem PHP und MySQL code.

    Schaut euch bitte folgendes an und sagt mir ob ich blind bin:


    Code:
     if ($username_anfrage != 0)
        {
            $err_1 = "Benutzename schon vergeben. Bitte einen anderen w&auml;hlen <br/>";
        }
    
    //Prüfen ob email schon in benutzung
    $email_anfrage = mysql_query("SELECT id FROM user WHERE email LIKE '$email'");
    $anzahl_email = mysql_num_rows($email_anfrage);
    
     if ($email_anfrage != 0)
        {
            $err_2 = "Es ist bereits jemand mit dieser e-mail Adresse registriert. <br/>";
        }
    
    
    $err_server = "$err_1 $err_2";
    
    
    
    if ($err_server == 0)
    
        {
    Ich bekomme die Fehle ausgegeben wie ich das gerne hätte, daher kann $err_server keinesfalls 0 sein. Trotzdem wird der code danach (schreiben der daten in die Datenbank) ausgeführt. Ich verzweifel hier grad weil ich nicht verstehe wie sowas zustande kommen kann...

    An einer anderen Stelle hab ich genau das gleiche stehen und es funktiontert.
    Kennt ihr das, dass ihr am Skripten seid und zwischendrin denk "das kann doch grad unmöglich sein..."

    Erlöst mich von dieser Unlogik = /

    Freundlichste Grüße

  • #2
    Wieso weist du $err_server einen String zu und vergleichst dann auf 0, wäre die erste Frage
    Christian

    Comment


    • #3
      Hallo,
      Originally posted by Wuselpuff View Post
      ...Erlöst mich von dieser Unlogik = /
      das ist keine "Unlogik", dass ist die Konsequenz daraus, dass PHP keine festen Datentypen kennt, und bei Vergleichen implizit den Einen in den Anderen umwandelt.

      Durch die Zuweisung:
      PHP Code:
      $err_server "$err_1 $err_2"
      legst du $err_server explizit als String an. Diesen prüfts du jetzt auf einfache Gleichheit mit einer numerischen Null:
      PHP Code:
      if ($err_server == 0
      Um diesen Vergleich durchführen zu können, wandelt PHP den String implizit in eine Zahl um. Lässt sich der String nicht zu einer Zahl konvertieren, weil er keine Ziffern enthält, dann wird er zu numerisch Null (0) konvertiert! Und 0 istnumal gleich 0! Deine Prüfung ergibt also für jeden $err_server TRUE (es sein denn dieser enthält irgendeine Ziffernfolge).

      Vermeiden kannst du das, indem du eine korrekte Prüfung vornimmst. Du solltest also EXAKT definieren, wie deine Erfolgsbedingung aussieht. z.B.:
      PHP Code:
      if (empty($err_1) && empty($err_2)) {
      ... 
      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Versuchs mal so:

        PHP Code:
        if (!empty($username_anfrage)) {
            
        $err_1 "Benutzename schon vergeben. Bitte einen anderen w&auml;hlen <br/>";
        }

        //Prüfen ob email schon in benutzung
        $email_anfrage mysql_query("SELECT id FROM user WHERE email = '" $email "'");
        $anzahl_email mysql_fetch_array($email_anfrage);

        if (!empty(
        $email_anfrage)) {
            
        $err_2 "Es ist bereits jemand mit dieser e-mail Adresse registriert. <br/>";
        }

        $err_server $err_1 $err_2;

        if (!empty(
        $err_server)) {
            echo 
        $err_server."\n";

        Wenn du die Email_Addy auslesen willst, brauchst du nicht mit LIKE arbeiten, du möchtest doch die gesamt Adresse testen und nicht nur Teile davon, oder ?
        Und mit != 0 Strings prüfen ist nicht gerade sauber.
        Zuletzt editiert von madmix; 31.01.2011, 10:50.

        Comment


        • #5
          Danke für die hilfreichen Antworten.

          Das mit dem String und Integer war mir auch klar.
          Komischerweise funktioniert es an anderer Stelle nur so....
          Da hab ich ebenfalls $err_gesamt = "$err_1 $err_2 $err_3" und dann


          if ($err_gesamt == 0)

          { bla


          Da ging das auch nur mit der 0 und ich hatte mich vorher ewig gefragt warum es mit "" nicht ging. Diese if-Abfrage geht deshalb weil die Bedingung dann war ist wenn der String leer ist. Kann ich das so stehen lassen oder ist das unsauberes Coding? DIe Erklärungen finde ich sehr sinnvoll, jetzt versteh ich die "Unlogik"

          //edit:

          $err_gesamt ==0 bedeutet doch in dem fall dass der String leer ist, also null.
          Wieso ist dann der andere Vergleich ein Vergleich mit einer numerischen null?
          Wie weiß PHP ob ich etwas mit der Zahl 0 vergleichen will oder prüfen will ob eine Variable leer ist?
          Ich dachte auch, dass jede Variable die im Skript noch nicht genannt worden ist bzw keinen Wert zugewiesen bekommen hat grundsätzlich 0 ist.
          Wenn PHP den string mit 0 vergleicht kommt dann "" != 0 heraus weil ein leerer String nicht null ist? Heißt das "nichts" ist nicht Null? oO

          Comment


          • #6
            Originally posted by Wuselpuff View Post
            Wie weiß PHP ob ich etwas mit der Zahl 0 vergleichen will oder prüfen will ob eine Variable leer ist?
            Ich dachte auch, dass jede Variable die im Skript noch nicht genannt worden ist bzw keinen Wert zugewiesen bekommen hat grundsätzlich 0 ist.
            Wenn PHP den string mit 0 vergleicht kommt dann "" != 0 heraus weil ein leerer String nicht null ist? Heißt das "nichts" ist nicht Null? oO
            Ein Leerzeichen ist in dem Sinne auch nichts, macht aber aus der 0 eine 1

            Ähnlich wie 0 verhält es sich mit true/false.
            Hier wird ein Leerzeichen auch als 1 od. true erkannt.

            Wobei 'empty' den Leerstring dann dennoch als Leer erkennt,
            wenn der String einen nicht-leeren und von 0 verschiedenen Wert hat.

            Daher das Unsauber....

            P.S.Eine Variable die Leer ist bekommt nicht 0 sondern NULL zugewiesen, was ein himmelweiter Unterschied ist, weil auch 0 einen Wert darstellt.

            Comment


            • #7
              Originally posted by Wuselpuff View Post
              ...Da ging das auch nur mit der 0 und ich hatte mich vorher ewig gefragt warum es mit "" nicht ging. Diese if-Abfrage geht deshalb weil die Bedingung dann war ist wenn der String leer ist. Kann ich das so stehen lassen oder ist das unsauberes Coding?
              ...

              $err_gesamt ==0 bedeutet doch in dem fall dass der String leer ist, also null.
              Wieso ist dann der andere Vergleich ein Vergleich mit einer numerischen null?
              Nein, dass ist alles Unsinn! Hast du verstanden was ich mit der impliziten Typumwandlung gemeint habe?

              Zur Verdeutlichung:
              PHP Code:
              $strings = array(
               
              '',
               
              ' ',
               
              'Hallo',
               
              '0',
               
              '000',
               
              '0.0',
               
              '1234',
               
              '007 Bond',
               
              '00 WC',
               
              'Hallo12'
              );

              foreach(
              $strings as $str) {
                echo (
              $str == 'Der String "'.$str.'" ist gleich 0!' 'Der String '.$str.' ist ungleich 0!').'<br />';

              Ergebnis:

              Der String "" ist gleich 0!
              Der String " " ist gleich 0!
              Der String "Hallo" ist gleich 0!
              Der String "0" ist gleich 0!
              Der String 1234 ist ungleich 0!
              Der String 12Hallo ist ungleich 0!
              Der String "Hallo12" ist gleich 0!

              Es wird immer versucht den String in eine Zahl zu konvertieren! Der Vergleich mit der numerischen 0 ist nur dann falsch, wenn der String eine Zahl != 0 darstellt oder mit einer Zahl != 0 beginnt. Ansonsten ist dieser Vergleich IMMER wahr!

              Originally posted by Wuselpuff View Post
              ...Wie weiß PHP ob ich etwas mit der Zahl 0 vergleichen will oder prüfen will ob eine Variable leer ist?
              Das sind zwei völlig verschiedene Paar Schuhe! Für einen Vergleich mit 0 verwendest du == oder besser ===. Willst du dagegen überprüfen ob eine Variable leer ist, verwendest du empty() und für die Prüfung ob eine Variable bereits initialisiert und verschieden von NULL ist, gibt es isset().

              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Vieeeelen Dank! Ihr seid die Besten =)
                ich bin echt ein geübter google-user, aber bis ich das alles so im Detail herausgefunden hätte...

                Werd es direkt anwenden!

                Comment


                • #9
                  Dass mein Code noch unsauber ist liegt daran dass ich von dem empty Befehl leider nichts wusste.
                  Meine Quelle für die Umsetzung stammt von php-einfach.de

                  Code:
                  $result = mysql_query("SELECT id FROM login WHERE username LIKE '$username'");
                  $menge = mysql_num_rows($result);
                  
                  if($menge == 0)
                      {
                      $eintrag = "INSERT INTO login (username, passwort) VALUES ('$username', '$passwort')";
                      $eintragen = mysql_query($eintrag);
                  Hier wird auch mit LIKE gearbeitet, was doch aber falsche ergebnisse liefert für usernames die sich ähneln wie zB Mike und Mik004 oder sowas...

                  Comment


                  • #10
                    Originally posted by Wuselpuff View Post
                    ...Hier wird auch mit LIKE gearbeitet, was doch aber falsche ergebnisse liefert für usernames die sich ähneln wie zB Mike und Mik004 oder sowas...
                    Solange im Suchstring keine Platzhalter (%, ?) enthalten sind, solange ist das LIKE völlig sinnlos! In solchen Fällen sollte immer ein = verwendet werden.

                    Im Endeffekt ist jedoch die Gesamte Logik etwas fragwürdig. Dem Resultat von mysql_num_rows kann nicht in jedem Fall vertraut werden. Zumindest nicht bei der Verwendung von unbuffered Queries und solange kein Fetch erfolgt ist. Warum nicht einfach per SQL die Anzahl ermitteln, wenn man genau die Wissen will?

                    Auch ist dieses Vorgehen nicht Mehrbenutzerfähig! Was ist wenn zwischen dem Select und dem Insert eine andere Session genau diesen User angelegt hat?

                    Gruss Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment

                    Working...
                    X