0

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

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.
4

1 回答 1

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

谢谢大家帮助我。

于 2016-05-28T09:07:42.990 回答