使用存储过程时出现php错误

时间:2013-03-25 14:24:09

标签: php mysql stored-procedures

我有4个菜单的PHP代码(产品,供应商,购买,客户)。每个菜单都有自己的存储过程。每个意思都有这些代码:

产品代码:

<?php
$sql=$mysqli->query("call selectproducts()");
$i=1;
while($row=mysqli_fetch_array($sql)){
    $id=$row['prodid'];
    $date=$row['prodname'];
    $item=$row['proddescription'];
    $qtyleft=$row['prodsupplier'];
    $qty_sold=$row['proddate'];
    $price=$row['prodprice'];
    $sales=$row['prodquantity'];
    if($i%2){
?>
<tr id="<?php echo $id; ?>" class="edit_tr">
<?php } else { ?>
<tr id="<?php echo $id; ?>" bgcolor="#f2f2f2" class="edit_tr">
<?php } ?>
<td class="edit_td"><span class="text"><?php echo $date; ?></span> </td>
<td><span class="text"><?php echo $item; ?></span> </td>
<td><span class="text"><?php echo $qtyleft; ?></span></td>
<td><span id="last_<?php echo $id; ?>" class="text">
<?php
   echo $qty_sold;
?>

我的问题是每当我尝试在其他菜单中使用存储过程时,甚至在1菜单中使用其他方法中的错误(供应商,购买,客户):

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given

简而言之,如果我只包含一(1)个存储过程,则会发生错误。一切都会有效的唯一方法是当我以正常方式使用它时(SELECT * from table)。

可能是什么问题?请帮助我......这是我项目中唯一的问题。

Mysql存储过程代码:

CREATE DEFINER=`root`@`localhost` PROCEDURE `selectproducts`()
begin
select * from products order by ProdID;
end

这是完整的代码:     http://jsfiddle.net/WKKD4/

抱歉,我没有别的地方可以穿上它。

4 个答案:

答案 0 :(得分:2)

MySQL Procedure不返回结果集。您可以从MySQL过程访问结果的方式如下所示。

CREATE PROCEDURE selectproducts (OUT ver_param VARCHAR(25))
BEGIN
  # Set value of OUT parameter
  SELECT count(ProdId)  INTO ver_param from products;
END;

现在要访问PHP脚本中的输出,请在程序调用后立即执行以下查询。

$sql = $mysqli->query("call selectproducts(@productcount)");
$results = $mysqli->query ("select @productcount as COUNT");
$rows = mysqli_fetch_array($results);

答案 1 :(得分:1)

试试这个:

**

$sql->close();
$mysqli->next_result();

**

在获取结果后放置它并看到魔法。

答案 2 :(得分:0)

尝试对代码进行此更改:

<?php

    $result = $mysqli->query("call selectproducts()");
    $i=1;
    while($row = $result->fetch_assoc()){
        $id=$row['prodid'];
        $date=$row['prodname'];
        $item=$row['proddescription'];
        $qtyleft=$row['prodsupplier'];
        $qty_sold=$row['proddate'];
        $price=$row['prodprice'];
        $sales=$row['prodquantity'];
        if($i%2){
    ?>
    <tr id="<?php echo $id; ?>" class="edit_tr">
    <?php } else { ?>
    <tr id="<?php echo $id; ?>" bgcolor="#f2f2f2" class="edit_tr">
    <?php } ?>
    <td class="edit_td"><span class="text"><?php echo $date; ?></span> </td>
    <td><span class="text"><?php echo $item; ?></span> </td>
    <td><span class="text"><?php echo $qtyleft; ?></span></td>
    <td><span id="last_<?php echo $id; ?>" class="text">
    <?php
       echo $qty_sold;
    ?>

这是一个小小的改变,但它应该有效。

-------- --------- EDITED

仅用于调试,用以下代码替换代码:

$rs = $mysqli->query("call selectproducts();");
while($row = $rs->fetch_object())
{
var_dump($row);
}

------------ EDIT2 ----------------------

继续使用debuugging的东西....制作一个名为test.php的新PHP脚本....将此代码放入其中:

 <?php
  include('db.php');

  $query = "call selectproducts()";

  if ($result = $mysqli->query($query)) {

      /* obtener array asociativo */
      while ($row = $result->fetch_assoc()) {
          echo $row['prodid']."------".$row["prodname"])."</br>";
      }

      /* liberar el resultset */
      $result->free();
  }


?>

如果以正确的方式显示您的数据,则问题不在此处。你可以发布这个脚本的结果吗。

Saludos;)

答案 3 :(得分:0)

您将获得多个结果。 SELECT的结果以及调用的结果。

要获得“下一个”结果,您必须致电:

<?php

  // Assuming $connection is your MySQLI object

  while($connection->next_result()) $connection->store_result();

?>