Никак не могу понять где собака зарыта. Вот код 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 все становится очень грустно:
POST ../success.php 500 (Internal Server Error)
PHP Fatal error: Call to a member function fetch_all() on a non-object in блаблабла
Шо делать не знаю. Объясните, что не так и как пофиксить, пожалуйста.
fetch_all следует вызывать для $preparedQuery, а ни как не для $resultQuery.
Также напрягает последовательный вызов get_result и fetch. Логика этих функций подразумевает вызов только одной из них.
Почитайте еще раз внимательно документацию на функции get_result, fetch, fetch_all.
Почитав хорошенько документацию понял, что 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;
}
Добрый деньНедавно начал изучать html и php, и столкнулся с проблемой, которую никак не могу решить
Можно ли в phpstorm настроить отладку так, чтобы можно было одновременно и web часть отлаживать и, если в коде параллельно встречается консольное...
Необходимо передать данные с интернет магазина на сервер доставки СДЭК с помощью XMLСкрипт просто перестают грузить страницу дальше