MySQL SQL Statement wir nicht ausgeführt

Cury

Aktives Mitglied
Hey,
Ich programmiere grade an einer Webseite und bin kurz Zeit dabei ein "Passwort vergessen?" zu machen.

Code:
PHP:
if (empty($error_msg)) {

          $random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));

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

          if ($stmt = $mysqli->prepare("UPDATE users SET password = ?, salt = ?, Token = null WHERE Token = ?")) {
              $stmt->bind_param('sss', $password, $random_salt, $token);
              $stmt->execute();
              header('Location: Start.php?error=4');
          }else {
            $error_msg .= '<p>Datenbank Fehler. Bitte versuche es erneut.</p>';
          }
        }else {
          $error_msg .= '<p>Es gab Fehler. Bitte versuche es erneut.</p>';
        }

id (primary key & A_I)usernameemailpassword (verschlüsselt)saltToken (Null Ja, Standart Null)
varchar(60)varchar(30)varchar(128)varchar(128)

Passwort und salt sind beide genau 128 Zeichen lang durch die verschlüsselung. (Habe es bei mir auch schon debugget und herrauszufinden wie lang die sind. Immer 128).

Ich hoffe, dass mir irgendjemand weiterhelfen kann.
LG
 
Zuletzt bearbeitet von einem Moderator:
Bitte immer in code-Tags posten.
PHP:
if (empty($error_msg)) {

    $random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));

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

    if ($stmt = $mysqli->prepare("UPDATE users SET password = ?, salt = ?, Token = null WHERE Token = ?")) {
        $stmt->bind_param('sss', $password, $random_salt, $token);
        $stmt->execute();
        header('Location: Start.php?error=4');
    } else {
        $error_msg .= '<p>Datenbank Fehler. Bitte versuche es erneut.</p>';
    }
} else {
    $error_msg .= '<p>Es gab Fehler. Bitte versuche es erneut.</p>';
}
 
If the statement is UPDATE, DELETE, or INSERT, the total number of affected rows can be determined by using the mysqli_stmt_affected_rows() function. Likewise, if the query yields a result set the mysqli_stmt_fetch() function is used.

Lass dir mal ausgeben, ob überhaupt Zeilen aktualisiert wurden. Vermutung wäre, da der Code an sich korrekt aussieht, dass das übergebene Token falsch ist und damit die Zeile nicht gefunden wird.
 
Das könnte auch helfen. Als erste Schritt wie gesagt, mal auswerten wie viel Zeilen aktualisiert werden (Ansonsten einfach mal $token ausgeben und schauen ob der korrekt ist)
 
achso. den token bekomme ich so:


PHP:
<?php if(isset($_GET["token"])) {
      $error_msg = "";

      $prep_stmt = "SELECT * FROM users WHERE token = ?";
      $stmt = $mysqli->prepare($prep_stmt);

      $stmt->bind_param('s', $_GET['token']);
      $stmt->execute();
      $stmt->store_result();

      if ($stmt->num_rows == 1) {
        //wenn der angebene Token in der DB gespeichert ist:
        $error_msg = "";

        if (isset($_POST['p'])) {

        $password = filter_input(INPUT_POST, 'p', FILTER_SANITIZE_STRING);

        if (strlen($password) != 128) {

         $error_msg .= '<p class="error">Fehler bei der Passwort eingabe.</p>';
        }


        if (empty($error_msg)) {

          $random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));

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

          if ($stmt = $mysqli->prepare("UPDATE users SET password = ?, salt = ?, Token = null WHERE Token = ?")) {
              $stmt->bind_param('sss', $password, $random_salt, $token);
              $stmt->execute();
              header('Location: Start.php?error=4');
          }else {
            $error_msg .= '<p>Datenbank Fehler. Bitte versuche es erneut.</p>';
          }
        }else {
          $error_msg .= '<p>Es gab Fehler. Bitte versuche es erneut.</p>';
        }
       }else {
         $error_msg = '<p>Bitte fülle alle Felder aus</p>';
       }
        ?>
            
         //Hier ist dann mein Formular.

        <?php
      }else {
        header('Location: Start.php');
      }
    }else {
      $error_msg = "keiner da";
      header('Location: Start.php');
    }
    ?>

Auf einer anderen Unterseite (Passwortreset.php) kann man seine Email angeben, dann wird in der Email ein Link zur setNewPasswort.php?token= (der token, der zum account mit der angegebenen Email gehört) gesendet. Email senden geht halt aber auf dem localhost nicht, also habe ich denn link immer selber eingeben (kommt ja das gleiche bei raus). Dann setzte ich $_GET['token] in variable $token. Diesen Token benutze ich dann bei der Abfrage.
 
Also...ich bin echt so dumm xD... ich habe den error gefunden. Ich habe mir mal die varibale ausgegeben...Varibale Token ist undefined.... jetzt habe ich den Error
 

Neue Themen


Zurück
Oben