Я обнаружил, что результат mysqli_store_result
имеет другое поведение, независимо от того, проверяете ли вы результат или нет.То, что я не нашел, это объяснение, почему.
У меня есть следующий PHP-код (часть его):
$qry = mysqli_multi_query($this->link, $sql);
if ($qry) {
do {
$sto = mysqli_store_result($this->link);
if ($sto) {
$res[] = mysqli_fetch_all($sto, MYSQLI_ASSOC);
mysqli_free_result($sto);
mysqli_store_result
возвращает буферизованный объект результата или FALSEесли в соответствии с руководством произошла ошибка, которая сохраняется в переменной $sto
.Все работает нормально, и mysqli_fetch_all
принимает переменную $sto
и возвращает ассоциативный массив в $res
со всеми результатами.Выглядит примерно так:
$res = Array (1)
[0] = Array (1)
| [0] = Array (11)
| | [s_id] = Number: 82
| | [s_auth] = String: ''
| | [s_titl] = String: '"Who's Who"'
| | [s_abbr] = String: '"Who's Who"'
| | [s_publ] = String: ''
| | [s_text] = String: ''
| | [s_chan] = String: '2018-09-23 11:37:35'
Для отладки этого процесса я записал в лог-файл, когда отладка включена.Измененный код начинается с "if ($ deb) ...".Код выглядит следующим образом:
$qry = mysqli_multi_query($this->link, $sql);
if ($deb) {$this->logg_mysql_debug(' $qry = '.$this->obj_to_str($qry),$prog,$row,__LINE__);}
if ($qry) {
if ($deb) {$this->logg_mysql_debug(' *** DO-LOOP ***',$prog,$row,__LINE__);}
do {
$sto = mysqli_store_result($this->link);
if ($deb) {$this->logg_mysql_debug(' $sto1 = '.$this->obj_to_str($sto1),$prog,$row,__LINE__);}
if ($sto) {
$res[] = mysqli_fetch_all($sto, MYSQLI_ASSOC);
if ($deb) {$this->logg_mysql_debug(' $res = '.$this->obj_to_str($res),$prog,$row,__LINE__);}
mysqli_free_result($sto);
Когда он запускается с $ deb = 1, объект $ sto будет выглядеть так:
$sto = Object (mysqli_result)
0 -> Array (11)
| [s_id] = Number: 82
| [s_auth] = String: ''
| [s_titl] = String: '"Who's Who"'
| [s_abbr] = String: '"Who's Who"'
| [s_publ] = String: ''
| [s_text] = String: ''
| [s_chan] = String: '2018-09-23 11:37:35'
Но $ res теперь выглядит так:
$res = Array (1)
[0] = Array (0)
Таким образом, при печати содержимого $sto
оно каким-то образом изменит свое первоначальное состояние на то, что не даст тот же результат для вызова на mysqli_fetch_all
.
Мое решение состоит в том, чтобы просто пропустить печать $sto
и все работает нормально, но мне любопытно, если это изменение в состоянии (поведении?) Где-то описано?