2013-03-09 2 views
0
$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 
    )); 

По какой-то причине этот оператор вставки не работает. Я очень новичок в PDO, поэтому я мало знаю об этом. Что я делаю не так?Оператор вставки не работает с использованием execute (array()) расширения PDO

даного дает мне эту ошибку:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens' in /home/manga/public_html/new/register.php:80 Stack trace:
#0 /home/manga/public_html/new/register.php(80): PDOStatement->execute(Array)
#1 {main} thrown in /home/manga/public_html/new/register.php on line 80

+0

" Я искал ошибку в stackoverflow "И вы пробовали думать об этом для себя? – feeela

+0

@feeela Если бы я этого не сделал, зачем мне задавать вопрос здесь? – shnisaka

+0

Вы действительно должны [не использовать 'md5'] (http://www.php.net/manual/en/book.password.php) для [хэш-паролей] (https://github.com/ircmaxell/password_compat). – PeeHaa

ответ

5

Вы подготовили запрос в неправильном направлении

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 
+0

Я не могу поверить, что это была ошибка! Спасибо за помощь. – shnisaka

2

Точное сообщение об ошибке у вас есть:

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens

Это означает, что число/имена параметров, которые вы прошли (array() в execute) не совпадает с номером/именами параметров, которые у вас есть в SQL-запросе prepare().

Если вы compare that with the other questions that contain 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 FAQ about Safe Password Hashing.

+0

Прошу прощения, но мне не понравился тот факт, что вы только что сделали мой ответ устаревшим с этим правлением :( – Starx

+0

Как я могу заставить вас снова улыбнуться? – hakre

+0

Это был наименее ожидаемый ответ. :) (втягивая мой голос) – Starx

-2

Исправленная подготовлен запрос:

$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 
)); 
Смежные вопросы