PHP Fatal error: Call to a member function fetch_all() on a non-object in mysqli.php

247
13 сентября 2017, 14:14

Никак не могу понять где собака зарыта. Вот код mysqli.php. Там собственно, одна функция, которая конектится к базе, отправляет запрос и возвращает ответ.

function executequery($query)
{
    require 'connection.php'; // подключаем переменные
    // подключаемся к серверу
    $db = new mysqli($host, $user, $password, $database);
    if ($db->connect_errno)
    {
        echo '<div class="error">Не удалось подключиться к MySQL: '.$db->connect_error.'</div>';
    }
    // устанавливаем кодировку
    if (!$db->set_charset("utf8"))
    {
        echo '<div class="error">Ошибка при загрузке набора символов utf8: '.$db->error.'</div>';
    }
    // запрашиваем вспомогательные данные
    $preparedQuery = $db->stmt_init();
    if ($preparedQuery->prepare ($query))
    {
        // запускаем запрос
        $preparedQuery->execute();
        // связываем переменные с результатами запроса
        $resultQuery = $preparedQuery->get_result();
        // закрываем запрос
        $preparedQuery->close();
    } else { print '<div class="error">Ошибка подготовки запроса</div>'; }
    $result = $resultQuery->fetch_all();//!!!!!!!!!!!!Вот эта строчка видимо не нравится
    // удаление выборки
    $resultQuery->free();
    // закрываем подключение
    $db->close();
    // возвращаем значение функции
    return $result;
}

При запросе с SELECT все замечательно работает: $result возвращает массив строк, что впрочем и должен делать fetch_all(). Но как только я посылаю в функцию запрос с INSERT все становится очень грустно:

  1. браузер в консоле выдает:

POST ../success.php 500 (Internal Server Error)

  1. лог ошибок хостинга выдает:

PHP Fatal error: Call to a member function fetch_all() on a non-object in блаблабла

  1. $result, в принципе, выдает пустой массив, но функция крашится. При этом запись в базе появляется.

Шо делать не знаю. Объясните, что не так и как пофиксить, пожалуйста.

Answer 1

fetch_all следует вызывать для $preparedQuery, а ни как не для $resultQuery.

Также напрягает последовательный вызов get_result и fetch. Логика этих функций подразумевает вызов только одной из них.

Почитайте еще раз внимательно документацию на функции get_result, fetch, fetch_all.

Answer 2

Почитав хорошенько документацию понял, что get_result()

возвращает результат для успешных запросов типа SELECT

и

FALSE для любых DML(INSERT, UPDATE, DELETE)

поэтому эти строчки

    $result = $resultQuery->fetch_all();
    $resultQuery->free();

обернул в условие

    if ($resultQuery)
    {
        $result = $resultQuery->fetch_all();
        $resultQuery->free();
    } else { $result = $db->errno; }

Остальное осталось прежним. Теперь функция справляется и с SELECT и с INSERT запросами=) С остальными не пробовал, но мне это и не нужно. Всем спасибо. Если кому надо, вот итоговая функция:

function executequery($query)
{
    require 'connection.php'; // подключаем переменные
    // подключаемся к серверу
    $db = new mysqli($host, $user, $password, $database);
    if ($db->connect_errno)
    {
        echo '<div class="error">Не удалось подключиться к MySQL: '.$db->connect_error.'</div>';
    }
    // устанавливаем кодировку
    if (!$db->set_charset("utf8"))
    {
        echo '<div class="error">Ошибка при загрузке набора символов utf8: '.$db->error.'</div>';
    }
    // запрашиваем вспомогательные данные
    $preparedQuery = $db->stmt_init();
    if ($preparedQuery->prepare($query))
    {
        // запускаем запрос
        $preparedQuery->execute();
        // связываем переменную с результатами запроса
        // возвращает результат для успешных запросов типа SELECT и FALSE для любых DML(INSERT, UPDATE, DELETE)
        $resultQuery = $preparedQuery->get_result();
        // закрываем запрос
        $preparedQuery->close();
    } else { print '<div class="error">Ошибка подготовки запроса</div>'; }
    if ($resultQuery)// FALSE для любых DML(INSERT, UPDATE, DELETE)
    {
        // записываем выборку в результирующую переменную
        $result = $resultQuery->fetch_all();
        // удаляем выборку
        $resultQuery->free();
    } else { $result = $db->errno; }// для успешных DML(INSERT, UPDATE, DELETE) запросов $db->errno = 0
    // закрываем подключение
    $db->close();
    // возвращаем значение функции
    return $result;
}
READ ALSO
как связать html и php-файлы?

как связать html и php-файлы?

Добрый деньНедавно начал изучать html и php, и столкнулся с проблемой, которую никак не могу решить

274
Отладка консольного выполнения кода

Отладка консольного выполнения кода

Можно ли в phpstorm настроить отладку так, чтобы можно было одновременно и web часть отлаживать и, если в коде параллельно встречается консольное...

161
Передать XML методом POST

Передать XML методом POST

Необходимо передать данные с интернет магазина на сервер доставки СДЭК с помощью XMLСкрипт просто перестают грузить страницу дальше

271
Как точно указать 1 месяц в секундах?

Как точно указать 1 месяц в секундах?

Каждый $i показывает такие времяА мне нужно точное время

220