#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. Ну, я уже объяснил… Не объединяйте переменные, такие как
'
), когда вы это сделали. Правильные кавычки будут установлены автоматически, когда переменные будут привязаны к запросу. (Возможно, также еще раз посмотрите пример в учебнике или документации и внимательно посмотрите, как они используют заполнители в своих запросах.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:
- Не объединяйте значения переменных, а вместо этого поместите заполнители.
- Ключ-это ключевое слово в 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();