解决PHP调存储过程问题

 php 调存储过程没有java和.NET方便,希望下一个版本能好点。

我们来看一下面的例子

 

数据库代码


CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(50),
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312 AUTO_INCREMENT=1 ;

 

insert into `test` (title) values ('好人');

 

--存储过程
DELIMITER $$;
DROP PROCEDURE IF EXISTS `sp_test`$$
CREATE PROCEDURE `sp_test` ()
BEGIN
 select * from test;
END$$
DELIMITER ;$$

 

php 调用代码

  1.  $db=new mysqli("localhost","root","root","manage");
  2.  if (mysqli_connect_errno())
  3.  {
  4.   printf("Connect failed: %s/n", mysqli_connect_error());
  5.   exit();
  6.  }
  7.  $db->query("set names 'gb2312'");
  8.  $rs = array();
  9.  if ($result = $db->query("call sp_test()"))
  10.  {
  11.   while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
  12.   {
  13.    array_push($rs,$row);
  14.   }
  15.   $result->free(); 
  16.  }
  17.  var_dump($rs);

运行上面的代码你会很高兴成功了!!!,可是没有想到后面出了个大问题,来看看下面吧

 

  1.     $db=new mysqli("localhost","root","root","manage");
  2.     if (mysqli_connect_errno())
  3.     {
  4.         printf("Connect failed: %s/n", mysqli_connect_error());
  5.         exit();
  6.     }
  7.     $db->query("set names 'gb2312'");
  8.     
  9.     $rs = array();
  10.     if ($result = $db->query("call sp_test()"))
  11.     {
  12.         while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
  13.         {
  14.             array_push($rs,$row);
  15.         }
  16.         $result->free(); 
  17.     }
  18.     var_dump($rs);
  19.     
  20.     $rss = array();
  21.     if ($result = $db->query("select * from test"))
  22.     {
  23.         while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
  24.         {
  25.             array_push($rss,$row);
  26.         }
  27.         $result->free(); 
  28.     }
  29.     var_dump($rss);

运行上面的代码问题就来了,$rss数组是空的(在有的情况下还是出现“Call to a member function fetch_array() on a non-object错误”),为什么会样呢? 我们把代码改改看

  1.     $db=new mysqli("localhost","root","root","manage");
  2.     if (mysqli_connect_errno())
  3.     {
  4.         printf("Connect failed: %s/n", mysqli_connect_error());
  5.         exit();
  6.     }
  7.     $db->query("set names 'gb2312'");
  8.     
  9.     $rss = array();
  10.     if ($result = $db->query("select * from test"))
  11.     {
  12.         while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
  13.         {
  14.             array_push($rss,$row);
  15.         }
  16.         $result->free(); 
  17.     }
  18.     var_dump($rss);
  19.     
  20.     $rs = array();
  21.     if ($result = $db->query("call sp_test()"))
  22.     {
  23.         while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
  24.         {
  25.             array_push($rs,$row);
  26.         }
  27.         $result->free(); 
  28.     }
  29.     var_dump($rs);

运行上面的我们发现没有问题,这为什么呢?在同一个链接执行存储过程后不能执行其它的sql语句,我们再把代码改改看

 

  1.     $db=new mysqli("localhost","root","root","manage");
  2.     if (mysqli_connect_errno())
  3.     {
  4.         printf("Connect failed: %s/n", mysqli_connect_error());
  5.         exit();
  6.     }
  7.     $db->query("set names 'gb2312'");
  8.     
  9.     $rs = array();
  10.     $result = $db->real_query("call sp_test()");
  11.     do 
  12.     {
  13.         if($result = $db->store_result())
  14.         {
  15.             while ($row = $result->fetch_array(MYSQLI_ASSOC))
  16.             {
  17.                 array_push($rs,$row);
  18.             }
  19.             $result->free(); 
  20.         }
  21.     }while($db->next_result());
  22.     var_dump($rs);
  23.     
  24.     $rss = array();
  25.     if ($result = $db->query("select * from test"))
  26.     {
  27.         while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
  28.         {
  29.             array_push($rss,$row);
  30.         }
  31.         $result->free(); 
  32.     }
  33.     var_dump($rss);

运行上面的我们发现没有问题,什么原因呢?大家查一下PHP手册吧,看看store_result、next_result就明白。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值