Fehler beim updaten von werten in der Datenbank

Sullaysur

Mitglied
Hallo Forum, ich habe einen weiteren Fehler wo ich nicht weiter komme.
Ich habe ein "Formular" wo der eingellogte Benutzer Profil anpassungen durchführen kann.

Nun gibt es dabei 2 Probleme.
1. Ich möchte nicht jedesmal alles Updaten sondern nur geänderte Werte.
2. Funktioniert etwas beim Updaten der Werte nicht, aber ich finde den Fehler nicht, ich vermute es liegt beim letzten $sql = "Update...
Auf jedenfall habe ich euch hier mal den Code mit beigepackt:
PHP:
<?php
session_start();
if(isset($_POST['settings-submit'])){

    require 'dbh.inc.php';

    $username = $_POST['uid'];
    $email = $_POST['mail'];
    $password = $_POST['pwd'];
    $confirmpassword = $_POST['cpwd'];

    if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        header("Location: ../settings.php?error=invalidmail");
        exit();
    }
    else if(!preg_match("/^[\w\- ]*$/", $username)) {
        header("Location: ../settings.php?error=invalidusername");
        exit();
    }
    else if($password !== $confirmpassword){
        header("Location: ../settings.php?error=passwordcheck");
        exit();
    }
    else {

        $sql = "SELECT * FROM users WHERE id='" . $_SESSION['id'] . "'";
        $stmt = mysqli_stmt_init($conn);
        if(!mysqli_stmt_prepare($stmt, $sql)){
            header("Location: ../settings.php?error=sqlerror1");
            exit();
        }
        else {
            mysqli_stmt_bind_param($stmt, "s", $username);
            mysqli_stmt_execute($stmt);
            mysqli_stmt_store_result($stmt);
            $resultCheck = mysqli_stmt_num_rows($stmt);
            if($resultCheck > 0){
                header("Location: ../settings.php?error=usertaken");
                exit();
            }
            else {
                $sql = "UPDATE users SET (uid, email, pwd) VALUES (?, ?, ?) WHERE id='" . $_SESSION['id'] . "'";
                $stmt = mysqli_stmt_init($conn);
                if(!mysqli_stmt_prepare($stmt, $sql)){
                    header("Location: ../settings.php?error=sqlerror2");
                    exit();
                }
                else {
                    $hashedPwd = password_hash($password, PASSWORD_DEFAULT);

                    mysqli_stmt_bind_param($stmt, "sss", $username, $email, $hashedPwd);
                    mysqli_stmt_execute($stmt);
                    header("Location: logout.inc.php?settings=success");
                    exit();
                }

            }
        }

    }
    mysqli_stmt_close($stmt);
    mysqli_close($conn);
}
else {
    header("Location: ../settings.php");
    exit();
}

Ich freue mich wie immer über schnelle und freundliche Hilfe.
 
Hat noch jemand eine idee oder einen Tipp für mich?
Kann ich noch was abändern oder kann ich noch was verbessern?
Und wo liegt der Fehler, suche jetzt seid 3Tagen danach.
 
2. Funktioniert etwas beim Updaten der Werte nicht, aber ich finde den Fehler nicht, ich vermute es liegt beim letzten $sql = "Update...
.
Etwas funktioniert nicht. Es steht jemand auf der Leitung?
Im Ernst. Hast du eine Fehlermeldung? Oder wie ist das Fehlverhalten?
Ist die uid wirklich der username?
Warum behandelst du im SQL die id als String? IDs sollten Zahlen sein.
Warum setzt du die id nicht auch mit bind-param?
 
Ja ich erhalte ?error=usertaken zurück.
Ja die uid ist der Username, in der Datenbank heißt der Username uid und bei der SESSION ist er als userUID eingetragen.
Den fehler mit der id als String ist mir schon selber aufgefallen und den habe ich schon behoben.
Weil ich dafür dass ich es gemacht habe von Personen aus einen anderen Forum kritisiert wurde.
 
Dann liegt es nicht am Update. Der kommt ja erst nach dem usertaken.
Deine Logik hat einen Hacken drin, if($resultCheck > 0){ prüft ob ein user zu der id vorhanden ist.
Wenn ja: Ausstieg mit ?error=usertaken
Wenn nicht: Update des nicht vorhandenen Datensatzes

Ich würde mal auf if($resultCheck == 0){ prüfen.
 
Dann liegt es nicht am Update. Der kommt ja erst nach dem usertaken.
Deine Logik hat einen Hacken drin, if($resultCheck > 0){ prüft ob ein user zu der id vorhanden ist.
Wenn ja: Ausstieg mit ?error=usertaken
Wenn nicht: Update des nicht vorhandenen Datensatzes

Ich würde mal auf if($resultCheck == 0){ prüfen.
Habe es auf == 0 gesetzt, jetzt erhalte ich den error=sqlerror2
Ich bin mir halt nicht sicher ob man Set Values Machen kann.
 
Jetzt kommt er immerhin zum update.
Aber der Update scheint falsch zu sein. Normalerweise ordnet man direkt zu
PHP:
$sql = "UPDATE users SET uid=?, email=?, pwd=? WHERE id= ?;"
...
mysqli_stmt_bind_param($stmt, "sssi", $username, $email, $hashedPwd, $_SESSION['id']);
 
Noch was.
Du solltest die Fehler von mysqli ausgeben. Die sagen mehr als nur "hier ist was faul"
PHP:
printf("Error: %s.\n", mysqli_stmt_error($stmt));
 
Noch was.
Du solltest die Fehler von mysqli ausgeben. Die sagen mehr als nur "hier ist was faul"
PHP:
printf("Error: %s.\n", mysqli_stmt_error($stmt));
Die oben genannten änderungen habe ich auch durchgeführt, jetzt läuft er zwar durch, ändert die Werte aber nicht.
Danke für den hinweis, gibt mir einen Fehler zurück:
Warning[/B]: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement in [B]G:\Sullaysur\Documents\xampp\htdocs\website\dashboard\includes\settings.inc.php[/B] on line [B]34[/B]
 
Zurück