2011-02-20 60 views
0

下面的错误类函数是不完整/不正确的吗?我永远不能得到任何错误消息时查询不正确,PHP:类显示错误函数

#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()函数,但仍然没有任何东西已显示从错误函数...

回答

2

首先,如果你想充分利用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(); 
} 
+0

+1更清洁 – HyderA

+0

感谢。当我测试你的代码时出现这个错误 - 致命错误:调用未定义的方法mysqli :: fetch_all()在C:\ wamp \ www \ ... \ class_database.php xxx行 - 任何想法? – laukok

+0

已更新。但我的代码纯粹仅用于示例目的。 – RobertPitt