Предполагая, что объект mysqli уже мгновенно связан (и связан) с глобальной переменной $mysql, вот код, с которым я пытаюсь работать.
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(), он помещает в массив первую строку в db. однако, когда я пытаюсь вызвать объект, я не могу получить доступ больше, чем первая строка. например: $ listing_row = новый список; while ($ listing = $listing_row- > getListingInfo()) { echo $listing [0]; }
это выводит бесконечный цикл той же строки в db. Почему он не продвигается к следующему ряду? если я переведу код:
$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() в классе и все еще прокручивать записи?
Ваш объект в корне ошибочен - он повторно запускает запрос каждый раз, когда вы вызываете метод getListingInfo(). Кроме того, mysql_fetch_array()
не извлекает весь набор результатов, он извлекает только следующую строку, поэтому ваш метод сводится к следующему:
Каждый вызов объекта создает новый запрос, новый результирующий набор и поэтому никогда не сможет извлечь строки 2, 3 и т.д.
Если ваш набор данных "огромный" (то есть: больше, чем вы хотите/можете установить PHP memory_limit), нет причин НЕ брать весь набор и обрабатывать все за один раз, как показано в ответе Джейкоба выше.
как побочная заметка, использование stripslashes заставляет меня задаться вопросом, включена ли ваша установка PHP magic_quotes_gpc. Эта функциональность долгое время была повреждена и будет удалена из PHP всякий раз, когда выйдет v6.0. Если ваш код работает так же, как на такой установке, он может уничтожить законное экранирование в данных. Также, как правило, плохое представление о сохранении закодированных/экранированных данных в базе данных. БД должна содержать "девственную" копию данных, а затем обрабатывать ее (escape, quote и т.д.) По мере необходимости в той точке, в которой вы нуждаетесь в обработанной версии.