Я пытаюсь создать форму, которая при отправке обновит базу данных, содержащую информацию пользователя. Я использую PDO и транзакции, но получаю следующую ошибку при отправке формы
PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /var/www/html/resources/memfuncs.php on line 75
Вот мой код:
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); } }
Я не включил HTML для формы, хотя он также находится в вышеупомянутом файле.
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(); } }
Что я делаю не так?
Перед выполнением инструкции вам необходимо привязать параметры. Это когда выполняется оператор, который оценивается параметрами, поэтому они должны быть установлены этой точкой!
Таким образом, ваш код должен выглядеть так:
$st2 = $db->prepare("UPDATE users SET username = :username WHERE id = :id"); $st2->bindParam (":username", $username, PDO::PARAM_STR); $st2->bindParam (":id", $id, PDO::PARAM_INT); $st2->execute();
Обратите внимание, что bindColumn
, который bindColumn
получением результатов от запроса, обычно должен запускаться после execute
.
Вы выполнили досрочно, execute()
должен быть последним, что вы делаете после подготовки и привязки:
$st3 = $db->prepare("UPDATE users SET email = :email WHERE id = :id"); $st3->bindParam(":email", $email, PDO::PARAM_STR); $st3->bindParam(":id", $id, PDO::PARAM_INT); $st3->execute();
Так что исправьте это в 3-х местах, когда вы execute()
, также если вы собираетесь поймать исключения, поймайте PDOException
и поместите $db->beginTransaction();
в блоке try, потому что это может потерпеть неудачу!