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?  有无解决帮办法?

解决方案 »

  1.   

    需要把创建存储过程的语句在php中执行
    mysql_query(.....);
      

  2.   

    存储过程已经在mysql中 了 , 并且第1次这个函数执行返回已经成功了,第2次调用就失败了。
      

  3.   

    这个是执行结果 D:\apache\gbk>d:\php\php.exe mytest1.php
    ok!
    bad!!!
      

  4.   


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

  5.   

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

  6.   


     怎么取不到数据,自己试验就知道了,给你代码和测试结果,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!!!
      

  7.   

    测试了一下,好像确实无法用这种方法执行两次以上的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;
      }
    ?>
      

  8.   

    版本是php5+吧?是就用mysqli或者pdo.
      

  9.   

    问题已经确认, 并且得到了解决, 感谢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