2

我有一个带有 4 个菜单(产品、供应商、采购、客户)的 php 代码。每个菜单都有自己的存储过程。每个meanu都有这些代码:

产品代码:

<?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

4 回答 4

2

MySQL 过程不返回结果集。您可以从 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);
于 2013-03-25T14:44:19.930 回答
1

试试这个:

**

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

**

在获取结果后放置它并查看魔术。

于 2013-03-28T07:53:41.227 回答
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;
    ?>

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

--------已编辑---------

仅用于调试,将代码替换为:

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

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

继续调试的东西......创建一个名为 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();
  }


?>

如果这以正确的方式显示您的数据,那么您的问题不在这里。你能发布这个脚本的结果吗?

萨卢多斯 ;)

于 2013-03-25T14:43:02.430 回答
0

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

要获得“下一个”结果,您必须调用:

<?php

  // Assuming $connection is your MySQLI object

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

?>
于 2013-03-25T14:46:39.013 回答