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? 有无解决帮办法?
已经确认不是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? 有无解决帮办法?
mysql_query(.....);
ok!
bad!!!
你应该没有做过项目的优化吧,很多数据库项目到最后开始优化性能的时候,会把很多mysql的语句转换为procedure, 以便提高性能, 得到更快的速度, 开发的初级阶段经常是不用function和procedure的,高阶应用会尽量使用procedure, 例如: 各银行的内部程序基本全部是procedure, 数据库不深入到一定程度, 是不会理解这些用法的。
BEGIN
SELECT domain_name FROM domain1 WHERE flag1<100 ORDER BY flag1 LIMIT 1;
END;
你这种存储过程有啥用啊,,在php下根本取不到数据的
怎么取不到数据,自己试验就知道了,给你代码和测试结果,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!!!
网上搜索了一下。
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;
}
?>
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