php - PHP : class display error function

标签 php oop exception exception-handling error-handling

下面的错误类功能是否不完整/不正确?当查询不正确时,我永远不会收到任何错误消息,

#connects the database and handling the result
class __database {

    protected $connection = null;
    protected $error = null;

    #make a connection
    public function __construct($hostname,$username,$password,$database)
    {
        $this -> connection = new mysqli($hostname,$username,$password,$database);

        if (mysqli_connect_errno()) 
        {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
    }

    #fetches all result rows as an associative array, a numeric array, or both
    public function fetch_all($query) 
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {

            return $result -> fetch_all(MYSQLI_ASSOC);
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return $this -> error;
        }
    }

    #display error
    public function get_error() 
    {
        return $this -> error;
    }

    #closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this -> connection -> close();
    }
}
public function get_error()在我的db类中似乎没用...我已经阅读了有关php Exception的信息,但我不知道如何将其合并到上面的db类中!请指教...

编辑:

我试图将代码更改为此,
# return the current row of a result set as an object
    public function fetch_object($query) 
    {
        $result = $this->connection->query($query);
        if($result)
        {
            ...
        }
        else
        {
            __database::get_error();
        }
    }

和错误类函数,
#display error
    public function get_error() 
    {
        $this->error = $this->connection->error;
        return $this->error;
    }

所以我认为它应该触发get_error()函数,但是错误函数仍然没有显示任何信息。

最佳答案

首先,如果您想充分利用mysqli类,则应该扩展它,并在需要时覆盖它。

class Database extends mysqli
{
    public function __construct($host = null,$username= null,$password = null,$database = "",$port = null, $socket = null)
    {
         $host     = $host     !== null ? $host     : ini_get("mysqli.default_host");
         $username = $username !== null ? $username : ini_get("mysqli.default_user");
         $password = $password !== null ? $password : ini_get("mysqli.default_pw");
         $port     = $port     !== null ? $port     : ini_get("mysqli.default_port");
         $socket   = $socket   !== null ? $socket   : ini_get("mysqli.default_socket");

         /*
             Perform any custom actions here!
         */

         parent::__construct($host,$username,$password,$database,$port,$socket);
    }

    public function fetch_all($query) /*Overridden*/
    {
        if(false !== ($result = parent::query($query))) //run directly in mysqli
        {
             return $result->fetch_all(MYSQLI_ASSOC);
        }

        return false;
    }

    public function get_error() 
    {
        if($this->errno || $this->error)
        {
            return sprintf("Error (%d): %s",$this->errno,$this->error);
        }
    }
}

这将允许mysqli处理错误并允许您轻松地访问它们,创建只模仿类的类没有意义,您最好扩展类本身。

其次,将代码间隔开是一种不好的做法,它不应影响php解释代码的方式,但是从长远来看,如果涉及到共享开发,它可能会使更多开发人员感到困惑并引起问题。

简单的例子:
$Database = new Database(null,"root","pass","database");
$Results = $Database->fetch_all("SELECT * from tabe_that_dont_exists");
if($Results === false)
{
     echo $Database->get_error();
}

关于php - PHP : class display error function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058217/

相关文章:

javascript - AJAX、PHP 表单未提交到数据库

javascript - javascript中原型(prototype)属性如何从父类(super class)委托(delegate)给子类

haskell - 为什么 exceptT 没有 MonadMask 实例?

exception - Marklogic 插入包含 &fm=1 的简单 url,出现 "invalid entity reference"异常错误

exception - Spinnaker Jenkins 集成无法从 Jenkins 获取作业

php - 如何使用codeigniter显示分页信息

php - 如何制作可自定义的小部件区域?

java - 如何在类中创建静态变量,该变量只能由类修改,而不能由实例修改?

oop - MVC - 从模型重定向是否错误

java - 无法连接到 Raspberry Pi 上托管的 MariaDB