возникли проблемы с возвращением строк из msqli :: multi_query - PullRequest
0 голосов
/ 18 августа 2010

У меня есть SQL-запрос, который содержит несколько операторов.Он:

  1. устанавливает переменную пользователя
  2. вызывает хранимую процедуру
  3. вызывает другую хранимую процедуру
  4. выбирает некоторые данные

Я знаю, что запрос правильный, потому что я тестировал его в 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 ]

1 голос
/ 18 августа 2010

Попробуйте это:

$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.

ОБНОВЛЕНО: Еще одна вещь, проверяете ли вы, чтобы переменные, которые вы передаете в запрос, действительно содержали данные?Напечатайте наш запрос, чтобы убедиться, что вы можете запустить его в базе данных и получить результаты вручную.

0 голосов
/ 18 августа 2010

Вы явно не выбираете строки из результата. Пожалуйста, измените код на это, и он напечатает результаты.

$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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...