MySQLi fetch_all Ошибка с последовательными вызовами

0

Я настроил класс для обработки вызовов MySQLi. Звонки работают так, как должны, поэтому проблем нет.

Недавно я удалил обработку результатов из моего метода запросов класса до двух отдельных методов сеттера. Теперь возникает ошибка, вызванная двумя последовательными fetch_all.

Предыдущий (рабочий) код с одним fetch_all загружает результаты в два массива res_rows и res_cols:

// Convert results into two sets of values
// and store in properties
// $res_rows=results by row (column names in element 0)
//           Each row is an indexed array 
// $res_cols=results by column (associative arrays)
//           Key is the column name; Value is an array

$results=$res->fetch_all(MYSQLI_ASSOC);

// $colNames is an array of the column names
$colNames=array_keys($results[0]);

// Rows
foreach($results as $r) {
    $this->res_rows[]=array_values($r);
}
array_unshift($this->res_rows,$colNames);

// Columns

$vals=array();

// Count the number columns in the query
$numCols=count($colNames);

// Iterate through the columns
for($i=0;$i<$numCols;$i++) {

    $col=$colNames[i];
    $storage=array();

    foreach($results as $r) {
        $storage[]=$r[$colNames[$i]];
    }

    $vals[]=$storage;
}

$this->res_cols=array_combine($colNames,$vals);

Я переместил этот код в два метода setRes_rows и setRes_cols и вызвал их последовательно (см. Код). Каждый метод извлекает результаты из объекта результата, используя fetch all.

$this->setRes_rows($res);
$this->setRes_cols($res);

Случается, что первый вызов ведет себя так, как ожидалось, а второй вызов возвращает пустой массив.

Если я setRes_cols вызовы (например, setRes_cols), то происходит одно и то же (первый вызов работает, как и ожидалось, второй звонок пуст). Поэтому я знаю, что код хорош. Я даже изменил все имена переменных в одном из методов без эффекта.

Я сбросил все свойства и методы объекта результата между вызовами, и он не выглядит так, как будто он изменяется. Но почему-то второй fetch_all не работает.

Простое решение для меня использовать один fetch_all затем вызвать мои методы. Но мне интересно узнать, нет ли чего-то странного, которого я не вижу.

Спасибо всем.

  • 0
    Я не нашел ничего ясного в документации о том, как fetch_all устанавливает указатель, НО вы можете попробовать сделать $res->data_seek(0) перед вторым fetch_all
  • 0
    Вы, сэр, гений. Я даже не думал сбросить указатель.
Показать ещё 1 комментарий
Теги:
mysqli

1 ответ

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

Похоже, вам нужно сбросить указатель результата после fetch_all.
Я не нашел ничего в документах специально для fetch_all - только об перезагрузке после fetch_assoc(), где мы можем найти ссылку на data_seek(): http://php.net/manual/en/mysqli-result.data -seek.php

Итак, что вы должны делать:

перед вторым fetch_all() выполните

$res->data_seek(0);  // where $res is your mysqli result Object

Это в основном устанавливает указатель результата на первую запись.

  • 1
    Мне удалось найти ссылку на указатель результатов здесь: < php.net/manual/en/mysqli-result.data-seek.php#85629 >. Я действительно ценю помощь, Джефф. Спасибо!

Ещё вопросы

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