$stmt = $conn->prepare("INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',:cover,:dateofbirthYear:dateofbirthMonth:dateofbirthDay,NOW(),:sex,:country)"); $stmt->execute(array( ':username' => $username, ':password' => $password, ':email' => $email, ':cover' => $cover, ':dateofbirthYear' => $dateofbirthYear, ':dateofbirthMonth' => $dateofbirthMonth, ':dateofbirthDay' => $dateofbirthDay, ':sex' => $sex, ':country' => $country ));
По какой-то причине этот оператор insert не работает. Я очень новичок в PDO, поэтому я мало знаю об этом. Что я делаю не так?
эта статута дает мне эту ошибку:
Неустранимая ошибка: исключить исключение «PDOException» с сообщением «SQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов в /home/manga/public_html/new/register.php:80 Трассировка стека:
# 0 /home/manga/public_html/new/register.php(80): PDOStatement-> execute (Array)
# 1 {main} брошен в /home/manga/public_html/new/register.php в строке 80
Вы подготовили свой запрос неправильно
INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'', :cover,:dateofbirthYear:dateofbirthMonth:dateofbirthDay,NOW(),:sex,:country // ^ These need to either single or separated
Для того, что вы пытаетесь, вы можете сделать это таким образом
//Prepare the date of birth earlier $dob = $dateofbirthYear.$dateofbirthMonth.$dateofbirthDay; //Then pass it as a single $variable $stmt = $conn->prepare("INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',:cover,:dob,NOW(),:sex,:country)"); $stmt->execute(array( ':username' => $username, ':password' => $password, ':email' => $email, ':cover' => $cover, ':dob' => $dob, // <-- Problem solved ':sex' => $sex, ':country' => $country )); // Then it will execute
Точное сообщение об ошибке:
SQLSTATE [HY093]: Недопустимый номер параметра: количество связанных переменных не совпадает с числом токенов
Это означает, что число / имена параметров, которые вы передали ( array()
в execute
) не совпадает с числом / именами параметров, которые у вас есть в SQL-запросе prepare()
.
Если вы сравните это с другими вопросами, которые содержат SQLSTATE[HY093]
вы увидите, что это часто связано с большим и плохим отформатированным кодом, который трудно читать. Это трудно подсчитать. И тогда у вас есть надсмотр за чем-то, а затем произошла ошибка.
Просто исправьте это и сделайте, например, вы не можете сделать один параметр из трех имен:
,:dateofbirthYear:dateofbirthMonth:dateofbirthDay,
Вместо этого просто передайте один параметр для дня рождения:
, :dateofbirth,
Вы также можете сделать свой код более читабельным:
$stmt = $conn->prepare( "INSERT INTO user VALUES ( '', :username, md5(:password), '', 1, '', '', :email, '', 0, 0, '', :cover, :dateofbirth, NOW(), :sex, :country )" ); $stmt->execute(array( ':username' => $username, ':password' => $password, ':email' => $email, ':cover' => $cover, ':dateofbirth' => $dateofbirthYear . $dateofbirthMonth . $dateofbirthDay, ':sex' => $sex, ':country' => $country ));
И тогда у вас есть проблема безопасности с хешем пароля:
md5(:password)
Вместо этого выполните правильное хеширование паролей, см. Часто задаваемые вопросы PHP о безопасном пароле .
Исправленный подготовленный запрос:
$stmt = $conn->prepare("INSERT INTO user VALUES ('',:username,md5(:password),'',1,'','',:email,'',0,0,'',:cover,:dateofbirthYear,:dateofbirthMonth:,dateofbirthDay,NOW(),:sex,:country)"); //:dateofbirthYear,:dateofbirthMonth:,dateofbirthDay place holders are seprated $stmt->execute(array( ':username' => $username, ':password' => $password, ':email' => $email, ':cover' => $cover, ':dateofbirthYear' => $dateofbirthYear, ':dateofbirthMonth' => $dateofbirthMonth, ':dateofbirthDay' => $dateofbirthDay, ':sex' => $sex, ':country' => $country ));