dedlfix: In Datenbank wird nichts geschrieben

Beitrag lesen

Hi!

Folgendes Problem: Wenn ich mich registrieren will, wird nichts in die Datenbank geschrieben! Kennt ihr dieses Problem?

Nein, nicht direkt. Diese Beschreibung ist zu allgemein, der Ursachen kann es viele haben. Denen kann und muss man sich durch Debugging nähern, wenn man die Stelle nicht durch Betrachten des Codes findet. Je länger der Code ist desto geringer wird die Lust, sich da durchzuarbeiten, besonders wenn er viele unrelevante Teile enthält. Tu also bitte dir und uns den Gefallen und grenze den Fehler weiter ein. Dazu kannst du mit Kontrollausgaben von Variableninhalten und Rückgabewerten der Funktionen ermitteln, wo Wunsch und Wirklichkeit auseinanderlaufen. Für Kontrollausgaben liefert var_dump() die genauesten Werte. Eine weitere Strategie ist, das Problem durch Streichen von unrelevanten Code einzukreisen. Je weniger Code übrigbleibt, desto einfacher lässt sich dieser untersuchen und Tests an ihm vornehmen.

error_reporting(E_ALL);
ini_set('display_errors', 1);

Das ist schonmal sehr gut. Allerdings fügen sich die MySQL-Funktionen nicht so richtig in das Fehlermeldungskonzept PHPs ein. Sie hängen in der Datenbank aufgetretene Fehler nicht an die große Glocke sondern signalisieren sie leise über ihren Rückgabewert. Frag also bitte immer die Rückgabewerte auf einen Fehlerzustand ab.

$db = @new MySQLi('localhost', 'root', 'test', 'test');
if (mysqli_connect_errno()) {
    $ret = 'Konnte keine Verbindung zu Datenbank aufbauen, MySQL meldete: '.mysqli_connect_error();
} else if (is_string($error = getUserID($db))) { // String, also ein MySQL Fehler
    $ret = $error; // die Fehlermeldung in $ret speichern, damit sie angezeigt wird.
} else {

Dein Code ist ja schon einigermaßen gut strukturiert und reagiert auch auf viele Fehlerstände, wie dieses Beispiel zeigt. Allerdings macht er das nicht überall.

$stmt = $db->prepare($sql);
    if (!$stmt) {
        return $db->error;
    }
    $stmt->bind_param('s', $Username);
    $stmt->execute();
    $stmt->store_result();

Das Prepare prüfst du noch. Bind schon nicht mehr. Wichtiger ist jedoch das Execute, denn da passiert die eigentliche Abfrage und potentiell die meisten Fehler.

$stmt = $db->prepare($sql);
    if (!$stmt) {
        return $db->error;
    }
    $stmt->bind_param('ss', $Username, $Email);
    if (!$stmt->execute()) {
        return $stmt->error;
    }

Kurz danach bist du wieder fast vorbildlich. Zumindest das Execute ist "gesichert".

Wie auch immer, versuch den Fehler weiter einzugrenzen. Wenn du die Möglichkeit hast, kannst du auch ein Query-Log im MySQL-Server einrichten, dann siehst du, welche Statements in welcher Reihenfolge abgearbeitet werden (und demzufolge auch, welche nicht).

Lo!