数据已成功插入,但execute()返回false

时间:2016-05-28 08:28:42

标签: php mysql pdo pdostatement

我在这里搜索了我的问题的答案。有些人可能已经在这里回答了其他版本或驱动程序。这个答案对我的发展有很大帮助。

我的PDOStatement::prepare()正在返回true。但我的PDOStatement::execute();返回false。

然而,行正在数据库中成功插入。我在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.

1 个答案:

答案 0 :(得分:-1)

经过两天的努力才知道错误是什么,最后我通过尝试获取错误和其他互联网引用找到了。我改变的是

    .... 

    // 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。如果我发现为什么会出现这个奇怪的问题,我会更新答案。

谢谢大家的帮助。