Как вывести несколько строк из запроса SQL, используя объект mysqli - PullRequest
0 голосов
/ 14 июня 2010

Предполагая, что объект 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;
    }
}

В БД есть несколько сотен спискови когда я вызываю $ result-> fetch_array (), он помещает в массив первую строку в БД.однако, когда я пытаюсь вызвать объект, я не могу получить доступ больше, чем к первой строке.например: $ list_row = новый список;while ($ list = $ list_row-> getListingInfo ()) {echo $ листинг [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 () в классе и по-прежнему циклически перебирать записи?

1 Ответ

0 голосов
/ 14 июня 2010

Ваш объект в корне ошибочен - он перезапускает запрос каждый раз, когда вы вызываете метод getListingInfo ().Кроме того, mysql_fetch_array() не извлекает весь набор результатов, он только извлекает следующую строку, поэтому ваш метод сводится к следующему:

  1. выполнить запрос
  2. получить первую строку
  3. обработать первую строку
  4. вернуть первую строку

Каждый вызов объекта создает новый запрос, новый набор результатов и, следовательно, никогда не сможет получить 2-й, 3-е и т. Д. Строки.

Если ваш набор данных не является "огромным" (то есть: больше, чем вы хотите / можете установить PHP memory_limit), нет никаких причин НЕ извлекать весь набор и обрабатыватьвсе это за один раз, как показано в ответе Джейкоба выше.

В качестве дополнительного примечания, использование Stripslashes заставляет меня задуматься, включена ли в вашей установке PHP magic_quotes_gpc.Эта функциональность давно устарела и будет удалена из PHP при выходе v6.0.Если ваш код работает так же, как и при такой установке, он может уничтожить законные экранированные данные.Кроме того, обычно плохая идея хранить закодированные / экранированные данные в базе данных.БД должна содержать «первичную» копию данных, и вы затем обрабатываете ее (escape, кавычки и т. Д.) По мере необходимости в момент, когда вам требуется обработанная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...