如何在MySQLi(PHP)中捕获错误并继续执行?

时间:2014-05-08 21:45:22

标签: php mysql mysqli

我有以下课程:

    <?php
    require 'config.php';
    ini_set('display_errors', 0);

    abstract class Conexion {

        protected $conexion;

        function __construct() {

        }

        function __destruct() {
            // $this->close();
        }

        protected function abrirConexion() {
            try {
                $this->conexion = new mysqli(BD_HOST, BD_USUARIO, BD_CLAVE, BD_BASEDEDATOS, BD_PUERTO, BD_SOCKET);
                if ($this->conexion->errno == 0) {
                    $this->conexion->query("SET NAMES utf8");
                    return true;
                } else {
                    $this->cerrarConexion();
                    return false;
                }
            } catch (Exception $e) {
                return false;
            }
        }

        protected function cerrarConexion() {
            $this->conexion->close();
        }

    }

我希望捕获脚本执行中可能出现的错误和异常(确切地说是与数据库的连接),如果一切顺利则返回true,否则返回false。但是我无法捕获连接错误(例如,当生成too many connections时,脚本停止并且不返回false)。我读到了set_handler_error,但我不知道如何实现它。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

连接后您无法检查$conn->errno,因此有一个特殊属性$conn->connect_errno

同样在PHP中,当您不希望生成任何错误或警告时(例如,因为您不在乎,或者因为您自己就像在您的情况下一样处理它们),您应该使用the @ error control operator

所以它看起来像这样:

$this->conexion = @new mysqli(BD_HOST, BD_USUARIO, ...);
if ($this->conexion->connect_errno == 0) {
    ...

但这意味着你自己正在进行检查,而你根本就没有使用例外!它是经典的显式错误处理。


现在让我们看看如何让它与你想要的异常一起工作。解决方案是正确设置mysqli错误报告模式:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

正如the documentation中所述,这使得mysqli&#34; 抛出mysqli_sql_exception来表示错误而不是警告&#34;。您不需要@运算符,也不需要检查errno值:

    function abrirConexion() {
        // This needs to be set just once.
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

        try {
            $this->conexion = new mysqli(...);
            $this->conexion->query("SET NAMES utf8");
            return true;
        } catch (Exception $e) {
            return false;
        }
    }

简单干净。