2013-04-01 70 views
0

我爲PHP創建了一個單例數據庫類。我認爲它工作得很好,但事實上並非如此。我現在正在做一個有3個查詢的頁面。 1檢查是否存在相冊,1檢查用戶是否擁有相冊,另一個是從相冊中獲取照片。Singleton數據庫類:刪除舊查詢結果

現在在我的第三個查詢中填充一個對象,但是前兩個查詢的結果也在該數組中,所以即時通知!

這裏有一個例子:

Array 
(
[0] => Array 
    (
     [id] => 2 
     [name] => My new album 1 
     [slug] => my-new-album-1 
     [user_id] => 1 
     [views] => 0 
     [datecreated] => 2013/03/23 16:00:43 
    ) 

[1] => Array 
    (
     [id] => 3 
     [name] => My new album 1 
     [slug] => my-new-album-1 
     [user_id] => 1 
     [views] => 0 
     [datecreated] => 2013/03/23 23:51:58 
    ) 

[2] => Array 
    (
     [id] => 2 
    ) 

[3] => Array 
    (
     [id] => 117 
     [title] => 
     [location_id] => 
     [date] => 2013-03-30 00:42:26 
     [user_id] => 1 
     [album_id] => 2 
    ) 

這也是我如何做一個查詢並返回數組:

mysqli_conn::getInstance()->query($sql)->all_assoc() 

而且這是做查詢並返回我的數據庫類的一部分結果:

public function query($sql){ 

$starttime = $this->time_to_float();   
$this->query = mysqli_query($this->connection, $sql);   
$endtime = $this->time_to_float(); 
$exectime = ($endtime - $starttime); 


if (!$this->query){   
    throw new Exception(mysqli_error($this->connection));   
} else { 

    $this->arQueryLog[] = array ('query' => $sql, 
            'exectime' => $exectime, 
            'affected_rows' => mysqli_affected_rows($this->connection), 
            'last_insert_id' => $this->lastID());          


} 

return $this; 

} 

public function all_assoc() 
{ 
    while($result = mysqli_fetch_assoc($this->query)){ 
     $this->result[] = $result; 
    } 

    return $this->result; 

} 

怎麼可能只有最後一個查詢結果在結果數組中?

謝謝!

+0

這是一些非常糟糕的設計你到了那裏。你爲什麼不使用'mysqli'的OOP版本? – Shoe

回答

0

2個大斷裂,不相干的數據庫類

  • 每一個變量都在使用前進行初始化。此代碼失敗。如果你使用的是本地變量的本地數據

  • PHP甚至會原諒上述故障所以,正確的代碼必須

    public function all_assoc() 
    { 
        $result = array(); //initializing a local variable 
        while($result = mysqli_fetch_assoc($this->query)){ 
         $result[] = $result; 
        } 
        return $result; 
    } 
    

    這all_assoc功能更好使用$ result變量而不是使用類屬性。

    1個與數據庫類相關的重大故障。

    • 您沒有使用佔位符,因此,您的查詢容易受到SQL注入的影響。

    因此,您已經開始上課了,請看看SafeMysql。它會使你的代碼更短,更安全。

  • 0

    您正在將結果推送到該類的結果屬性。由於它是一個singelton,以前的值將保留在result屬性中,並且每次調用all_assoc()方法時都會在屬性中推送新的結果。

    在推送新結果之前,您應該取消設置all_assoc()方法中的result屬性。

    0

    我認爲@Jueecy可能在設計方面有一個有效的觀點,但由於我們無法獲得完整的實現,因此讓我們使用我們所擁有的。

    儘管將數據庫連接存儲在單例中是有意義的,但將查詢結果存儲爲單例(並且不是數據庫連接單例)並不合適,因爲您很可能會擁有多個每個請求的查詢。

    您共享的代碼,我的建議是簡單地直接返回$query值(不存儲它$此),並有all_assoc()(以及相關的功能)接受$query並直接返回$result(不將其存儲在$這)。

    您可以創建一個Query類來包裝$queryResult類來包裝單個結果集,如果您需要提供自定義邏輯(又名exectimearQueryLog邏輯在query()功能),但沒有提供任何代碼這表明這是必要的。

    好運,

    -David法瑞爾