Я настроил класс для обработки вызовов 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
затем вызвать мои методы. Но мне интересно узнать, нет ли чего-то странного, которого я не вижу.
Спасибо всем.
Похоже, вам нужно сбросить указатель результата после 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
Это в основном устанавливает указатель результата на первую запись.
$res->data_seek(0)
перед вторымfetch_all