2011-04-27 79 views
2

我已經寫了一個小數據庫類,它是這樣的:PHP:SQL查詢 - 避免錯誤

class dbClass extends mysqli 
{ 
    public function execute($sq) 
    { 
    $res = parent::query($sq); 
    $rs = $res->fetch_array(); 
    return $rs; 
    } 
} 

工作至今,但poblem運行的時候刪除查詢(「從MYTABLE其中刪除..「) 該類在該行上引發錯誤:$ rs = $ res-> fetch_array(); (因爲它不會返回任何我猜)

問題是:我怎麼能陷阱這個錯誤?它應該簡單地不做fetch_array()插入,刪除,更新等查詢..

謝謝!

+0

一個選項轉移到功能類似於刪除操作,並根據該不做fetch_array,另一種選擇是將功能分開,每個動作 – 2011-04-27 06:52:53

+0

你只打算到第一行查詢返回,還是你想要一個包含查詢中所有行的數組? – 2011-04-27 07:04:42

回答

3

對於其它類型的SQL語句, 插入,更新,刪除,DROP,等, 的mysql_query()返回TRUE成功 或FALSE上錯誤。

如果它是布爾類型,則不必檢查結果的類型。

而另一種解決方案可能是發送附加參數,它保存查詢類型並在獲取前檢查該類型。

public function execute($sq) 
    { 
     $res = parent::query($sq); 
     if (is_bool($res)) 
     { 
     //not to fetch 
     } 
     else 
     { 
     $rs = $res->fetch_array(); 
     } 

     return $rs; 
    } 
1

什麼是parent :: query code?

您可以在fetch_array()函數中使用isset來檢查數組是否存在 ,並返回空數組,如果未設置,則返回null。

0

我猜$res返回null在這種情況下,這樣的測試爲:

$res ? $rs = $res->fetch_array() : $rs = $res; 
+0

不,相同的代碼不起作用。當$ res是「true」時會發生什麼? – 2011-04-27 07:00:40

+0

你說得對。編輯以反映這一點。代碼僅在'$ res'返回'null'或數組時才起作用。 – Ben 2011-04-27 07:04:14

0

其他PHP庫使用兩種不同的功能。例如,PHP的PDO使用PDO::query來針對對於除了受影響的行的數量(即UPDATE,DELETE,等等)以外不返回任何結果的查詢返回結果集(即,SELECT)和PDO::exec的查詢。

0

如前所述,查詢函數在寫查詢時不返回結果集。

當您編寫自己的db類時,請有機會區分寫入和讀取查詢。使它們成爲不同的功能。這樣,使用數據庫的簡單主從複製就可以更輕鬆地進行擴展,因爲您始終想要寫入主服務器,而從其中一個從服務器讀取數據。您還可以更輕鬆地切換到其他數據庫擴展,如PDO。

0

我會強烈警告一個沒有錯誤檢查的函數。所以這裏是我的建議 - 這個代碼將在每種情況下返回一個數組。如果發生錯誤,數組將只有一行包含維[0]中的「錯誤」和維[1]中的錯誤消息。

如果查詢未返回結果,代碼將返回[0] =「OK」和[1] =受影響的行數。

如果查詢確實返回結果,則代碼將生成包含返回行的結果集。

$retarray = array(); 

    $result = $mysqli->query($sq); 
    if (!$result) { 
     $err = $mysqli->error; 
     echo $err; 
     $retarray = array(array("Error",$err)); 

     return $retarray; 
    }else { 
     if (is_bool($result)){ 
      $retarray = array(array("OK",$mysqli->affected_rows)); 

     return $retarray; 
     }else{ 
      while ($row = $result->fetch_array()) { 
      array_push($retarray,$row); 
     } 
     } 

     $result->close(); 
     return $retarray; 
    }