2011-02-20 73 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