@skeetlzz

В чем ошибка SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens?

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
в чем ошибка?

$query = "UPDATE `users` SET `adress`= $adress,`phonenmb`= $phonenmb WHERE $email";

$params = [
    'adress' => $adress,
    'phonenmb' => $phonenmb
];

$stmt = $pdo->prepare($query);

try {
    $stmt->execute($params);
} catch (\Exception $e) {
    die($e->getMessage());
}
  • Вопрос задан
  • 227 просмотров
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) $params собственно нужен для биндинга, чтобы не вставлять данные прямо в запрос, так как это чревато инъекциями. По этому дебильный совет "просто поменяй на $stmt->execute();" желательно проигнорировать.

2) Вместо переменных нужно вставить плейсхолдеры, именованные или безымянные не особо важно. Естественно количество плейсхолдеров должно совпадать с количеством элементов в массиве.

3) Даже в таком виде как у вас запрос работать не будет, так как строковые переменные в рамках запроса должны быть в кавычках.

4) WHERE $email что? Вы вообще понимаете что и для чего пишете? Просто переведя на русский "где емэйл" не кажется вам слегка странной конструкцией? Просто загляните в документацию SQL где описывается WHERE.
Ответ написан
Комментировать
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Дополню предыдущий ответ правильным кодом, без вот этих всех бессмысленных телодвижений, которые понатыканы в исходном вопросе.
$query = "UPDATE `users` SET `address`= ?,`phone_number`=?  WHERE email=?";
$params = [
    $address,
    $phone_number,
    $email,
];
$stmt = $pdo->prepare($query);
$stmt->execute($params);

Только орфографические ошибки в именах полей поправил
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы