Ich nochmal, mysql-probleme mit INSERT

  • So, ich bins leider ncohmal, undzwar mit dem Problem:
    Ich ahbe hier register.php:


    und man kann einen benutzer erstellen, der wird dann aber komischerweise 2 mal in die db eingetragen, also doppelt. Wenn man dann einen zweiten registrieren will, wird der garnicht eingetragen, es wird aber ausgegeben, dass er das wurde. Weill man einen Nutzer mit dem Gleichen namen machen, kommt auch die korrekte Ausgabe. Aber was mach ich jetzt schon wieder falsch, google hilft mir da nicht, hab schon probiert, danke an alle im vorraus.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Den Teil


    solltest du dir nochmals ansehen, der ist Quatsch. Außerdem sollte du dich mal mit Bedingungen bei DB-Abfragen beschäftigen. Und dann ist auch noch dein HTML-Code mehr schlecht als recht. font ist veraltet und was dein <a> und </a> bewirken sollen, bleibt dein Geheimnis.

  • Danke für deine Antwort, bandit, aber der HTML Code ist nocht das Problem, der sdieht aus wie er soll, valide oder nicht. Und wiso soll der Teil mist sein, ich merk aber grad, da ich nochmal in meinem buch nach SELECT gesuch hab, dass $resultat->close(); fehlt. Ich probiers mit.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Der Teil ist Mist, weil er eben Mist ist!

    Ein fetch_array liefert einen Datensatz und nicht mehr! In millionen von Tutorials kann man nachlesen, wie man Datensätze ausliest.

  • Na und? Er muss nichts anderes als einen datensatz ausgeben! Und

    Zitat


    Er ist mist, weil er eben mist ist

    ist nicht wirklichi hilfreich, sorry. Und mit $resultat->close(); hat sich nichts geändert.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • ist nicht wirklichi hilfreich, sorry.


    Ein fetch_array liefert einen Datensatz und nicht mehr! In millionen von Tutorials kann man nachlesen, wie man Datensätze ausliest.

    Und nochmal: Beschäftige dich mal mit Bedingungen bei DB-Abfragen!!!

  • bandit, wieso soll der fehler beim auslesen liegen, wenn das eintragen nicht funktioniert? Es gibt in PHP folgendende SELECT-Bedingungen: WHERE, HAVING, GROUP BY, ORDER BY, LIMIT.
    UNd ich muss aber ALLES haben, daher ist das unnötg.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Is' ok, wenn du meinst! Wundere dich aber nicht, wenn User doppelt eingetragen werden. :( Wenn du nicht richtig ermittelst, ob der Username schon vorhanden ist, wird er eben mehrfach eingetragen. Aber wenn du nicht auf mich hören willst, bitte, du bist ja der Fachmann.

  • Ok, ich glaub wir verstehen uns miss.
    Ich schicke POST-Daten an die PHP, aber die trägt sie doppelt ein.
    Wenn ich jetzt hergehe und versuche, den gelichen benutzernamen zu registrieren, dann bekomme ich die meldung, das er bereits existiert. Aber wenn ich versuche, einen anderen zu registrieren, dann erhalte ich die meldung, es sei erfolgreich, aber es wird nichts eingetragen.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Wenn du die Meldung bekommst, dass der Username existiert, dann hast du den ersten Namen eingeben, wenn du den zweiten Namen in der Tabelle nimmst, geht es schon nicht mehr!

    Richtig debuggen
    1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
    2. Man schreibt an den Anfang des Scriptes die Zeile: error_reporting(E_ALL); und ini_set("display_errors", true);
    3. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
    4. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
    5. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
    6. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
    7. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
    8. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

    Ich bedanke mich für dieses Gespräch und bin dann mal weg!

  • Ich merke gerade, dass mein fehler bei der asugabe der datenbankinhalte war, nicht im registerscript. Aber aus irgendeinem grund, werden jetzt die Daten dazugeschreiben. Ich hatte nur nie versucht, mich mit dem neuen account einzuloggen, weil in der ausgabe immer stnad, er sei nicht da.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Du hast wirklich noch Grundlagen im Umgang mit Datenbanken dringend nötig, da muß ich Bandit recht geben.

    So, nehmen wir mal an deine Tabelle users sieht so aus:

    Code
    id | username
    ---+---------
     1 | Peter
     2 | Hans
     3 | Maria
     4 | Jan
     5 | Petra

    In $resultat hast du dann nach dem Ausführen deines Queries eine Resource-Id zu einem Ergebnis mit der kompletten Liste aller User.
    Aber du rufst nur die erste Zeile ab.
    $db->query() liefert dir nur eine Ergebnis-Resource, die Ergebniszeilen aus dieser Resource musst du aber einzeln nacheinander mit $resultat->fetch_array() abholen.

    Was dein Code macht:
    Er feuert mit $db->query() die Abfrage raus und speichert die Ergebnis-Resource in $resultat.
    Dann holst du mit $resultat->fetch_array() nur die erste Zeile aus deinem Ergebnis ab, also den Namen Peter aus meiner Beispieltabelle.
    Dein Array $ergeb sieht dann so aus:

    Code
    $ergeb ( 1=>"Peter )

    Mehr steht da nicht drin. Das heißt deine Überprüfung checkt nur den ersten Namen der von deiner Abfrage zurückgegeben wird. Alle anderen können dann so oft eingetragen werden wie sie wollen. Also Sinn voll verfehlt.
    Wenn du dir auch nur ein vernünftiges Tutorial zum Umgang mit PHP und MySQL richtig angesehen hättest wüßtest du das.

    Ganz davon abgesehen ist deine Lösung von der Performance her katastrophal. Wieso denn bitte alle User auslesen und dann mit PHP durchlaufen zum vergleichen? SQL ist viel schneller als PHP, alles was sich irgendwie schon vor der Bearbeitung durch PHP mit SQL filtern lässt sollte man auch tun.
    D.h. du erweiterst deine SELECT-Abfrage um eine WHERE-Klausel (SELECT username FROM users WHERE username='$user'). Wenn du jetzt eine Ergebniszeile zurückbekommst ist der Name bereits vergeben, wenn du keine zurück bekommst ist er noch frei.

    Achja, und nur weil du mysqli verwendest kannst du nicht auf das escapen der Usereingaben verzichten. Entweder den real_escape_string drüberlaufen lassen oder prepared Statements verwenden.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook