Database problem.
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abfrage
befehl
code
dank
datenbank
eintrag
eintragen
fehler
glauben
http
login
menge
not
problem
punkt
registrieren
semikolon
spalte
url
verbindung
-
Hallo.
Ich hab ein kleines problem.
Wenn man auf meiner seite http://sirinfinity1992.lima-city.de/EUKOchar/eintragen.html versucht ein account zu registrieren steht das es fehlgeschlagen ist.
Das problem ist, das erstemal gings. Also habe ich versuech, die ROW in der database zu löschen und einen neuen account machen, funktioniert super. Wieso funktioniert das nicht das die Database ne 2,3,4,5,usw. row macht?
Kann mir jemand helfeN? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
<?php $verbindung = mysql_connect("mysql.lima-city.de", "xxx" , "xxx") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); mysql_select_db("db_266693_1") or die ("Datenbank konnte nicht ausgewählt werden"); $username = $_POST["username"]; $passwort = $_POST["passwort"]; $passwort2 = $_POST["passwort2"]; if($passwort != $passwort2 OR $username == "" OR $passwort == "") { echo "Please fill in all fields correctly.. <a href=\"eintragen.html\">Zurück</a>"; exit; } $passwort = md5($passwort); $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); if($eintragen == true) { echo "Username<b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>"; } else { echo "Failed to save the Username. <a href=\"eintragen.html\">Back</a>"; } } else { echo "Username allready taken. <a href=\"eintragen.html\">Zurück</a>"; } ?>
-
Habe die mir fehlerhaft vorkommenden Stellen editiert... sollte funktionieren *ohne Gewähr*
[...] $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); [...]
-
Probiere es doch mal mit einem
. Zudem würde ich mysql-Abfragen immer möglichst genau senden. Alsomysql_error($verbindung)
. Einige SQL-Server sind da recht eigen.$eintrag = "INSERT INTO `login` (`username`, `passwort`) VALUES ('$username', '$passwort')";
Im gesamten also:<?php $verbindung = mysql_connect("mysql.lima-city.de", "xxx" , "xxx") or die("Verbindung zur Datenbank konnte nicht hergestellt werden"); mysql_select_db("db_266693_1") or die ("Datenbank konnte nicht ausgewählt werden"); $username = mysql_real_escape_string($_POST["username"]); $passwort = mysql_real_escape_string($_POST["passwort"]); $passwort2 = mysql_real_escape_string($_POST["passwort2"]); if($passwort != $passwort2 OR $username == "" OR $passwort == "") { echo "Please fill in all fields correctly.. <a href=\"eintragen.html\">Zurück</a>"; exit; } $passwort = md5($passwort); $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); if($eintragen == true) { echo "Username<b>$username</b> wurde erstellt. <a href=\"login.html\">Login</a>"; } else { echo "Failed to save the Username. ( ". mysql_error($verbindung) ."<a href=\"eintragen.html\">Back</a>"; } } else { echo "Username allready taken. <a href=\"eintragen.html\">Zurück</a>"; } ?>
EDIT: WICHTIG!: Verarbeite Eingaben von aussen niemals direkt in einer SQL-Abfrage. Den aktuellen Zustand könnten böse Menschen für eine Injection ausnutzen! Solange du nur übst, würde ich meinen Code ausschließlich lokal bearbeiten!
Beitrag zuletzt geändert: 18.9.2012 15:16:42 von notinthetext -
beide beiträge sind möglicherweise richtig :) also ihr versteht davon bestimmt mehr.
Trozdem selbe problem.
Wenn ich den bereits bestehenden Account in der Database lösche, kann ich EINEN neuen registrieren. Sobald in der Database aber ein Account besteht, geht das nicht mehr! :) oder besser :(
trozdem danke, hoffe habt noch paar tricks -
[...] $result = mysql_query("SELECT id FROM login WHERE username = '".$username."'"); [...]
Beitrag zuletzt geändert: 18.9.2012 15:24:10 von staymyfriend -
imernoch das selbe.
Ich warte mal. n kollege der informatiker ist schaut sich am abend an, der meint vllt habe ich vergessen iwie auto_increment und unique einzustellen. weiss aber nicht wie ich das machen soll xD -
ja, autoincrement ist nötig, wenn du solche Datensätze speichern möchtest. Geh mal in die Datenbank (phpMyAdmin), wähle die richtige Datenbank, die richtige Tabelle (login) aus und wechsle zu "Struktur". Dort siehst du jetzt die Spalte `id`. Dort sollte weiter unten/hinten AUTO_INCREMENT ausgewählt sein. Wenn das nicht funktioniert, versuche vorher die Spalte als "PRIMARY" zu kennzeichnen.
-
sirinfinity1992 schrieb:
ein
beide beiträge sind möglicherweise richtig :) also ihr versteht davon bestimmt mehr.
Trozdem selbe problem.
Wenn ich den bereits bestehenden Account in der Database lösche, kann ich EINEN neuen registrieren. Sobald in der Database aber ein Account besteht, geht das nicht mehr! :) oder besser :(
trozdem danke, hoffe habt noch paar tricks
sollte eigentlich auswerfen, welcher Fehler bei der Abfrage stattfand. Ich bin mit nicht ganz sicher, aber SQL-Befehle beendet man meines Wissens mit einem Semikolon. (;)mysql_error($verbindung
Also nochmal alles von vorne:
a) Verarbeite deine Variablen, bevor du sie verwendest. Unverarbeitete Variablen können zur SQL- oder Code-Injection führen.( Bzw. Cross-Site-Scripting )
b) Bearbeite die Webseite lokal, solange sie noch nicht fertig sind. Unter Windows gibt es Xampp, was für sowas hervorragend geeignet ist.
c) Lasse die Webseite, so wie sie ist, nicht online. Lösche sie möglichst bald. ( Auch hier gibt es bösartige Menschen, welche gerne mal die Schwäche von Anfängern ausnutzen. )
Zur Seite:
Die Auswahl der SQL-Verbindung sieht ganz ordentlich aus.
Bezüglich oben genannten Punkt a solltest du den Benutzernamen auf bestimmte Zeichen beschränken. Beispielsweise Buchstaben und Zahlen. (
) Damit wird eine Code- und SQL-Injection praktisch ausgeschlossen. Der Quick&Dirty-Way wäre einpreg_match('/^[0-9_a-Z]*$/',$var);
.mysql_real_escape_string()
Das Passwort solltest du lediglich als md5-hash speichern. Hast du ja richtig gemacht.
Dann zu den SQL-Befehlen: Zum einen gehören Tabellen-Namen, Feld-Namen und so weiter in mit Gravis (`) ausgeklammert. Dies dient dazu, dass keine internen Namenskonflikte auftreten. Wirklich professionell geht das dann glaube ich mit
. Zudem beendet man SQL-Befehle mit einem Semikolon (;), wie auch php-Befehle. Soll heißen:`tabellenname`.`passwort`
wäre afaik die korrekte Variante.$result = mysql_query("SELECT `id` FROM `login` WHERE `username` = '$username';");
Auto-Increment und und Primary-Key ( Beides auf die ID?)wählst du am besten in phpmyadmin aus. Dort ist das relativ einfach über die Tabelle->Struktur für das jeweilige Feld auswählbar.
Aber ich bin eigentlich auch kein Vollprofi in SQL und PHP. -
*1064 - 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 'BINARY NOT NULL' at line 1.. das steht wenn ich binary machen will
-
MySQL - errors dieser Art beschreiben mit 'near' immer an welchem Punkt der Query wörter/daten enthält, die nicht an diese Stelle gehören. Der Fehler liegt in dem Fall also ziemlich genau an "BINARY NOT ..". Versuche doch mal, den query über phpMyAdmin manuell auszuführen. Dafür gibt es den Reiter "SQL". Was der Fehler genau ist, weiß ich nicht. Für was ist das BINARY NOT NULL denn da und in welchem Kontext verwendest du das?
-
keine ahnung, mir wurde gesagt wie ichs machen soll xD oder mir wurde versucht zu erklären hab da wohl was falsches angeklicht.
Kann ich irgendwie via Kommandozeile auf meine database zugreifen?
Ty -
Ein nettes tool scheint auch HeidiSQL (http://www.heidisql.com/) zu sein. Habe ich auch erst gestern gefunden. Scheint aber fix und stabil zu sein. Darüberhinaus ist es auch schneller als phpMyAdmin, da nicht der gesamte HTML-Content mitgeladen wird und ist eben nicht so "seiten-diskret" wie ne einfache html-seite.
Beitrag zuletzt geändert: 19.9.2012 16:41:37 von s1m13 -
@sirinfinity1992:
lies doch bitte genau den Kommentar von staymyfriend durch, die Punkte sind wichtig und ergänze mit einem Semikolon,
also
"SELECT id FROM login WHERE username = '".$username."';"
lass doch den AbfrageString extra zusammen bauen,
also
$abfrage="SELECT id FROM login WHERE username = '".$username."';" echo $abfrage."<hr>"; $result=mysql_query($abfrage);
und poste den Inhalt von $abfrage, denn ich glaube der zusammengebaute Textbaustein (mittels der Punkte ;) ) wird wohl nicht korrekt sein.
Du kannst natürlich auch direkt in das HeidiSQL (gefällt mir persönlich übrigens auch sehr) Abfragefenster kopieren und ausführen.
gruß
edit: Danke, total veralteter Stil und Semikolon bei lima und php und mysql nicht notwendig,
bin einfach zu alt....
gruß
Beitrag zuletzt geändert: 20.9.2012 14:00:25 von harro -
Seit wann schreibt man ein Semikolon in eine SQL Abfrage (ist das jetzt Standard?) und warum hast du das verkettet:
?"SELECT id FROM login WHERE username = '".$username."';"
Bitte Quelle referenzieren damit ich's nachlesen kann.
MfG
Dominic -
Kurz rein:
Nein, MySQL erwartet kein Semikolon, und es gehört auch nicht zum guten Ton von MySQL. Im Gegenteil, auf Konsolenbasis kann man damit sogar Fehler erzeugen (kann, muss nicht). Es gibt allerdings SQL Dialekte, bzw Datenbanken, welche das Semikolon brauchen, ich glaube MSSQL braucht es, ich möchte aber nichts sicheres abgeben. Ein Semikolon ist nicht zu brauchen an einer MySQL Query, und sollte bei Möglichkeit auch vermieden werden.
Man könnte hierfür auch die Anmerkung hier als Empfehlung anführen:
Die Anweisung sollte nicht mit einem Semikolon abgeschlossen werden.
http://de.php.net/manual/de/function.mysql-query.php (bei dem Queryparameter)
Liebe Grüße -
Ich hab gemeint man könnte das:
auch so:"SELECT id FROM login WHERE username = '".$username."';"
schreiben."SELECT id FROM login WHERE username = '$username'"
MfG -
naturfit schrieb:
Das ist völlig richtig, aber wie hilft das jetzt dem TE?
Ich hab gemeint man könnte das:
auch so:"SELECT id FROM login WHERE username = '".$username."';"
schreiben."SELECT id FROM login WHERE username = '$username'"
sirinfinity1992 schrieb:
Das heißt eindeutig, dass kein Auto Increment für die Spalte ID eingestellt ist.
Wenn ich den bereits bestehenden Account in der Database lösche, kann ich EINEN neuen registrieren. Sobald in der Database aber ein Account besteht, geht das nicht mehr! :) oder besser :( -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage