我正在尝试在PHP Web应用程序中捕获数据库(MYSQL)错误。目前,我看到有像mysqli_error(),mysqli_errno()这样的函数用于捕获最后发生的错误。但是,这仍然需要我在我的php代码中使用重复的if / else语句来检查错误发生。您可以查看我的代码,看看我的意思。有没有更好的方法来做到这一点? (或)我应该编写自己的代码来引发异常并在一个地方捕获它们吗?此外,PDO是否会引发异常?感谢。
function db_userexists($name, $pwd, &$dbErr)
{
$bUserExists = false;
$uid = 0;
$dbErr = '';
$db = new mysqli(SERVER, USER, PASSWORD, DB);
if (!mysqli_connect_errno())
{
$query = "select uid from user where uname = ? and pwd = ?";
$stmt = $db->prepare($query);
if ($stmt)
{
if ($stmt->bind_param("ss", $name, $pwd))
{
if ($stmt->bind_result($uid))
{
if ($stmt->execute())
{
if ($stmt->fetch())
{
if ($uid)
$bUserExists = true;
}
}
}
}
if (!$bUserExists)
$dbErr = $db->error();
$stmt->close();
}
if (!$bUserExists)
$dbErr = $db->error();
$db->close();
}
else
{
$dbErr = mysqli_connect_error();
}
return $bUserExists;
}
答案 0 :(得分:3)
我创建了自己的代码来执行MySQL语句,如果失败则引发异常,包括针对不同失败原因的特定异常。其中最有用的一个是发生冲突时,允许我使用try..catch
块并捕获DatabaseCollisionException
,并以不同于其他数据库异常的方式处理它们。
我发现最容易做到的是MVC设计模式,其中每个表都由PHP类(模型)表示,我可以将成员变量分配给并调用save
方法保存到数据库,类似于:
try
{
$user = new User();
$user->username = 'bob';
$user->setPassword($_POST['password'); // Could do some SHA1 functions or whatever
$user->save
}
catch(DatabaseCollisionException $ex)
{
displayMessage("Sorry, that username is in use");
}
catch(DatabaseException $ex)
{
displayMessage("Sorry, a database error occured: ".$ex->message());
}
catch(Exception $ex)
{
displayMessage("Sorry, an error occured: ".$ex->message());
}
有关类似设计模式的更多信息,请参阅:
当然,这不是唯一的答案,只是您可能会发现一些有用的想法。
答案 1 :(得分:1)
我认为例外是最好的方法。 PDO会抛出您在创建对象时设置PDO::ERRORMODE_EXCEPTION
所需的异常。
答案 2 :(得分:0)
这还需要我检查 重复发生错误 if / else语句
怎么样? 您无需检查每个可能的错误。 我只是最后检查返回的值而不是别的。
您出于什么目的使用这些嵌套条件?
答案 3 :(得分:0)
您可以通过以下方式重写它:
$ bUserExists = false; $ uid = false;
if (!mysqli_connect_errno())
{
if($stmt = $db->prepare("select uid from user where uname = ? and pwd = ?")
->bind_param("ss", $name, $pwd))
{
$stmt->execute();
$stmt->bind_result($uid);
$stmt->fetch();
$stmt->close();
}
if ($uid)
$bUserExists = true;
$db->close();
}
else
{
$dbErr = mysqli_connect_error();
}