2012-11-07 41 views
0

我有这个问题,让我发疯。我想要的只是检查一个错误的查询,如果是的话显示错误,否则运行查询。PHP PDO检查mysql错误

我有以下的几乎是(因为它运行插入查询两次)工作

[..] 

$dbdata = new mySQLAccessData(); 
$db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password); 
$defaults = new Defaults(); 

[..] 

if(!$db->exec($sql)){ 
    echo($defaults->throwError('MySql error',implode(":",$db->errorInfo()))); 
}else{ 
    $db->exec($sql); 
    $defaults->writeLog($table,$db->lastInsertId(),'add'); 
} 

我试过无数的事情(还有其他的方法try(){}catch(){}),但不只是上面的代码工作。它显示我想要的方式的错误,并且只有当发生错误时,但运行两次exec() ...

有人可以帮我解决吗?

+0

在这里阅读http://php.net/manual/en/class.pdoexception.php –

+0

为什么不把'$ db-> exec($ sql)'的结果赋值给一个变量。 '$ result = $ db-> exec($ sql);'。然后在'if($ result)'中使用'$ result'的值。 –

回答

0

为什么要在else部件中再次执行查询?通常你只是试着运行查询,如果发生错误,就对它们做出反应。

[..] 

$dbdata = new mySQLAccessData(); 
$db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password); 
$defaults = new Defaults(); 

[..] 

if(!$db->exec($sql)){ 
    echo($defaults->throwError('MySql error',implode(":",$db->errorInfo()))); 
}else{ 
    $defaults->writeLog($table,$db->lastInsertId(),'add'); 
} 

据我所知,在实际执行之前没有选择“测试”查询。

+0

啊,不知道查询会在if()部分里面运行。谢谢你的提示! – Maurice

+0

@Maurice只要触发'exec()'方法,查询就会运行。无论你在哪种情况下做到这一点。 – Sirko

0

如果你想看到引发异常错误发生时,只是set the PDO error-mode(参见:Connections and Connection management):

$db = new PDO($dbdata->hostname,$dbdata->username,$dbdata->password); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

例如,这将自动使你的代码抛出异常。可能正是你在找什么。

您的代码的实际问题是执行exec两次。您不需要:

$success = $db->exec($sql); 

if (!$success) { 
    echo $defaults->throwError('MySql error', implode(":", $db->errorInfo())); 
} else { 
    # do not exec *again* here. 
    $defaults->writeLog($table, $db->lastInsertId(), 'add'); 
}