PHP UPDATE Statement will sich nicht ausführen lassen

Cr41s3

Ensign
Registriert
Dez. 2012
Beiträge
246
Hallo zusammen.

Ich hänge aktuell an folgendem Problem fest:

PHP:
if (empty($error_msg)) {
                    $random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));

                    $password = hash('sha512', $password . $random_salt);
                    $resetcodebasic = 'special';

                    $update_prep_stmt = "UPDATE users SET password='?', salt='?', resetcode='?' WHERE name = '?')";
                    $update_stmt = $mysqli->prepare($update_prep_stmt);

                    if ($update_stmt) {
                        $update_stmt->bind_param('ssss', $password, $random_salt, $resetcodebasic, $username);
                        if (!$update_stmt->execute()) {
                            header('Location: ../error.php?err=Update failure: INSERT');
                        }
                        header('Location: ../reset2_success.php');
                    }

                    //mysqli_query($mysqli,"UPDATE users SET resetcode = 'special' WHERE name = '$username'");

                    header('Location: ../reset_success.php');
                }
Wenn ich die Funktion aufrufe, werde ich zu "reset_success.php" umgeleitet.
D.h. , dass der Schritt
PHP:
if ($update_stmt) {
fehlschlägt.
Nur habe ich leider keine Ahnung wieso.
Die Variablen und das SQL Query sind gegeben und funktionieren einwandfrei.
Die Datenbankverbindung steht auch.

Viele Grüße und Danke im Voraus
Cr41s3
 
Zuletzt bearbeitet:
Ohne zu wissen ob das Fehler verursachen kann: im Statement sind 4 Platzhalter, du bindest aber 5 Variablen in Zeile 11 an das Statement. Ich würde das "ssss" entfernen.
 
Habe auch andere Statements ( Select und INSERT) mit dem bind.
Wo siehst du da 5 Variablen?^^
 
Variablen war jetzt nicht ganz das richtige Wort, du übergibst 5 Paramter bei 4 erwarteten:
Code:
                           1          2           3             4                5
$update_stmt->bind_param('ssss', $password, $random_salt, $resetcodebasic, $username);

vs.

                                                1          2             3                 4
$update_prep_stmt = "UPDATE users SET password='?', salt='?', resetcode='?' WHERE name = '?')";
Was dabei passiert, ist denke ich klar. Alle haben das gleiche PW...
 
PHP:
$update_prep_stmt = "UPDATE users SET password='?', salt='?', resetcode='?' WHERE name = '?')";

fehlt da nicht eine ( bzw. eine ) zu viel?

ansonsten mal mit try catch arbeiten und die exceptions angucken ...
oder ganz banal: var_dump() ...
 
Cr41s3 schrieb:
Wenn ich die Funktion aufrufe, werde ich zu "reset_success.php" umgeleitet.
D.h. , dass der Schritt
PHP:
if ($update_stmt) {
fehlschlägt.
Das Problem ist, dass zu den ifs die elses fehlen. Du wirst daher immer zu reset_success.php weitergeleitet, da dies die letzte Anweisung ist.
 
Blackbenji schrieb:
PHP:
$update_prep_stmt = "UPDATE users SET password='?', salt='?', resetcode='?' WHERE name = '?')";

fehlt da nicht eine ( bzw. eine ) zu viel?

ansonsten mal mit try catch arbeiten und die exceptions angucken ...
oder ganz banal: var_dump() ...

Die Klammer war zuviel ja.
Hat den Fehler aber immernoch nicht gefixxt.

Darlis schrieb:
Das Problem ist, dass zu den ifs die elses fehlen. Du wirst daher immer zu reset_success.php weitergeleitet, da dies die letzte Anweisung ist.

Sicher?
PHP:
if ($update_stmt) {
                        $update_stmt->bind_param('ssss', $password, $random_salt, $resetcodebasic, $username);
                        if (!$update_stmt->execute()) {
                            header('Location: ../error.php?err=Update failure: UPDATE');
                        }
                        header('Location: ../reset2_success.php');
                    }
Wenn das stmt ausgeführt wird, müsste ich doch vorher umgeleitet werden?

MfG-
 
Dass könnte ich einfach ein return Befehl dahinter setzen, so dass der Code nicht weiter ausgeführt wird?

MfG-
 
Falls der Code in einer Funktion steht geht das. Der Code außerhalb der Funktion wird dann aber weiter ausgeführt.
 
Ist eine eigene PHP Datei, welche dann zu einer FrontEnd Seite zurückleitet.
Zählt das auch als Funktion?
 
Willst du denn, dass überhaupt noch Code ausgeführt wird nach der Weiterleitung?
 
Nein.
Der Code sollte dann eigentlich so weit, wie ich es wollte(UPDATE query) ausgeführt worden sein.
 
Dann steht die Lösung schon in Post #10.
 
Ah, okey.
Habe habe das jetzt verstanden.
Also soll ich in der PHP Datei zurückgeben via return wohin der Header connecten soll, also die Location?

MfG-
Und Vielen Dank!

Aber das Statement wurde trotzdem bisher nicht ausgeführt :D

Edit:
Habe mal alle Headers rausgenommen und bekomme nun folgenden Fehler
Warning: mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement in C:\xampp\htdocs\serie\includes\reset.inc.php on line 42
Zeile 42 ist in dem Code Snippet oben Zeile 11.

Habe 4 "?" und 4 Variablen , aber trotzdem sagt er, es passt nicht.
Jetzt bin ich total verwirrt.

Edit 2 Minuten später:
Habe den Fehler gefunden und behoben.
Ich danke euch.
Als Info:
Der Fehler lag in der Query.
Man kann NICHT '?' in der Query benutzen.
-> UPDATE users SET password = ?, salt = ?, resetcode = ? WHERE name = ?
Und nun gefixxt.
 
Zuletzt bearbeitet:
Cr41s3 schrieb:
Edit:
Habe mal alle Headers rausgenommen und bekomme nun folgenden Fehler

Zeile 42 ist in dem Code Snippet oben Zeile 11.

Habe 4 "?" und 4 Variablen , aber trotzdem sagt er, es passt nicht.
Jetzt bin ich total verwirrt.

Edit 2 Minuten später:
Habe den Fehler gefunden und behoben.
Ich danke euch.
Als Info:
Der Fehler lag in der Query.
Man kann NICHT '?' in der Query benutzen.
-> UPDATE users SET password = ?, salt = ?, resetcode = ? WHERE name = ?
Und nun gefixxt.

Wenn geheadert wird fallen alle Errors unter den Tisch, ausser die fatalen. Wenn du viel headerst kann es sich lohnen einen eigenen Errorhandler zu definieren und den das Programm hart beenden zu lassen sobald ein Fehler auftritt, so kriegst du zumindest mit, dass was nicht stimmt:
Code:
function customError($errno, $errstr, $errfile, $errline)
{
  echo "<b><blink>Errorhandler: </blink>Error:</b> [$errno] $errstr in $errfile Zeile $errline";
  exit;
}

im __construct():
$oAlterErrorhandler = set_error_handler("customError");


Zu zwei -> '?' ist ein String mit Fragezeichen als Wert, klar dass das nicht klappt ;)
 
Zurück
Oben