Alex: Abfrage funktioniert nicht richtig

Hallo, allerseits!

Ich hab ein kleines Problem bei einer Datenbankabfrage, das für Euch bestimmt leicht lösbar ist, mich Anfänger aber vor ein großes Rätsel stellt:

Ein User kann sich registrieren. Zur Verifizierung erhält er eine E-Mail an die von ihm angegebene Adresse mit einem zufällig erstellten Verifizierungscode - z.B. 1de4d33f333fd322d33434d2ddd. Der Code kann alle Buchstaben enthalten außer den Umlauten und alle Ziffern, er ist zwischen 18 und 20 Zeichen lang. Derselbe Code, den der User per E-Mail zur Verifizierung kriegt, wird auch bei der Registrierung in die entsprechende Tabelle zu seinem Datensatz geschrieben. Wenn der User nun auf den Link in seiner E-Mail klickt, vergleicht das System, ob der mittels get-Funktion übergebene Code mit dem in der Tabelle gespeicherten übereinstimmt. Tut er das, wird der User freigeschaltet.

So weit, so klar. Ist ein übliches Verfahren, wenn man sich irgendwo registriert.

Mein Problem ist nun folgendes:
Wenn ich einstelle, daß der zufällig erstellte Code nur aus Ziffern bestehen darf - also z.B. 12233888599388372 -, dann funktioniert diese Abfrage einwandfrei und das System ändert den Eintrag für die Verifizierung von -1 auf 1, womit der User sich freigeschaltet hat.

Wenn ich jedoch Buchstaben und Ziffern in besagtem Zufallscode vermische - de34h8d83hd822dd883 - und dann die Übereinstimmung mittels eines Links - z.B. index.php?vcode=de34h8d83hd822dd883 - überprüfen will, dann passiert einfach gar nichts. Ich kriege keine Fehlermeldung, aber die Verifizierung wird auch nicht durchgeführt, d.h. der Eintrag für den Status der Verifizierung bleibt hartnäckig -1.

Ich verstehe nun nicht, woran das liegt. Da der Vergleich von einem Code nur aus Ziffern aber einwandfrei funktioniert, vermute ich, daß ich in der Datenbank beim Feld für die Verifizierung - "vcode" - was falsch eingestellt habe. Ich habe aber bereits alles Mögliche durchprobiert: CHAR, VARCHAR, TEXT, etc.

Hat einer von Euch eine Idee, wo das Problem liegen könnte?

Besten Dank schon mal!

Alex

  1. beim Verifizierungs-Schritt würde ich mal beide keys via echo ausgeben lassen (untereinander) und schauen ob sie wirklich identisch sind. Danahc auch mal sehen ob strlen() bei beiden das gleiche ergebnis hervorbringt (kann ja sein dass du whitespaces am ende hast).

    Ansonsten wüsste ich wirklich nicht woran es liegen soll.

    Vielleicht solltest du mal diene abfrage hier posten

    grüsse

  2. Hello Alex,

    Ich verstehe nun nicht, woran das liegt. Da der Vergleich von einem Code nur aus Ziffern aber einwandfrei funktioniert, vermute ich, daß ich in der Datenbank beim Feld für die Verifizierung - "vcode" - was falsch eingestellt habe. Ich habe aber bereits alles Mögliche durchprobiert: CHAR, VARCHAR, TEXT, etc.

    Hat einer von Euch eine Idee, wo das Problem liegen könnte?

    Wie lautet denn das SQL-Statement, dass Du für die Verifizierung benutzt?

    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. Also, hiermit erzeuge ich den Zufallscode, momentan halt ohne Buchstaben:

      function erzeuge_vcode($anzahl=21) {
          $zeichen=array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
          for ($i=0;$i<$anzahl;$i++) {
              $pw .=$zeichen[rand(0,count($zeichen))];
              }
          return $pw;
      }

      Und das hier ist der String, mittels dessen ich die Übereinstimmung überprüfe und das Feld für die Verifizierung ändere:

      $code=$_GET[vcode];

      $sql_newsletter="UPDATE $tabellenewsletter SET verified=1 WHERE v_code=$code";

      Hello Alex,

      Ich verstehe nun nicht, woran das liegt. Da der Vergleich von einem Code nur aus Ziffern aber einwandfrei funktioniert, vermute ich, daß ich in der Datenbank beim Feld für die Verifizierung - "vcode" - was falsch eingestellt habe. Ich habe aber bereits alles Mögliche durchprobiert: CHAR, VARCHAR, TEXT, etc.

      Hat einer von Euch eine Idee, wo das Problem liegen könnte?

      Wie lautet denn das SQL-Statement, dass Du für die Verifizierung benutzt?

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

      Tom

      1. Hello,

        Und das hier ist der String, mittels dessen ich die Übereinstimmung überprüfe und das Feld für die Verifizierung ändere:

        $code=$_GET[vcode];

        $sql_newsletter="UPDATE $tabellenewsletter SET verified=1 WHERE v_code = $code ";

        --   --

        Bei MySQL:
          $res = mysql_query($sql, $con);
          if (mysql_errno($con) > 0) { echo mysql_error($con); }

        das sollte Dir eigentlich den passenden Hinweis geben.

        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. Hallo!

          Vielen Dank erst mal!

          Ich hab Deinen Code eingebunden und mir die verschiedenen Error-Meldungen angesehen.

          Jetzt hab ich den String folgendermaßen geändert:

          $sql_newsletter="UPDATE $tabellennewsletter SET verified=1 WHERE v_code=".$_GET[vcode];

          Die Übergabe des Codes erfolgt jetzt auch. Aber ich krieg folgende Fehlermeldung:

          Unknown column 'c20d62ad476db143d5' in 'where clause'

          Das Lustige ist jetzt aber, daß Buchstabe für Buchstabe und Ziffer für Ziffer exakt derselbe Code im Feld v_code steht. Das Feld v_code ist ein VARCHAR mit einer angegebenen Maximallänge von 20, utf8_unicode_ci und standardmäßig NULL.

          Wo liegt der Fehler denn jetzt? Also, übergeben kriegt er den Code jetzt ...

          Hello,

          Und das hier ist der String, mittels dessen ich die Übereinstimmung überprüfe und das Feld für die Verifizierung ändere:

          $code=$_GET[vcode];

          $sql_newsletter="UPDATE $tabellenewsletter SET verified=1 WHERE v_code = $code ";
                                                                                     --   --

          Bei MySQL:
            $res = mysql_query($sql, $con);
            if (mysql_errno($con) > 0) { echo mysql_error($con); }

          das sollte Dir eigentlich den passenden Hinweis geben.

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

          Tom

          1. Hallo Alex,

            Die Übergabe des Codes erfolgt jetzt auch. Aber ich krieg folgende Fehlermeldung:

            Unknown column 'c20d62ad476db143d5' in 'where clause'

            Nunja, diese Spalte gibt es in Deiner Tabelle nicht.
            Zeichenketten sind in SQL in Anführungszeichen einzuschließen.

            Zahlen können bei MySQL ohne Anführungszeichen verwendet werden, andere Datenbankmanagementsysteme verlangen sogar, dass keine Anführungszeichen verwendet werden. Spaltennamen dürfen nicht mit Ziffern beginnen.

            Noch ein Hinweis:
            Verwende mysql_real_escape_string() um Deinen Get-Parameter zu entschärfen. Dabei musst Du die Einstellung der Magic Quotes berücksichtigen, so wie es im verlinkten Handbuchabschnitt beschrieben ist.

            Freundliche Grüße

            Vinzenz

            1. Hallo, Vinzen!

              Vielen Dank! Bei mysql_real_escape_string() hab ich gesehen, wie ich den Code richtig übergebe. Jetzt funktioniert's!

              Dafür hab ich eine andere Frage: Was hat es mit diesem mysql_real_escape_string() auf sich und mit SQL Injection Angriffen? In den - zugegeben dünneren - Büchern, die ich über PHP und MySQL hab, steht davon nichts drinnen. Und aus dem Text auf php.net werd ich nicht so ganz schlau. Ich vermute allerdings, daß es irgendwas mit der Sicherheit zu tun hat. Hast Du zufällig einen Link zu einer guten Website, wo das ausführlicher und auch für einen Anfänger verständlich erklärt ist? Ich würde das gern benutzen, aber wie gesagt werd ich aus den Erklärungen auf php.net nicht ganz schlau ..

              Vielen Dank!

              Alex

              Hallo Alex,

              Die Übergabe des Codes erfolgt jetzt auch. Aber ich krieg folgende Fehlermeldung:

              Unknown column 'c20d62ad476db143d5' in 'where clause'

              Nunja, diese Spalte gibt es in Deiner Tabelle nicht.
              Zeichenketten sind in SQL in Anführungszeichen einzuschließen.

              Zahlen können bei MySQL ohne Anführungszeichen verwendet werden, andere Datenbankmanagementsysteme verlangen sogar, dass keine Anführungszeichen verwendet werden. Spaltennamen dürfen nicht mit Ziffern beginnen.

              Noch ein Hinweis:
              Verwende mysql_real_escape_string() um Deinen Get-Parameter zu entschärfen. Dabei musst Du die Einstellung der Magic Quotes berücksichtigen, so wie es im verlinkten Handbuchabschnitt beschrieben ist.

              Freundliche Grüße

              Vinzenz