【问题标题】:Recommended approach for error handling with PHP and MYSQL使用 PHP 和 MYSQL 进行错误处理的推荐方法
【发布时间】:2011-02-22 12:12:05
【问题描述】:

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

【问题讨论】:

  • 我认为例外是最好的方法。 PDO 通过异常处理,您只需在创建对象时设置 PDO::ERRORMODE_EXCEPTION。
  • @Cfreak:让您的评论成为答案。这是一个很好的。
  • @Cfreak 我同意@webbiedave,请回答,因为我想投票!
  • 按要求回答了

标签: php mysql error-handling


【解决方案1】:

我认为例外是最好的方法。 PDO 确实会引发异常,您只需在创建对象时设置 PDO::ERRORMODE_EXCEPTION

【讨论】:

    【解决方案2】:

    你可以用以下方式重写它:

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

    【讨论】:

      【解决方案3】:

      这仍然需要我检查 使用重复发生错误 if/else 语句

      怎么样? 您不需要检查所有可能的错误。 我只会对返回的值进行最终检查,仅此而已。

      你使用这些嵌套条件的目的是什么?

      【讨论】:

        【解决方案4】:

        我创建了自己的代码来执行 MySQL 语句并在它们失败时引发异常,包括针对不同失败原因的特定异常。其中最有用的方法之一是在发生冲突时,允许我使用 try..catch 块并捕获 DatabaseCollisionExceptions,并以与其他数据库异常不同的方式处理这些异常。

        我发现最容易做到这一点的是 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());
        }
        

        有关类似设计模式的更多信息,请参阅:

        当然,这不是唯一的答案,它只是一些您可能会觉得有帮助的想法。

        【讨论】:

        • 我是DatabaseCollisionException的粉丝
        猜你喜欢
        • 2013-03-14
        • 2014-05-30
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        相关资源
        最近更新 更多