解决PHP调存储过程问题

来源:互联网 发布:java gzip 压缩文件 编辑:程序博客网 时间:2024/05/22 06:31

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就明白。


提示

这是运用mysqli链接数据库所以会出现

Call to a member function fetch_array() on a non-object


如果用mysql_pconnect链接数据库就会出现

Commands out of sync; you can't run this command now


这是因为当存储过程调用时,其指针没有释放,导致占用了资源。只有清空就可以了。

原创粉丝点击