Abfrage funktioniert nicht richtig
Alex
- datenbank
1 Markus Speicherl0 Tom
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
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
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

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.deTom
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

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.deTom
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
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