2010-06-14 67 views
0

假設mysqli對象已經使用全局變量$ mysql進行實例化(並連接),以下是我正在嘗試使用的代碼。如何使用mysqli對象從SQL查詢中輸出多行

class Listing { 
private $mysql; 
function getListingInfo($l_id = "", $category = "", $subcategory = "", $username = "", $status = "active") { 
     $condition = "`status` = '$status'"; 
     if (!empty($l_id)) $condition .= "AND `L_ID` = '$l_id'"; 
     if (!empty($category)) $condition .= "AND `category` = '$category'"; 
     if (!empty($subcategory)) $condition .= "AND `subcategory` = '$subcategory'"; 
     if (!empty($username)) $condition .= "AND `username` = '$username'"; 
     $result = $this->mysql->query("SELECT * FROM listing WHERE $condition") or die('Error fetching values'); 
     $this->listing = $result->fetch_array() or die('could not create object'); 
     foreach ($this->listing as $key => $value) : 
      $info[$key] = stripslashes(html_entity_decode($value)); 
     endforeach; 
     return $info; 
    } 
} 

有在DB幾百列表,當我調用$ result-> fetch_array()它在數組中的第一行放置在數據庫中。然而,當我嘗試調用該對象時,我似乎無法訪問比第一行更多的內容。例如: : $ listing_row = new Listing; while($ listing = $ listing_row-> getListingInfo()){ echo $ listing [0]; }

這將輸出數據庫中同一行的無限循環。爲什麼它不會推進到下一行? 如果我移動代碼:

$this->listing = $result->fetch_array() or die('could not create object'); 
     foreach ($this->listing as $key => $value) : 
      $info[$key] = stripslashes(html_entity_decode($value)); 
     endforeach; 

如果我將這個類外,它的工作原理完全如預期在同一時間輸出行,同時通過while語句循環。 有沒有辦法寫這個,以便我可以在類中保留fetch_array()調用,並仍然通過記錄循環?

回答

0

您的對象基本上存在缺陷 - 每次調用getListingInfo()方法時都會重新運行查詢。同時,mysql_fetch_array()不獲取整個結果集,只讀取下一行,所以你的方法可以歸結爲:

  1. 運行查詢
  2. 取第一行
  3. 過程中第一行
  4. 回報第一行

對對象的每次調用都會創建一個新的查詢,一個新的結果集,因此將永遠無法獲取第二,第三等...行。

除非你的數據集是「巨大的」(即:比你想要的更大/可以設置PHP memory_limit),否則沒有理由不抓取整個集合並一次處理它,如Jacob的答案所示以上。

作爲一個備註,使用stripslashes讓我懷疑你的PHP安裝是否啓用了magic_quotes_gpc。這個功能已經過時了很長時間,並且只要v6.0發佈,它就會從PHP中移除。如果您的代碼在此類安裝上按原樣運行,則可能會在數據中垃圾郵件的合法轉義。另外,將編碼/轉義的數據存儲在數據庫中通常是一個糟糕的主意。數據庫應該包含數據的「處女」副本,然後在需要處理版本的位置根據需要處理它(轉義,引用等等)。

+0

@ mark: 感謝您的解釋。我對OOP很陌生。我確實有一個關於安全問題的問題。我沒有啓用magic_quotes_gpc,但我一直在使用addslashes()函數將所有通過表單發送的數據添加到數據庫中。有沒有更好的方法來保護數據?我還應該如何過濾某人通過表單輸入發送的數據,以便我可以安全地將其輸入到我的數據庫中? – codescribblr 2010-06-14 14:15:09

+0

編寫'安全'查詢的最佳方法是使用PDO(http://php.net/PDO)和準備好的語句。那些將處理所有引用/轉義數據的繁重工作。否則最好使用mysql_real_escape_string()而不是addslashes()。 mysql函數使用mysql自己的引用機制。 addslashes基本上只是一個啞字符串替換函數,可能會被unicode /非常規字符所迷惑。 – 2010-06-14 15:14:19