使用php(mysqli)连续调用mysql过程不会产生结果


Successive mysql procedure calls with php(mysqli) does not yield a result

这是我的存储过程:

CREATE PROCEDURE productFromCatID(
  IN ID INT
)
BEGIN
  SELECT * FROM product
  WHERE cat_id = ID;
END;

这是我的php文件:

try {
  $mysqli = new mysqli($db_host, $db_username, $db_password, $db_name);
  $con = new mysqli($db_host, $db_username, $db_password, $db_name);
} catch (PDOException $exception) {
  echo "Connection error: " . $exception->getMessage();
}
print '<h3>MYSQLI: simple select</h3>';
$rs = $mysqli->query( 'SELECT * FROM product WHERE cat_id =2;' );
while($row = $rs->fetch_object())
{
  print_r($row);
}
$q = 'CALL productFromCatID(1)';
$rs = $mysqli->query( $q );
print '<h3>MYSQLI: '.$q.'</h3>';
while($row = $rs->fetch_object())
{
  print_r($row);
}
$q = 'CALL productFromCatID(2)';
$rs = $mysqli->query( $q );
print '<h3>MYSQLI: '.$q.'</h3>';
while($row = $rs->fetch_object())
{
  print_r($row);
}

除了最后一个查询:之外,一切都按照我的预期运行

$q = 'CALL productFromCatID(2)';
$rs = $mysqli->query( $q );
print '<h3>MYSQLI: '.$q.'</h3>';
while($row = $rs->fetch_object())
{
  print_r($row);
}

它不会返回结果。

这是php返回的

    MYSQLI: simple select
    stdClass Object
    (
        [product_id] => 6
        [product_navn] => Grønn te
        [cat_id] => 2
        [price] => 20.00
        [picture] =>  pics/te.png
        [description] => Klassisk grønn te, som gir et lyst vann med mye smak.
    )
    stdClass Object
    (
        [product_id] => 7
        [product_navn] => Frukt te
        [cat_id] => 2
        [price] => 20.00
        [picture] => pics/fruktte.jpg
        [description] => Frukt te også kjent som "bestemors frukt hage", består av deilige tørkede bær, frukter og blader.
    )
    stdClass Object
    (
        [product_id] => 8
        [product_navn] => Earl grey
        [cat_id] => 2
        [price] => 20.00
        [picture] =>  pics/earlgrey.jpg
        [description] => Eargrey er en svart te som er smaksatt med oljer og utvunnet av bergamottappelsin
    )
    stdClass Object
    (
        [product_id] => 9
        [product_navn] => Chai te
        [cat_id] => 2
        [price] => 25.00
        [picture] =>  pics/te.pgn
        [description] => Chai te er en søt krydderte fra india, hvor man erstatter vannet med melk.
    )
    stdClass Object
    (
        [product_id] => 11
        [product_navn] => Iskaffi Latte
        [cat_id] => 2
        [price] => 35.00
        [picture] =>  pics/iskaffilatte.jpg
        [description] => Iskaffi latte er en enkel iskaffi, tilsett gjerne en av våre siruper for ekstra smak.
    )
    stdClass Object
    (
        [product_id] => 12
        [product_navn] => Iste Fersken
        [cat_id] => 2
        [price] => 30.00
        [picture] =>  pics/icedteapeach.jpg
        [description] => Vår hjemmelagde fersken iste, trukket på fersken og mynte.
    )
    stdClass Object
    (
        [product_id] => 13
        [product_navn] => Iste Sitron
        [cat_id] => 2
        [price] => 30.00
        [picture] =>  pics/icedtealemon.jpg
        [description] => Vår hjemmelagde sitron iste, trukket på ferke sitroner og mynte.
    )

    MYSQLI: CALL produktFromCatID(1)
    stdClass Object
    (
        [product_id] => 1
        [product_navn] => Regular Coffe
        [cat_id] => 1
        [price] => 20.00
        [picture] => pics/regular.png 
        [description] => Vanelig svart kaffi med dyp aroma
    )
    stdClass Object
    (
        [product_id] => 2
        [product_navn] => Cappuccino
        [cat_id] => 1
        [price] => 30.00
        [picture] =>  pics/cappuccino.jpg
        [description] => Cappucino er laget av espresso og steamet melk og består av 1/3 melk, 1/3 espresso og 1/3 melkeskum
    )
    stdClass Object
    (
        [product_id] => 3
        [product_navn] => Espresso
        [cat_id] => 1
        [price] => 30.00
        [picture] => pics/espresso.png
        [description] => Espresso er en mer intens og smaksfull kaffitype enn vanelig filterkaffi.
    )
    stdClass Object
    (
        [product_id] => 4
        [product_navn] => Cafe Latte
        [cat_id] => 1
        [price] => 30.00
        [picture] =>  pics/cafelatte.jpg
        [description] => Cafe Latte lages av espresso og varm melk, hvor det er en del espresso og fem deler melk.
    )
    stdClass Object
    (
        [product_id] => 5
        [product_navn] => Caffe Mocca
        [cat_id] => 1
        [price] => 30.00
        [picture] => pics/cafemocca.jpg
        [description] => Cafe mocca er en drikk som lages på samme måte som cafe latte, med espresso og melk, men her tilsettes også sokolade.
    )
    stdClass Object
    (
        [product_id] => 10
        [product_navn] => Iskaffi Mocca
        [cat_id] => 1
        [price] => 35.00
        [picture] =>  pics/iskaffimocca.jpg
        [description] => En iskald cafe mocca med ekstra sjokolade for masse smak.
    )
    MYSQLI: CALL produktFromCatID(2)
    Fatal error:  Call to a member function fetch_object() on a non-object on line 39

正如您在底部看到的,我在第39行收到一个错误,该错误处于最后一次调用productFromCatID 后的while循环状态

while($row = $rs->fetch_object())

那么,我在调用程序时是做错了什么,还是错过了一步?

$q = 'CALL productFromCatID(1)';
$rs = $mysqli->query( $q );
print '<h3>MYSQLI: '.$q.'</h3>';
while($row = $rs->fetch_object())
{
  print_r($row);
}

存储过程将返回两个结果集,第一个是您要查找的结果集,第二个是存储过程的状态(OK、ERROR等)。

因此,在再次查询之前,您需要释放缓冲的结果。

while ($mysqli->next_result()) {
    $rs = $mysqli->use_result();
    if ($rs instanceof mysqli_result) {
        $rs->free();
    }
}

然后您可以执行下一个过程调用。