Я искал здесь ответ на мою проблему. Некоторые, возможно, уже ответили здесь с другими версиями или драйверами. Этот ответ очень помог бы мне продвинуться в моих разработках.
мой PDOStatement::prepare()
возвращается правда Но мой PDOStatement::execute();
возвращая ложь.
Принимая во внимание, что строки успешно вставляются в базу данных. Я искал проблему в php.net, а также в документации PDO. Мой поиск пошел в духе.
Мой простой код вставки выглядит следующим образом:
// get current rank into a variable //
$sql = 'SELECT count(email)+1 AS RANK FROM users_main';
$pre = $dbc->prepare($sql);
if($pre){
$pre->execute(array($email)); // <-- working good ...
$res = $pre->fetchObject();
if($res)$rank=(string)$res->RANK;else $rank='';
}
// now inserting new user into the table as per his new rank.
$usercode = substr(md5(gzencode($email)),0,10);
$activationcode = md5(gzencode(substr(md5($email),0,10)));// inserting the actual row into db ...
$sql = "INSERT INTO users_main(email,usercode,activation_code,current_rank) VALUES (?,?,?,?)";
$pre = $dbc->prepare($sql);// debugging ...
echo '<pre>';
try {
$pre->execute(array($email,$usercode,$activationcode,$rank)); // <-- PROBLEM IS HERE . RETURNING FALSE.
}catch(Exception $e){
echo $e->getMessage(); // <-- NO ERROR MESSAGE
}echo '<br><br>';
print_r($dbc->errorInfo()); // <-- here sqlstate is 0000
echo '</pre>';
/*$emailSubject = 'Welcome Mail!';
$emailLink = '?b='.$activationCode;
if(insertEmailQueue('W',$email,$emailSubject,$emailLink))return true;else return false;
}*/
В дополнение к вышеупомянутой информации, я проверил тип данных каждого столбца, в который я пытаюсь вставить. Все выглядит хорошо.
Ответ на этот вопрос очень мне поможет.
Я отлаживал приведенный выше код и пытался изменить, чтобы получить ошибку. Я изменил код, как показано ниже:
try {
$res = $pre->execute(array($email,$usercode,$activationcode,$rank)); // <-- PROBLEM IS HERE . RETURNING FALSE.
}catch(PDOException $e){
echo $e->getMessage(); // <-- NO ERROR MESSAGE
}echo '<br><br>';
print_r($dbc->errorInfo()); // <-- here sqlstate is 0000
echo '<br><br>';
print_r($dbc->errorCode());
echo '<br><br>';
print_r($pre->errorCode());
echo '</pre>';
Результат был как ниже:
Array
(
[0] => 00000
[1] =>
[2] =>
)00000
23000 // <-- this is a fatal error as per the documentation.
После двухдневной борьбы за то, чтобы узнать, в чем заключалась ошибка, я, наконец, нашел, пытаясь получить ошибку и другие ссылки в Интернете. Что я изменил, так это
....
// now inserting new user into the table as per his new rank.
$usercode = addslashes(substr(md5(gzencode($email)),0,10));
$activationcode = addslashes(md5(gzencode(substr(md5($email),0,10))));....
addslashes()
это один из примитивных способов избежать недопустимых символов.
Мне все еще интересно, почему MySQL принял оператор, вставил строки и возвратил false после вставки. Я обновлю ответ, если выясню, почему возникает эта странная проблема.
Спасибо всем за помощь.
Других решений пока нет …