PHP 不支持mysql call procedure的连续查询

数据城郭 2011-10-24 12:44:41
PHP 不支持mysql call procedure的连续查询, 发现PHP只可以 执行一次mysql call procedure, 即使是最简单的procedure,第2次查询也会失败。我的各个系统全部是最新的版本了, windows xp sp3, mysql 5.5.15,PHP 5.3.8,

下列语句我出现问题以后,拿最简单的进行测试, 结果还是失败了(实际需要执行的当然比这个复杂多了)
已经确认不是mysql的问题, 用mysql的客户端执行是没有任何问题的。

mysql:
CREATE PROCEDURE domain_need_ip( )
BEGIN
SELECT domain_name FROM domain1 WHERE flag1<100 ORDER BY flag1 LIMIT 1;
END;

<?php
define('CLIENT_MULTI_RESULTS', 131072);

$db1=@mysql_connect( 'localhost','root','',1,CLIENT_MULTI_RESULTS) OR die('Counld not

connect to Mysql:'.mysql_error());
@mysql_select_db('mydb',$db1) OR die('Counld not Select the database:'.mysql_error());

$query = 'call domain_need_ip()';
$result=mysql_query($query,$db1);
if( FALSE===$result ) echo 'bad!!!'.PHP_EOL;
else echo 'ok!'.PHP_EOL;

$query = 'call domain_need_ip()';
$result=mysql_query($query,$db1);
if( FALSE===$result ) echo 'bad!!!'.PHP_EOL;
else echo 'ok!'.PHP_EOL;
?>

其中 define('CLIENT_MULTI_RESULTS', 131072); 是某些论坛说, 加上 这个参数可解决完全不能使用mysql call procedure的问题, 结果加了也没有任何用处, 这个是否是PHP的一个大BUG? 有无解决帮办法?
...全文
206 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
数据城郭 2011-10-24
  • 打赏
  • 举报
回复
存储过程已经在mysql中 了 , 并且第1次这个函数执行返回已经成功了,第2次调用就失败了。
ohmygirl 2011-10-24
  • 打赏
  • 举报
回复
需要把创建存储过程的语句在php中执行
mysql_query(.....);
数据城郭 2011-10-24
  • 打赏
  • 举报
回复
问题已经确认, 并且得到了解决, 感谢ohmygirl, 她的答案是最接近真相的,给35分
foolbirdflyfirst 指出要使用mysqli,也是必要的 条件之一,
我查看了 php_mysql.c的代码, 其中没有mysql_next_result的相关代码,在php_mysqli.c的 代码中有相关的内容,下面附上 问题解决后的测试代码,以便各位同仁, 今后可以参考, 谢谢大家。


<?php
$db1=@mysqli_connect( 'localhost','root','XXXX');
if( FALSE===$db1 ) {
$str_msg = 'Counld not connect to Mysql:'.mysqli_connect_errno($db1);
die( $str_msg );
}
if( FALSE===mysqli_select_db($db1,'saibaidu') ) {
$str_msg = 'Counld not Select the database:'.mysqli_error($db1);
die( $str_msg );
}

$query = 'call domain_need_ip()';
$result=mysqli_query($db1,$query);
if( FALSE===$result ) echo 'bad!!!'.PHP_EOL;
else {
echo 'ok!'.PHP_EOL;
while ($row = mysqli_fetch_row($result)) {
echo $row[0].PHP_EOL;
}
mysqli_free_result($result);
while(($res=mysqli_next_result($db1))!=NULL) {
}
}

$query = 'call domain_need_ip()';
$result=mysqli_query($db1,$query);
if( FALSE===$result ) echo 'bad!!!'.PHP_EOL;
else {
echo 'ok!'.PHP_EOL;
while ($row = mysqli_fetch_row($result)) {
echo $row[0].PHP_EOL;
}
mysqli_free_result($result);
while(($res=mysqli_next_result($db1))!=NULL) {
}
}
?>

执行结果:

D:\apache\gbk>d:\php\php.exe mytest2.php
ok!
www.baidu.com
ok!
www.baidu.com
foolbirdflyfirst 2011-10-24
  • 打赏
  • 举报
回复
版本是php5+吧?是就用mysqli或者pdo.
狄默默斯基 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wlmqgzm 的回复:]

引用 6 楼 xjl756425616 的回复:
鸭梨表示很大


我的这个问题应该超出了你的理解能力和应用水平,我提出的问题不是一般水平的人能够解决的,呵呵。
[/Quote]

擦,居然藐视我,那我不说了
ohmygirl 2011-10-24
  • 打赏
  • 举报
回复
测试了一下,好像确实无法用这种方法执行两次以上的procedure调用。
网上搜索了一下。
http://www.jb51.net/article/27085.htm
大致是说:
对于一个存储过程,在数据没有取空之前,是无法接受新的请求的。
解决方法是用循环的方法,把一次存储过程的结果取完,然后就可以执行下次存储过程调用了。

你可以测试下:

<?php
define('CLIENT_MULTI_RESULTS', 131072);

$db1=@mysql_connect( 'localhost','root','',1,CLIENT_MULTI_RESULTS) OR die('Counld not

connect to Mysql:'.mysql_error());
@mysql_select_db('mydb',$db1) OR die('Counld not Select the database:'.mysql_error());

$query = 'call domain_need_ip()';
$result = mysql_query($query,$db1);
while($res = mysql_fetch_array($result)){
do something;
}
mysql_free_result($res);
$query = 'call domain_need_ip()';
$result=mysql_query($query,$db1);
while($res = mysql_fetch_array($result)){
do another thing;
}
?>
数据城郭 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xjl756425616 的回复:]
鸭梨表示很大
[/Quote]

我的这个问题应该超出了你的理解能力和应用水平,我提出的问题不是一般水平的人能够解决的,呵呵。
数据城郭 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xjl756425616 的回复:]

CREATE PROCEDURE domain_need_ip( )
BEGIN
SELECT domain_name FROM domain1 WHERE flag1<100 ORDER BY flag1 LIMIT 1;
END;
你这种存储过程有啥用啊,,在php下根本取不到数据的
[/Quote]

怎么取不到数据,自己试验就知道了,给你代码和测试结果,

echo 'ok!'.PHP_EOL; 后增加语句
$row=mysql_fetch_array($result);
if( FALSE===$row ) return 0;
echo $row[0].PHP_EOL;
执行结果如下:
D:\apache\gbk>d:\php\php.exe mytest1.php
ok!
www.baidu.com
bad!!!

狄默默斯基 2011-10-24
  • 打赏
  • 举报
回复
CREATE PROCEDURE domain_need_ip( )
BEGIN
SELECT domain_name FROM domain1 WHERE flag1<100 ORDER BY flag1 LIMIT 1;
END;
你这种存储过程有啥用啊,,在php下根本取不到数据的
狄默默斯基 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wlmqgzm 的回复:]

引用 4 楼 xjl756425616 的回复:
搞笑了,你的存储过程又没返回值,瞎做


你应该没有做过项目的优化吧,很多数据库项目到最后开始优化性能的时候,会把很多mysql的语句转换为procedure, 以便提高性能, 得到更快的速度, 开发的初级阶段经常是不用function和procedure的,高阶应用会尽量使用procedure, 例如: 各银行的内部程序基本全部是pro……
[/Quote]

鸭梨表示很大
数据城郭 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xjl756425616 的回复:]
搞笑了,你的存储过程又没返回值,瞎做
[/Quote]

你应该没有做过项目的优化吧,很多数据库项目到最后开始优化性能的时候,会把很多mysql的语句转换为procedure, 以便提高性能, 得到更快的速度, 开发的初级阶段经常是不用function和procedure的,高阶应用会尽量使用procedure, 例如: 各银行的内部程序基本全部是procedure, 数据库不深入到一定程度, 是不会理解这些用法的。
狄默默斯基 2011-10-24
  • 打赏
  • 举报
回复
搞笑了,你的存储过程又没返回值,瞎做
数据城郭 2011-10-24
  • 打赏
  • 举报
回复
这个是执行结果

D:\apache\gbk>d:\php\php.exe mytest1.php
ok!
bad!!!

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧