查询看起来不错,但我有错误

时间:2015-07-17 06:30:47

标签: php mysql pdo

我有这个SQL查询

$sql = $conn->prepare('INSERT INTO Accounts (Status, Username, Password, FirstName, LastName, EmailAddress, API_Status, API_Key, About) VALUES (:Status, :Username, :Password, :FirstName, :LastName, :EmailAddress, :API_Status, API_Key, :About)');
$sql->execute(array('Status' => 'NotActive', 'Username' => $Username, 'Password' => $PasswordHash, 'FirstName' => $FirstName, 'LastName' => $LastName, 'EmailAddress' => $EmailAddress, 'API_Status' => 'OFF', 'API_Key' => $API_Key, 'About' => $Other));      

执行此查询时,我正在使用try {

catch(PDOException $e) {
   echo $sql . "<br>" . $e->getMessage();
}

现在,当我运行脚本时,我发现了这个PHP错误:

  

可捕获的致命错误:PDOStatement类的对象不可能   在第94行的/var/www/html/register.php中转换为字符串

我如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题的问题。

  1. 错误的命名。 SQL是传递给prepare()的文本。返回值是一个对象。问题没有解决。
  2. 由于命名错误,OP正在尝试回显对象。问题没有解决。
  3. 感谢Stack Overflow的优秀网站,OP被教授terrible wrong way of handling PDO errors,用无用的try..catch东西。问题没有解决。
  4. :一个占位符错过了。唯一的问题就解决了。
  5. 因此,下次此查询引发异常时,将生成相同的UTTERLY USELESS和不相关的错误消息。

    应该做些什么呢?

    $sql = 'INSERT INTO Accounts 
        (Status, Username, Password, FirstName, LastName, EmailAddress,
         API_Status, API_Key, About) 
        VALUES (:Status, :Username, :Password, :FirstName, 
        :LastName, :EmailAddress, :API_Status, :API_Key, :About)';
    $data = array(
        'Status' => 'NotActive', 
        'Username' => $Username, 
        'Password' => $PasswordHash, 
        'FirstName' => $FirstName, 
        'LastName' => $LastName, 
        'EmailAddress' => $EmailAddress, 
        'API_Status' => 'OFF', 
        'API_Key' => $API_Key, 
        'About' => $Other
    );
    $conn->prepare($sql)->execute($data);
    

    我们在这里有什么?

    • 正确命名。如果一个人喜欢回应一个SQL查询,他们就没错。
    • 可读性即可。屏幕上没有冗长而多风的代码,允许我们直观地检查查询并找到语法错​​误。
    • 更正了占位符语法。
    • 没有回显任何语句对象。这两个SQL都没有,因为在准备好的声明的情况下它没什么意义。
    • 没有愚蠢的try..catch块。意味着PHP将能够在发生错误时通知PHP用户。

答案 1 :(得分:1)

您无法在使用时回显您的sql,您可能需要使用debugDumpParams()尝试这样的事情。

$sql = $conn->prepare('INSERT INTO Accounts (Status, Username, Password, FirstName, LastName, EmailAddress, API_Status, API_Key, About) VALUES (:Status, :Username, :Password, :FirstName, :LastName, :EmailAddress, :API_Status, API_Key, :About)');

$sql->execute(array(':Status' => 'NotActive', ':Username' => $Username, ':Password' => $PasswordHash, ':FirstName' => $FirstName, ':LastName' => $LastName, ':EmailAddress' => $EmailAddress, ':API_Status' => 'OFF', ':API_Key' => $API_Key, ':About' => $Other));      

echo $sql->debugDumpParams();