假設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()調用,並仍然通過記錄循環?
@ mark: 感謝您的解釋。我對OOP很陌生。我確實有一個關於安全問題的問題。我沒有啓用magic_quotes_gpc,但我一直在使用addslashes()函數將所有通過表單發送的數據添加到數據庫中。有沒有更好的方法來保護數據?我還應該如何過濾某人通過表單輸入發送的數據,以便我可以安全地將其輸入到我的數據庫中? – codescribblr 2010-06-14 14:15:09
編寫'安全'查詢的最佳方法是使用PDO(http://php.net/PDO)和準備好的語句。那些將處理所有引用/轉義數據的繁重工作。否則最好使用mysql_real_escape_string()而不是addslashes()。 mysql函數使用mysql自己的引用機制。 addslashes基本上只是一個啞字符串替換函數,可能會被unicode /非常規字符所迷惑。 – 2010-06-14 15:14:19