Falsche Prüfsumme und andere Probleme
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anweisung
anzahl
beispiel
benutzername
code
dorf
funktion
komma
manual
operator
problem
raten
set
spalte
syntax
treffer
update
versuchen
verwenden
zeichenkette
-
Hallo,
Ich versuche mich gerade an einem kleinen Browserspiel-Projekt.
Bisher lief es auch ganz gut - jetzt stehe ich aber vor mehreren Problemen.
Ich teste das Script derzeit auf bplaced.net (falls das von Bedeutung sein sollte).
Ich bin derzeit dabei das Registrierungsscript zu schreiben, also auf dem man Accounts erstellen kann.
Jetzt gibt es zwei Probleme:
1. Die Spalte "Name" wird in der Datenbank nicht übernommen - Wenn ich bei PHPmyadmin schaue, ist diese einfach leer.
2. Der md5-Hash, der vom Passwort generiert wird, scheint falsch zu sein. Wenn ich mich mit dem erstellten Account in mein "Spiel" einloggen will (nachdem ich den Namen manuell eingetragen habe, weil das Registrationsscript das aus unerklärlichen Gründen ja nicht macht), gibt mir das Login-Formular die Meldung zurück, dass der Benutzername und/oder das Passwort falsch sei.
Ein Beispiel:
Von der Zahlenfolge "1234" erstellt mein Script folgenden Hash: d41d8cd98f00b204e9800998ecf8427e
Wenn ich 1234 in einem md5 Generator auf einer PHP-Website eingebe, erhalte ich aber einen ganz anderen Hash.
Kann es also möglich sein, dass der Server bei bplaced einen falschen Hash erzeugt?
Und warum wird der Name nicht übernommen? Was ist falsch?
Hier der Code:
(Bitte nicht wundern, das Script wird in ein anderes inkludiert)
<h1>Anmelden</h1> <?php if(!isset($_POST['name']) AND !isset($_POST['pass']) AND !isset($_POST['pass2']) AND !isset($_POST['agb'])) { ?> <center> <p> Vielen Dank für dein Interesse an unserem Spiel.<br>Um spielen zu können gebe unten bitte die benötigten Daten ein. </p> <form action="?page=register" method="post"> <table> <tr> <td align="right">Dein gewünschter Benutzername:</td><td align="left"><input type="text" name="name" size="15" maxlength="30" /></td> </tr> <tr> <td align="right">Dein gewünschtes Passwort:</td><td align="left"><input type="password" name="pass" size="15" /></td> </tr> <tr> <td align="right">Passwort wiederholen:</td><td align="left"><input type="password" name="pass2" size="15" /></td> </tr> <tr> <td align="right" colspan="2"><input type="checkbox" name="agb" value="agb" /> Ich akzeptiere die AGB</td> </tr> </table> <input type="submit" value="Registrieren" /> </form> </center> <?php } else { $reg_name = $_POST['name']; $reg_password = $_POST['pass']; $reg_password2 = $_POST['pass2']; $reg_agb = $_POST['agb']; if($reg_password != $reg_password2 OR $reg_name = "" OR $reg_password = "") { echo "Bitte alle Felder korrekt ausfüllen. <a href=\"?page=register\">Nochmal versuchen</a>"; exit; } $reg_password = md5($reg_password); $query = "SELECT id FROM accounts WHERE username = '$reg_name'"; $result = mysql_query($query); $anzahl = mysql_num_rows($result); if($anzahl == 0) { echo $reg_name . "-" . $reg_password; $query = "INSERT INTO accounts (username, password, active, capital) VALUES ('$reg_name', '$reg_password', '1', '0')"; $result1 = mysql_query($query); if($result1 == false) { echo "Erstellen nicht erfolgreich" . mysql_error(); } $query = "SELECT id FROM accounts ORDER BY id DESC LIMIT 1"; $result2 = mysql_query($query); $timestamp = time(); $village_name = $reg_name . "'s Dorf"; $query = "INSERT INTO villages (uid, name, username, x_position, y_position, capital, gold, lumber, iron, clay, last_resource_update, habitants, acceptance) VALUES ('$result2', '$village_name', '$reg_name', '1', '1', '1', '100', '100', '100', '100', '$timestamp', '3', '100')"; $result3 = mysql_query($query); echo "Dein Account wurde erstellt. <a href=\"?page=login\">Hier</a> kannst du dich einloggen."; } else { echo "Benutzername schon vorhanden. <a href=\"?page=register\">Hier</a> geht's zurück."; } } ?>
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Als Tipp: Der Hash ist Formatabhängig, das heißt der Hash von einer ASCII Zeichenkette ist anders, als der einer UTF-8 Zeichenkette. Vllt liegt es daran, weil das war auch bei mir mal ein Problem.
-
Update:
Ich habe jetzt herausgefunden, dass "d41d8cd98f00b204e9800998ecf8427e" der Hash für eine leere Zeichenkette ist.
Das heißt also, dass die POST-Variablen Name und Password nicht übergeben werden bzw. verloren gehen.
Was mache ich falsch? -
Öhöm, es gibt einen feinen Unterschied zwischen dem Assignment-Operator = und dem Comparison-Operator == . . .
mach mal aus:
if($reg_password != $reg_password2 OR $reg_name = "" OR $reg_password = "") {
ein:
if($reg_password != $reg_password2 OR $reg_name == "" OR $reg_password == "") {
Natürlich sind beide String leer, wenn du sie auf "" setzt.
Desweiteren läuft du in Schwierigkeiten mit deiner Insert-ID. Wenn sich zwei Spieler annähernd gleichzeitig anmelden, kann es bei deinem jetzigen Script passieren, dass ihre Accounts vertauscht werden. Du solltest hierfür mysql_insert_id nutzen (http://us2.php.net/manual/en/function.mysql-insert-id.php). Außerdem solltest du das Anlegen des Spielers und das Anlegen seines Dorfes in eine Transaktion packen, da ja das eine ohne das andere wenig Sinn macht.
cu
Beitrag zuletzt geändert: 2.8.2009 19:46:45 von census -
Hallo census,
Vielen Dank für deine Hilfe.
Ich habe die betreffende Stelle korrigiert. Mir ist natürlich klar, dass ich keinen Zuweisungsoperator für eine if-Anweisung verwenden kann, aber an der Stelle habe ich es einfach übersehen.
Mit mysql_insert_id habe ich noch nie gearbeitet - sollte man die Funktion verwenden oder ist sie eher ein Extra?
Könntest du mir ein Beispiel geben, wie ich das am besten mache? -
Als Alternative zu mysql_insert_id kannst du einfach:
$query = "SELECT id FROM accounts ORDER BY id DESC LIMIT 1";
in
$query = "SELECT id FROM accounts WHERE username = '".mysql_real_escape_string($reg_name)."';";
abändern.
mysql_insert_id ist aber natürlich einfacher.
Übrigens, du solltest dir mal die Funktion mysql_real_escape_string ansehen. Zwar sind auf Lima die magic_quotes aktiviert, aber man sollte immer sicher gehen. (Im Manual steht wie du die Aktiviertheit von magic_quotes überprüfen kannst und dir so eine eigene Replacementfunktion schreiben, die, falls mc aktiviert ist erstmal stripslashes() anwendet und erst dann mysql_real_escape_string().)
Weiterhin würde ich raten statt $reg_name != "" auf trim($reg_name) != "" zu prüfen. Oder ist bei dir " " ein Username? -
zerojan schrieb:
Hallo census,
Vielen Dank für deine Hilfe.
Ich habe die betreffende Stelle korrigiert. Mir ist natürlich klar, dass ich keinen Zuweisungsoperator für eine if-Anweisung verwenden kann, aber an der Stelle habe ich es einfach übersehen.
Mit mysql_insert_id habe ich noch nie gearbeitet - sollte man die Funktion verwenden oder ist sie eher ein Extra?
Könntest du mir ein Beispiel geben, wie ich das am besten mache?
Natürlich kann man den Zuweisungsoprator in if-Anweisungen verwenden. Der Zuweisungsoperator liefert den neuen Wert des L-Values zurück. Zum Beispiel liefert mysql_fetch_assoc dann FALSE zurück, wenn keine Zeile zurückgegeben wurde.
if ($row = mysql_fetch_assoc ($myResultSet) ) echo 'Treffer: ' . $row ['id']; else echo 'Kein Treffer';
Hierwurde der Zuweisungsoperator sinnvoll in einer if-Anweisung benutzt. Selbiges gilt für while oder andere Kontrollstatements:
while ($row = mysql_fetch_assoc ($myResultSet) ) echo $row ['id'];
oder
echo ($row = mysql_fetch_assoc ($myResultSet) ) ? 'Treffer: ' . $row ['id'] : 'Kein Treffer';
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
EDIT:
nikic schrieb: Weiterhin würde ich raten statt $reg_name != "" auf trim($reg_name) != "" zu prüfen. Oder ist bei dir " " ein Username?
Ist halt so ne Sache, was man als Nutzername zulässt, ich benutze in der Regel folgende Anforderungen.
[\w]?[\w\d]*
Beitrag zuletzt geändert: 2.8.2009 23:23:15 von census -
Hallo nochmal,
Es gibt ein neues Problem.
Seht ihr einen Fehler in dieser SQL-Syntax?
UPDATE villages Set lumber = '2375' clay = '1317' iron = '4066' WHERE id = '11'
Die Syntax wird automatisch aus Variablen erzeugt, ich habe sie mir mal per echo ausgeben lassen.
Und diese Fehlermeldung erhalte ich über mysql_error:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'clay = '1317' iron = '4066' WHERE id = '11'' at line 1
Könnt ihr mir helfen?
Beitrag zuletzt geändert: 10.8.2009 12:23:46 von zerojan -
Joar, dir fehlen Kommatas ;)
UPDATE villages Set lumber = '2375' clay = '1317' iron = '4066' WHERE id = '11'
Daraus machst du:
UPDATE villages Set lumber = '2375' , clay = '1317' , iron = '4066' WHERE id = '11'
Spalten werden immer mit einem Kommata abgetrennt sobald es mehr wie eine Spalte ist.
//e: ich werde alt - zu langsam -.-"
Beitrag zuletzt geändert: 10.8.2009 12:28:32 von evil-devil -
Vielen Dank,
Stimmt, ich habe es wirklich übersehen.
Bisher hatte ich UPDATE immer nur mit einer Spalte angewendet.
Ich und meine Fehler -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage