PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: non paramètres ont été liés

Je suis en train de créer un formulaire qui lorsqu'il est soumis permettra de mettre à jour une base de données qui contient les informations de l'utilisateur. J'utilise PDO et les transactions mais reçois le message d'erreur suivant lorsque le formulaire est soumis

PHP Warning:  PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /var/www/html/resources/memfuncs.php on line 75

Voici mon code:

Settings.php

if(isset($_POST['username'])){
    $id = $_SESSION['id'];
    $username = $_POST['username'];
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $email = $_POST['email'];
    $password1 = $_POST['password1'];
    $password2 = $_POST['password2'];

    if ($password1 === $password2){
    updatesettings($id, $username, $first_name, $last_name, $email, $password);
    }
}

Je n'ai pas inclus le code HTML du formulaire, mais il est également dans le fichier ci-dessus.

memfuncs.php

function updatesettings($id, $username, $first_name, $last_name, $email){
    global $db;

    $db->beginTransaction();

    try {
        //UPDATE USERNAME
        $st2 = $db->prepare("UPDATE users SET username = :username WHERE id = :id");
        $st2->execute();
        $st2->bindParam (":username", $username, PDO::PARAM_STR);
        $st2->bindParam (":id", $id, PDO::PARAM_INT);
        //UPDATE FIRST + LAST NAME
        $st = $db->prepare("UPDATE users SET first_name = :first_name AND last_name = :last_name WHERE id = :id");
        $st->execute();
        $st->bindParam (":first_name", $first_name, PDO::PARAM_STR);
        $st->bindParam (":last_name", $last_name, PDO::PARAM_STR);
        $st->bindParam (":id", $id, PDO::PARAM_INT);
        //UPDATE Email
        $st3 = $db->prepare("UPDATE users SET email = :email WHERE id = :id");
        $st3->execute();
        $st3->bindParam(":email", $email, PDO::PARAM_STR);
        $st3->bindParam(":id", $id, PDO::PARAM_INT);
        //COMMIT CHANGES
        $db->commit();
    } catch (Exception $error){
        $db->rollBack();
        echo "Failed: " . $error->getMessage();
    }

}   

Ce que je fais mal?

  • Le message d'erreur est vous dire précisément ce que vous faites mal. Regardez l'ordre de votre prepare,bind et execute consolidés.
  • Comme @MikeW dit, execute() devrait être fait après la bindParam pour chaque "préparer" le bloc.
  • FWIW vous n'avez pas besoin de trois requêtes à effectuer trois changements pour une ligne - vous pouvez le faire en une seule requête. Vous n'avez pas besoin de transaction, soit.
InformationsquelleAutor user16174 | 2014-10-13