2008-11-26 51 views
1

我是mysqli的新手,並試圖確認如果我像下面那樣,errno將被設置爲最後一個錯誤,如果有的話,而不是最後一個查詢的錯誤。mysqli-> error:是僅用於最後一個查詢還是來自查詢組的最後一個錯誤?

這是一個體面的做法,還是應該檢查每個查詢之間的錯誤?

謝謝!

$mysqli->autocommit(FALSE); 

$mysqli->query("INSERT INTO ....."); 
$mysqli->query("INSERT INTO ....."); 
$mysqli->query("INSERT INTO ....."); 
$mysqli->query("INSERT INTO ....."); 
$mysqli->query("INSERT INTO ....."); 

if (0==$mysqli->errno) { 
    $mysqli->commit(); 
} else { 
    $mysqli->rollback(); 
    // Handle error 
} 

回答

3

mysqli_errno - 返回最近一次函數調用錯誤代碼。

4

否 - 它報告最後一個mysqli函數調用的錯誤代碼。零表示在最後的函數調用中沒有發生錯誤。所以如果中間的一個人失敗了,你不會僅僅通過檢查來了解它。

換句話說,是的,您需要在每次函數調用後檢查錯誤代碼。請注意,錯誤也由返回值$mysqli->query()指示。從mysqli_errno文檔複述的例子:

if (!$mysqli->query("INSERT ...")) { 
    printf("Errorcode: %d\n", $mysqli->errno); 
} 
1

不,你必須每個查詢之間辦理入住手續,因爲它總是給你錯誤的最後一個查詢只......所以,如果你的第一個查詢失敗,最後的正確執行,那麼你不會得到錯誤...所以檢查畢竟查詢一個個不是最後...

1

IMO的最佳方式,並捕獲所有的錯誤最簡單的方法是延長的mysqli類:

class DBException extends Exception { 
} 
class DBConnectException extends DBException { 
} 
class DBQueryException extends DBException { 
} 

class DB extends MySQLi { 
    private static $instance = null; 

    private function __construct() { 
     parent::__construct('host', 
          'username', 
          'passwd', 
          'dbname'); 

     if ($this->connect_errno) { 
      throw new DBConnectException($this->connect_error, $this->connect_errno); 
     } 
    } 

    private function __destructor() { 
     parent::close(); 
    } 

    private function __clone() { 
    } 

    public static function getInstance() { 
     if (self::$instance == null) { 
      self::$instance = new self(); 
     } 
     return self::$instance; 
    } 

    public function query($query, $resultmode = MYSQLI_STORE_RESULT) { 
     $result = parent::query($query, $resultmode); 
     if (!$result) { 
      // or do whatever you wanna do when an error occurs 
      throw new DBQueryException($this->error, $this->errno); 
     } 
     return $result; 
    } 
} 
相關問題