深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 863|回复: 5
打印 上一主题 下一主题

php调用mysql存储过程,及Commands out of sync报错的实验分析(mysqli)

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2020-6-7 00:06:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhgc 于 2021-3-21 14:28 编辑

php调用mysql存储过程,及Commands out of sync报错的实验分析


存储过程:
  1. DELIMITER $

  2. DROP PROCEDURE IF EXISTS `sfc`.`TEST2`$

  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `TEST2`(
  4. )
  5. BEGIN
  6. declare l_count int;
  7. -- 1. just update
  8. update sfc.r107 set in_station_time=now() limit 12;

  9. -- 2. return record;
  10. select serial_number,model_name from sfc.r107 limit 3;


  11. END$

  12. DELIMITER ;
复制代码


PHP代码:

  1. <?php
  2. $con=mysqli_connect("127.0.0.1","root","****","sfc");
  3. if (mysqli_connect_errno($con))
  4. {
  5.     echo "连接 MySQL 失败: " . mysqli_connect_error();
  6. }

  7. $sql = "call sfc.TEST2();";
  8. echo "以下为主数据:\r\n";
  9. if($result = mysqli_query($con,$sql)){
  10.         if($result!==true){
  11.                 while($row=mysqli_fetch_row($result)){
  12.                         printf("%s \r\n",$row[0]);
  13.                 }
  14.                 mysqli_free_result($result);
  15.         }
  16. }


  17. $i=1;
  18. echo "以下为附加数据:\r\n";
  19. while(mysqli_more_results($con)) {
  20.         printf("--------- {$i} -----------\r\n");
  21.         if(mysqli_next_result($con)){
  22.                 if ($result = mysqli_store_result($con)) {
  23.                         while ($row = mysqli_fetch_row($result)) {
  24.                 printf("%s \r\n",$row[0]);
  25.                         }
  26.             mysqli_free_result($result);
  27.         } else         {
  28.                         echo "no record!\r\n";
  29.                 }
  30.         }
  31.         $i++;
  32. }

  33. mysqli_close($con);
  34. ?>
复制代码
回复

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
沙发
 楼主| 发表于 2020-6-7 00:08:41 | 只看该作者
当SP为:
update sfc.r107 set in_station_time=now() limit 12;

结果是:
  1. C:\Apache24\htdocs\test>php t2.php
  2. 以下为主数据
  3. 以下为附加数据
复制代码



当SP为:
update sfc.r107 set in_station_time=now() limit 12;
select serial_number,model_name from sfc.r107 limit 3;\

结果是:
  1. C:\Apache24\htdocs\test>php t2.php
  2. 以下为主数据:
  3. 19040171000001
  4. 19040171000002
  5. 19040171000003
  6. 以下为附加数据:
  7. --------- 1 -----------
  8. no record!
复制代码



当SP为:
update sfc.r107 set in_station_time=now() limit 12;
select serial_number,model_name from sfc.r107 limit 3;\
select serial_number from sfc.r109 limit 2;

结果是:
  1. C:\Apache24\htdocs\test>php t2.php
  2. 以下为主数据:
  3. 19040171000001
  4. 19040171000002
  5. 19040171000003
  6. 以下为附加数据:
  7. --------- 1 -----------
  8. X000041
  9. PF1642000VK
  10. --------- 2 -----------
  11. no record!
复制代码
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
板凳
 楼主| 发表于 2020-6-7 00:10:42 | 只看该作者
所以结论是:

如果SP没有返回值 ,那没有问题
但一但有record ,那结果集是N+1 。多出来的是什么内容不清楚,读内容是空的,但如果不读,就会Commands out of sync
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
地板
 楼主| 发表于 2020-6-7 00:14:46 | 只看该作者
所以,建议调SP的处理方式 :


读主recrod:
  1. if($result = mysqli_query($con,$sql)){
  2.         if($result!==true){
  3.                 while($row=mysqli_fetch_row($result)){
  4.                         printf("%s \r\n",$row[0]);
  5.                 }
  6.                 mysqli_free_result($result);
  7.         }
  8. }
复制代码




清多余数据:
  1. while(mysqli_more_results($con)) {
  2.         if(mysqli_next_result($con)){
  3.                 if ($result = mysqli_store_result($con)) {
  4.                         mysqli_free_result($result);
  5.                 }
  6.         }
  7. }
复制代码


回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
5#
 楼主| 发表于 2020-6-7 00:31:21 | 只看该作者
完整代码 :


<?php
error_reporting(E_ALL);

$con=mysqli_connect("127.0.0.1","root","****","sfc");
if (!$con)
{
    die( "连接 MySQL 失败: " . mysqli_connect_error());
}

$sql = "call sfc.TEST2();";
echo "以下为主数据:\r\n";
if($result = mysqli_query($con,$sql)){
        if($result!==true){
                while($row=mysqli_fetch_row($result)){
                        printf("%s \r\n",$row[0]);
                }
                mysqli_free_result($result);
        }
}


while(mysqli_more_results($con)) {
        if(mysqli_next_result($con)){
                if ($result = mysqli_store_result($con)) {
                        mysqli_free_result($result);
                }
        }
}

               
$sql = "select version();";
if($result = mysqli_query($con,$sql)){
        if($result!==true){
                while($row=mysqli_fetch_row($result)){
                        printf("%s \r\n",$row[0]);
                }
                mysqli_free_result($result);
        }
}else{
        echo mysqli_error($con);
}

mysqli_close($con);
?>


回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
6#
 楼主| 发表于 2023-10-26 15:47:46 | 只看该作者
$strsql="CALL smt.APP_SMT_SCAN('{$trsn}','{$emp}','{$machine}','{$action}','{$device}');";
                $info=$info."<p style=\"margin-top:0px;margin-bottom:0px;\"><b>执行操作:</b>{$strsql}</p>";
                $this->app->AjaxAttr("info",$info);
               
                $this->app->prepare_mes();
                $recordSet=$this->app->mes->execute($strsql);
                if(isset($recordSet->fields)){
                        if($recordSet->EOF){
                                $msg= "SQL没有返回数据";
                        }else{
                                $msg= "SQL没有RES返回参数";
                                $rs=$recordSet->fields;
                                if (array_key_exists('prompt', $rs)){
          $prompt=$this->app->LL($rs["prompt"]);
                                }
                                if (array_key_exists('machine', $rs)){
          $machine=$rs["machine"];
                                }
                                if (array_key_exists('res', $rs)){
          $msg=$rs["res"];
                                }
                        }
                }else{
                        $msg="数据库连接失败!".strToUtf8($this->app->mes->ErrorMsg());
                };


                $this->app->AjaxAttr("prompt",$prompt);
                $this->app->AjaxAttr("machine",$machine);
                if(substr($msg,0,2)=="OK"){
                        $this->app->AjaxAttr("sound","0");
                        $this->app->AjaxOK(array(),$msg);
                }else{
                        $this->app->AjaxAttr("sound","1");
                        $this->app->AjaxFail("{$msg}", 100);
                        return ;
                }
               
                if(strlen($trsn)<5){
                        return;
                }
                 while($recordSet->nextRecordSet()){};
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 00:32 , Processed in 0.039110 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表