解决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 调用代码
- $db=new mysqli("localhost","root","root","manage");
- if (mysqli_connect_errno())
- {
- printf("Connect failed: %s/n", mysqli_connect_error());
- exit();
- }
- $db->query("set names 'gb2312'");
- $rs = array();
- if ($result = $db->query("call sp_test()"))
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rs,$row);
- }
- $result->free();
- }
- var_dump($rs);
运行上面的代码你会很高兴成功了!!!,可是没有想到后面出了个大问题,来看看下面吧
- $db=new mysqli("localhost","root","root","manage");
- if (mysqli_connect_errno())
- {
- printf("Connect failed: %s/n", mysqli_connect_error());
- exit();
- }
- $db->query("set names 'gb2312'");
- $rs = array();
- if ($result = $db->query("call sp_test()"))
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rs,$row);
- }
- $result->free();
- }
- var_dump($rs);
- $rss = array();
- if ($result = $db->query("select * from test"))
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rss,$row);
- }
- $result->free();
- }
- var_dump($rss);
运行上面的代码问题就来了,$rss数组是空的(在有的情况下还是出现“Call to a member function fetch_array() on a non-object错误”),为什么会样呢? 我们把代码改改看
- $db=new mysqli("localhost","root","root","manage");
- if (mysqli_connect_errno())
- {
- printf("Connect failed: %s/n", mysqli_connect_error());
- exit();
- }
- $db->query("set names 'gb2312'");
- $rss = array();
- if ($result = $db->query("select * from test"))
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rss,$row);
- }
- $result->free();
- }
- var_dump($rss);
- $rs = array();
- if ($result = $db->query("call sp_test()"))
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rs,$row);
- }
- $result->free();
- }
- var_dump($rs);
运行上面的我们发现没有问题,这为什么呢?在同一个链接执行存储过程后不能执行其它的sql语句,我们再把代码改改看
- $db=new mysqli("localhost","root","root","manage");
- if (mysqli_connect_errno())
- {
- printf("Connect failed: %s/n", mysqli_connect_error());
- exit();
- }
- $db->query("set names 'gb2312'");
- $rs = array();
- $result = $db->real_query("call sp_test()");
- do
- {
- if($result = $db->store_result())
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rs,$row);
- }
- $result->free();
- }
- }while($db->next_result());
- var_dump($rs);
- $rss = array();
- if ($result = $db->query("select * from test"))
- {
- while ($row = $result->fetch_array(MYSQLI_ASSOC))
- {
- array_push($rss,$row);
- }
- $result->free();
- }
- 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
这是因为当存储过程调用时,其指针没有释放,导致占用了资源。只有清空就可以了。
- 解决PHP调存储过程问题
- 解决PHP调存储过程问题
- oracle存储过程!解决网友问题
- 解决存储过程编译卡死问题
- ASP分页存储过程问题,求解决
- 解决oracle存储过程死锁问题
- 解决 调PL/SQL存储过程报 trailing null missing from STR bind value 的问题
- 未能找到存储过程 'dbo.aspnet_CheckSchemaVersion'问题的解决
- 如何解决Remoting无法传输存储过程参数的问题
- 如何解决Remoting无法传输存储过程参数的问题
- sql server存储过程中解决单引号的问题
- 解决存储过程中表名为变量的问题
- 解决Oracle存储过程中创建不了表的问题
- mysql存储过程的中文问题的解决
- 关于Oracle存储过程执行权限问题的解决
- 查询数据库数据连续性问题---存储过程解决
- 存储过程,解决机房收费系统多表操作问题
- Mysql 存储过程生成订单号,解决分布式问题
- struts2访问web元素
- Linux下Eclipse界面优化方案及代码
- 【经验学习】三个方法让你成为更好的程序员
- linux getopt函数用法
- listView优化
- 解决PHP调存储过程问题
- Linux tcpdump命令详解
- 安装部署CloudStack 4.0企业私有云平台
- Hadoop集群的配置调优
- ListView动态加载数据模板(使用代码布局)
- 浏览器模拟手机
- 第九章 – 图像局部与分割 – 视频中是直线像素采样(cvInitLineIterator )
- Linux面试题目
- Windows phone应用开发[15]-辅助工具