使用mysqli::multi_query在PHP页面上运行多个查询;查询在单独执行而不是一起执行时有效

d4so4syb  于 2023-04-10  发布在  PHP
关注(0)|答案(1)|浏览(128)

我在一个模拟书店网站上工作,我必须运行一个MySQL数据库的查询,我有一个任务,并使用PHP从数据库中的信息构建网页。
其中一个页面列出了所有的书以及过滤器类型的链接,这给了我一些问题。我的服务器上有2个存储过程,我的PHP代码用来构建这个页面。下面是相关的代码:

<?php
/*
username, password, and server name declarations up here
*/

$sqlConnection = new mysqli($servername, $username, $password, 'volga_db');

// Check connection
if ($sqlConnection->connect_error)
{
    die("Connection failed: " . $sqlConnection->connect_error);
}

$query = "call getAllBooks();";     // Stored procedure to get a list of all books and information relating to them
$query .= "call getAllGenres();";   // Stored procedure to get a list of all genres and their IDs

if ($sqlConnection->multi_query($query))
{
    $bookResultSet = $sqlConnection->store_result();

    while ($sqlConnection->more_results())
    {
        $sqlConnection->next_result();
        $genreResultSet = $sqlConnection->store_result();
    }
}
else
{
    echo "Error executing queries: " . $sqlConnection->error;
}
?>

值得注意的是:如果我注解掉所有与multi_query相关的代码,并单独调用任何一个存储过程,查询功能就像预期的那样,当我在Web浏览器上打开页面时,我可以直观地看到这一点。此外,我的网页上根本没有“Error executing queries”,这表明multi_query返回的值是true
我试着用几种不同的形式编写代码,如下所示:

$bookResultSet = $sqlConnection->query("call getAllBooks()");
$genreResultSet = $sqlConnection->query("call getAllGenres()");
$query = "call getAllBooks();";
$query .= "call getAllGenres();";

$combinedResultSet = $sqlConnection->multi_query($query);

$bookResultSet = $sqlConnection->store_result();
$genreResultSet = $sqlConnection->next_result();

...和上面的大片段,但是无论我如何编写代码,我总是得到相同的错误:Fatal error: Uncaught Error: Call to a member function fetch_assoc() on bool in C:\...\shop.php:73 Stack trace: #0 {main} thrown in C:\...\shop.php on line 73
我还尝试了反转$bookResultSet$genreResultSet,有趣的是,当这种情况发生时,会发生反转,其中$genreResultSet显示正常,而$bookResultSet在尝试调用fetch_assoc()时抛出错误
总而言之,我已经做了大量的研究,并尝试了许多不同的解决方案,我已经在互联网上找到,但还没有能够找到任何给我至少一个不同的错误消息。

fkaflof6

fkaflof61#

已解决:我发现存储过程返回多集。我通过清除每个后续结果集来解决此问题,如下所示:

$bookResultSet = $sqlConnection->query("call getAllBooks()");
$sqlConnection->next_result();
$genreResultSet = $sqlConnection->query("call getAllGenres()");
$sqlConnection->next_result();

相关问题