Результат mysqli_store_result ведет себя по-разному - PullRequest
0 голосов
/ 03 октября 2018

Я обнаружил, что результат 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 и все работает нормально, но мне любопытно, если это изменение в состоянии (поведении?) Где-то описано?

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