使用PHP和MYSQL进行错误处理的推荐方法

时间:2010-05-21 18:57:50

标签: php mysql error-handling

我正在尝试在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;
}

4 个答案:

答案 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();
    }