2011-02-20 12 views
0

以下のエラークラス関数で何か不完全であるか間違っていますか?クエリが間違っているとき、私は私のデシベルクラスで無用のようです...私はPHP Exceptionについて読んだことがあるが、私はそれを組み込む方法がわからない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クラスに!助言してください...

EDIT

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

は、だから私はそれがトリガーされると思った私は、この中にコードを変更しようとした

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

とエラークラス機能、 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のは、エラーを処理し、あなたが簡単にアクセスできるようにすることができます、ちょうどあなたのより良いが、クラス自体を拡張し、クラスを模倣するクラスを作成するにはポイントがありません。

第2に、コードを詰め込む悪い習慣で、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

感謝。あなたのコードをテストしたときにこのエラーが発生する - 致命的なエラー:C#\ wamp \ www \ ... \ class_database.phpのxxxで定義されていないメソッドmysqli :: fetch_all()を呼び出す? – laukok

+0

が更新されました。私のコードはあくまで例示のためのものです。ありがとう。 – RobertPitt