代码之家  ›  专栏  ›  技术社区  ›  Carson Myers

无法从msqli::multi查询中返回行

  •  0
  • Carson Myers  · 技术社区  · 14 年前

    我有一个包含许多语句的SQL查询。它:

    1. 设置用户变量
    2. 调用存储过程
    3. 调用另一个存储过程
    4. 选择一些数据

    我知道这个查询是正确的,因为我已经在同一个用户的mysql工作台上对它进行了测试。查询如下:

    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 回复  |  直到 14 年前
        1
  •  1
  •   Chuck Burgess    14 年前

    试试这个:

    $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!';
    }
    

    这将帮助您捕获任何错误。另外,我认为您的使用结果需要与下一个结果交换。

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

        2
  •  0
  •   shamittomar    14 年前

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

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