Возникли проблемы с возвращением строк из msqli::multi_query
У меня есть SQL-запрос, который содержит несколько операторов. Это:
- устанавливает переменную пользователя
- вызывает хранимую процедуру
- вызывает другую хранимую процедуру
- выбирает некоторые данные
Я знаю, что запрос правильный, потому что я тестировал его в MySQL Workbench, под тем же пользователем. Запрос таков:
set @current_post = 535; /* 535 for testing, this will be a variable */
call under_user_type(@currrent_post, @user_type, @user_id);
call get_category(@current_post, @category);
select p.post_title, p.post_name,
(
swell_wp.post_score(p.ID)
) as score,
(
swell_wp.is_under_user(p.ID, @user_type, @user_id)
) as under_user,
(
swell_wp.is_under_category(p.ID, @category)
) as under_category
from wp_posts as p
where p.post_type = 'post'
and p.id != @current_post
and p.post_status = 'publish'
having (
under_user = true
or under_category = true
)
order by score desc;
это просто хранится в строке: $sql
, Затем я делаю это с помощью PHP:
$query = new MySQLi(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$query->multi_query($sql);
do {
$query->next_result();
} while( ! $result = $query->use_result() );
print_r($result);
это печатает объект результата, но тот, который пуст. Попытка перебрать его также не дает никаких результатов.
Что я делаю неправильно? Могу ли я даже использовать такие переменные пользователя? Или мне нужно превратить процедуры в хранимые функции и выполнить три отдельных запроса?
2 ответа
Попробуй это:
$query = new MySQLi(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($query->multi_query($sql)) {
do {
if ($result = $query->use_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
} while ($query->next_result());
} else {
echo 'ERROR FOR QUERY!';
}
Это должно помочь вам отследить любые ошибки. Кроме того, я думаю, что ваш use_result должен быть заменен на next_result.
ОБНОВЛЕНО: Еще одна вещь, проверяете ли вы, чтобы переменные, которые вы передаете в запрос, действительно содержали данные? Напечатайте наш запрос, чтобы убедиться, что вы можете запустить его в базе данных и получить результаты вручную.
Вы, очевидно, не извлекаете строки из результата. Пожалуйста, измените код на это, и он напечатает результаты.
$query = new MySQLi(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$query->multi_query($sql);
do {
/* store first result set */
if ($result = $query->use_result())
{
while ($row = $result->fetch_row())
{
print_r($row);
}
$result->close();
}
/* print divider */
if ($query->more_results())
{
printf("-----------------\n");
}
} while ($query->next_result());