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
etexecute
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.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de lier les paramètres avant d'exécuter l'instruction. C'est lorsque l'instruction est exécutée que les paramètres sont évalués, de sorte qu'ils doivent être fixés par ce point!
De sorte que votre code devrait ressembler à ceci:
Noter que
bindColumn
, qui est au sujet d'obtenir les résultats de une requête, en général, devrait être exécuté aprèsexecute
.Vous avez exécuté au début,
execute()
devrait être la dernière chose que vous faites après la préparation et de la reliure:Afin de corriger cela dans les 3 lieux lorsque vous
execute()
, aussi, si vous allez attraper les exceptions attraperPDOException
et mettre$db->beginTransaction();
dans le bloc try, car cela peut échouer!