Как вывести несколько строк из запроса SQL, используя объект mysqli

0

Предполагая, что объект 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() в классе и все еще прокручивать записи?

Теги:
loops
oop
mysqli

1 ответ

0
Лучший ответ

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

  • выполнить запрос
  • выберите первую строку
  • обрабатывать первую строку
  • вернуть первую строку

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

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

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

  • 0
    @ Марк: Спасибо за объяснение. Я очень новичок в ООП. У меня есть вопрос о безопасности как продолжение. У меня не включен magic_quotes_gpc, но я использовал addlashes () для всего, что отправляется через форму, прежде чем я добавлю ее в базу данных. Есть ли лучший способ защитить данные? Как еще я должен фильтровать данные, которые кто-то отправляет через ввод данных, чтобы я мог безопасно ввести их в свою базу данных?
  • 0
    Лучший способ написать «безопасный» запрос - это использовать PDO ( php.net/PDO ) с подготовленными операторами. Они будут обрабатывать всю тяжелую работу по цитированию / экранированию данных. В противном случае лучше использовать mysql_real_escape_string (), а не addlashes (). Функция mysql использует собственные механизмы цитирования mysql. addlashes - это просто функция замены тупой строки, которая может быть одурачена юникодом / нетрадиционными символами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню