Оператор Insert не работает с использованием execute (array ()) расширения PDO

$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 ));