【问题标题】:having trouble with getting rows back from msqli::multi_query从 msqli::multi_query 取回行时遇到问题
【发布时间】:2010-08-18 03:39:38
【问题描述】:

我有一个包含许多语句的 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);

这会打印一个结果对象,但它是空的。尝试对其进行迭代也不会产生任何结果。

我做错了什么?我什至可以使用这样的用户变量吗?还是我需要将过程转换为存储函数并执行三个单独的查询?

【问题讨论】:

    标签: php sql mysql multi-query user-variables


    【解决方案1】:

    试试这个:

    $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 交换。

    更新:另一件事,您是否检查以确保传递给查询的变量实际上包含数据?打印我们的查询以确保您可以在数据库中运行它并手动获取结果。

    【讨论】:

    • 我从 mysql 工作台复制了查询。我确实让它工作了,但有两个问题:第一个是我想我需要使用 mysqli::store_result 而不是使用结果。第二个是我认为打印$result 会显示它的内容,而不必循环它。我错了,使用文档代码让它工作
    【解决方案2】:

    您显然没有从结果中获取行。请将代码更改为此,它将打印结果。

    $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());
    

    【讨论】:

    • 我拥有所有这些,但我的结果是空的 - 尝试获取行目前没有任何作用,因为我无法获得任何结果
    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    相关资源
    最近更新 更多