kostenloser Webspace werbefrei: lima-city


Database problem.

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sirinfinity1992

    sirinfinity1992 hat kostenlosen Webspace.

    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?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ohne den entsprechenden Quellcode wird Dir wohl niemand helfen können... ich kenne keinen Hellseher, der sich auch mit Webdesign auskennt :biggrin:
    Poste einfach den Inhalt der Datei "eintragen.php" und wir schauen weiter...
  4. Autor dieses Themas

    sirinfinity1992

    sirinfinity1992 hat kostenlosen Webspace.

    <?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>";
        }
    ?>
  5. Habe die mir fehlerhaft vorkommenden Stellen editiert... sollte funktionieren *ohne Gewähr* :blah:
    [...]
    
    $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);
    
    [...]
  6. Probiere es doch mal mit einem
    mysql_error($verbindung)
    . Zudem würde ich mysql-Abfragen immer möglichst genau senden. Also
    $eintrag = "INSERT INTO `login` (`username`, `passwort`) VALUES ('$username', '$passwort')";
    . Einige SQL-Server sind da recht eigen.

    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
  7. Autor dieses Themas

    sirinfinity1992

    sirinfinity1992 hat kostenlosen Webspace.

    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
  8. [...]
    
    $result = mysql_query("SELECT id FROM login WHERE username = '".$username."'");
    
    [...]


    Beitrag zuletzt geändert: 18.9.2012 15:24:10 von staymyfriend
  9. Autor dieses Themas

    sirinfinity1992

    sirinfinity1992 hat kostenlosen Webspace.

    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
  10. 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.
  11. sirinfinity1992 schrieb:
    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
    ein
    mysql_error($verbindung
    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. (;)

    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. (
    preg_match('/^[0-9_a-Z]*$/',$var);
    ) Damit wird eine Code- und SQL-Injection praktisch ausgeschlossen. Der Quick&Dirty-Way wäre ein
    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
    `tabellenname`.`passwort`
    . Zudem beendet man SQL-Befehle mit einem Semikolon (;), wie auch php-Befehle. Soll heißen:
    $result = mysql_query("SELECT `id` FROM `login` WHERE `username` = '$username';");
    wäre afaik die korrekte Variante.

    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.
  12. Autor dieses Themas

    sirinfinity1992

    sirinfinity1992 hat kostenlosen Webspace.

    *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
  13. 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?
  14. Autor dieses Themas

    sirinfinity1992

    sirinfinity1992 hat kostenlosen Webspace.

    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
  15. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    sirinfinity1992 schrieb:
    Kann ich irgendwie via Kommandozeile auf meine database zugreifen?
    Ja, das geht auch (vorausgesetzt du hast das Tool installiert, es kommt aber z.b. bei xampp mit): *klick*

    Beitrag zuletzt geändert: 18.9.2012 16:47:41 von hackyourlife
  16. 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
  17. @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
  18. 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
  19. g****e

    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
  20. Ich hab gemeint man könnte das:
    "SELECT id FROM login WHERE username = '".$username."';"
    auch so:
    "SELECT id FROM login WHERE username = '$username'"
    schreiben.

    MfG
  21. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    naturfit schrieb:
    Ich hab gemeint man könnte das:
    "SELECT id FROM login WHERE username = '".$username."';"
    auch so:
    "SELECT id FROM login WHERE username = '$username'"
    schreiben.
    Das ist völlig richtig, aber wie hilft das jetzt dem TE?

    sirinfinity1992 schrieb:
    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 :(
    Das heißt eindeutig, dass kein Auto Increment für die Spalte ID eingestellt ist.
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!