这是我的存储过程:
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())
所以我在调用程序时做错了什么或者我错过了一步?
答案 0 :(得分:1)
$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();
}
}
然后你可以进行下一个程序调用。