PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: keine Parameter gebunden waren
Ich versuche, ein Formular erstellen, bei der eingereicht wird, aktualisieren einer Datenbank, die enthält die Informationen der Benutzer. Ich bin mit PDO und Transaktionen aber immer die folgende Fehlermeldung, wenn das Formular abgeschickt wird
PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /var/www/html/resources/memfuncs.php on line 75
Hier ist mein 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);
}
}
Ich habe nicht enthalten die HTML für das Formular, obwohl es auch in den oben angegebenen Datei.
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();
}
}
Was mache ich falsch?
- Die Fehlermeldung sagt dir genau, was du falsch machst. Betrachten Sie die Reihenfolge der
prepare
,bind
undexecute
Aussagen. - Wie @MikeW sagt, execute() sollte durchgeführt werden, nachdem die bindParam für jede "Vorbereitung" - block.
- FWIW, Sie brauchen nicht drei Abfragen, um drei änderungen in einer Zeile - Sie können es in einer Abfrage. Sie brauchen keine Transaktionen dann, entweder.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie binden Sie die Parameter vor der Ausführung der Anweisung. Es ist, wenn die Anweisung ausgeführt wird, dass die Parameter bewertet werden, so dass Sie eingestellt werden müssen, um von dieser Stelle!
Sodass Ihr code sollte wie folgt Aussehen:
Beachten Sie, dass
bindColumn
, denen geht es darum, die Ergebnisse von eine Abfrage, in der Regel ausgeführt werden soll, nachdemexecute
.Ihnen ausgeführt zu früh
execute()
sollte die Letzte Sache, die Sie tun, nach der Vorbereitung und Bindung:Also dieses Problem beheben in 3 Orten, wenn Sie
execute()
, auch wenn Sie zum abfangen von Ausnahmen abfangenPDOException
und setzen$db->beginTransaction();
im try-block da, die fehlschlagen können!