Запрос не выполнен Неперехваченное исключение PDO: SQLSTATE[HY093]: Недопустимый номер параметра: количество связанных переменных не совпадает с количеством токенов

#php #sql

Вопрос:

Мой sql-запрос выдает следующую ошибку. Тот же запрос нормально выполняется на другом сервере. Ошибка: Фатальная ошибка: Неперехваченное исключение PDO: SQLSTATE[HY093]: Недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов в C:xampphtdocssmssend_link.php:59 Трассировка стека: #0 C:xampphtdocssmssend_link.php(59): PDOStatement->выполнить() #1 {основной} брошено C:xampphtdocssmssend_link.php в строке 59 (строка 59 — $query->>выполнить();)

              $expFormat = mktime(date("H"), date("i"), date("s"), date("m"), date("d")   1, date("Y"));
             $expDate = date("Y-m-d H:i:s", $expFormat);
             $key = md5(time());
             $addKey = substr(md5(uniqid(rand(), 1)), 3, 10);
             $key = $key . $addKey;
                $sql="INSERT INTO `password_reset_temp` (`email`, `key`, `expDate`) VALUES ('" . $email . "', '" . $key . "', '" . $expDate . "');";
                $query = $dbh->prepare($sql);
                $query->bindParam(':email',$email,PDO::PARAM_STR);
                $query->bindParam(':key',$key,PDO::PARAM_STR);
                $query->bindParam(':expDate',$expDate,PDO::PARAM_STR);
                $query->execute();
 

Структура таблицы находится здесь

Комментарии:

1. Не объединяйте значения переменных, а вместо этого поместите заполнители.

2. @stickybit можете ли вы объяснить, пожалуйста

3. Ну, я уже объяснил… Не объединяйте переменные, такие как $email и так далее, Но добавляйте заполнители, такие как :email и так далее, В запрос. И удалите кавычки ( ' ), когда вы это сделали. Правильные кавычки будут установлены автоматически, когда переменные будут привязаны к запросу. (Возможно, также еще раз посмотрите пример в учебнике или документации и внимательно посмотрите, как они используют заполнители в своих запросах.

4. @stickybit мой запрос теперь $sql=»ВСТАВИТЬ В ЗНАЧЕНИЯ password_reset_temp(электронная почта,ключ,расширение) (: электронная почта,:ключ,:расширение)»;

5. @stickybit это приводит к ошибке — фатальной ошибке: Неперехваченное исключение PDO: SQLSTATE[42000]: Синтаксическая ошибка или нарушение доступа: 1064 У вас ошибка в синтаксисе SQL; проверьте руководство,соответствующее вашей версии сервера MariaDB, на наличие правильного синтаксиса для использования рядом со значениями «ключ, расширение» (‘xxxxxxx@xxxx.org»,»8f46cc337bb661a650397f613266…» в строке 1 в C:xampphtdocssmssend_link.php:60 Трассировка стека: #0 C:xampphtdocssmssend_link.php(60): PDOStatement->выполнить() #1 {основной}, введенный C:xampphtdocssmssend_link.php на линии 60

Ответ №1:

  1. Не объединяйте значения переменных, а вместо этого поместите заполнители.
  2. Ключ-это ключевое слово в mysql. Избегайте использования этого, попробуйте следующий код .
 $expFormat = mktime(date("H"), date("i"), date("s"), date("m"), date("d")   1, date("Y"));
$expDate = date("Y-m-d H:i:s", $expFormat);
$key = md5(time());
$addKey = substr(md5(uniqid(rand(), 1)), 3, 10);
$key1 = $key . $addKey;
$sql="INSERT INTO password_reset_temp(email,key1,expDate) VALUES(:email,:key1,:expDate)";    
$query = $dbh->prepare($sql);
$query->bindParam(':email',$email,PDO::PARAM_STR);
$query->bindParam(':key1',$key1,PDO::PARAM_STR);
$query->bindParam(':expDate',$expDate,PDO::PARAM_STR);
$query->execute();