加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

php调用MySQL存储过程办法

发布时间:2022-02-17 18:45:18 所属栏目:编程 来源:互联网
导读:php与mysql是天生的一对,下面我来介绍在php中怎么调用mysql存储过程并执行返回结果,下面我总结了一些常用的php调用MySQL存储过程的方法,有需要了解的同学可参考. MySQL从5.0开始才引入存储过程,反正以前做应用的时候从没碰过,不过现在因为主要作内部系统,所
  php与mysql是天生的一对,下面我来介绍在php中怎么调用mysql存储过程并执行返回结果,下面我总结了一些常用的php调用MySQL存储过程的方法,有需要了解的同学可参考.
 
  MySQL从5.0开始才引入存储过程,反正以前做应用的时候从没碰过,不过现在因为主要作内部系统,所以很多应用都用到了存储过程,当然前台有时候也需要调用MySQL存储过程,PHP的MySQL Lib好像支持的不是很好,不过我搜索了些资料,虽然不多,但是还是尝试的使用了,现在介绍一下方法.
 
  1,调用存储过程的方法.
 
  a。如果存储过程有 IN/INOUT参数,声明一个变量,输入参数给存储过程,该变量是一对,一个php变量(也可以不必,只是没有php变量时,没有办法进行动态输入),一个Mysql变量。
 
  b。如果存储过程有OUT变量,声明一个Mysql变量。mysql变量的声明比较特殊,必须让mysql服务器知道此变量的存在,其实也就是执行一条mysql语句。入set @mysqlvar=$phpvar ;
 
  c。使用mysql_query()/mysql_db_query()执行mysql 变量声明语句。
 
  代码如下:mysql_query("set @mysqlvar【=$pbpvar】");
 
  这样,在mysql服务器里面就有一个变量,@mysqlar,如果时IN参数,那么其值可以有phpar传入.
 
  d。如果时存储过程。
 
  1。执行 call procedure()语句.
 
  也就是mysql_query("call proceduer([var1]...)");
 
  2. 如果有返回值,执行select @ar,返回执行结果,代码如下:
 
  mysql_query("select @var)"
 
  接下来的操作就和php执行一般的mysql语句一样了,可以通过mydql_fetch_row()等函数获得结果.
 
  下面我总结了一些调用存储过程的实例无参的存储过程,代码如下:
 
  $conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!");
  mysql_select_db('test',$conn);
  $sql = "
  create procedure myproce()
  begin
  INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0');
  end;//开源代码Cuoxin.com
  ";
  mysql_query($sql);//创建一个myproce的存储过程
  
  $sql = "call test.myproce();";
  mysql_query($sql);//调用myproce的存储过程,则数据库中将增加一条新记录
  类型一:调用带输入、输出类型参数的方法,代码如下:
 
  $returnValue = '';
  try {
   mysql_query ( "set @Return" );
   $spname = 'P__Test_GetInfo1';
   mysql_query ( "call $spname(@Return, '{$userId}', '{$pwd}')" ) or die ( "[$spname]Query failed:" . mysql_error () );
   $result_return = mysql_query ( "select @Return" );
   $row_return = mysql_fetch_row ( $result_return );
   $returnValue = $row_return [0];
  } catch ( Exception $e ) {
   echo $e;
  }
  echo $returnValue; //输出来自存储过程中输出的变量
  类型二:调用带多个输出类型和多个输入类型参数的方法,代码如下:
 
  $userId = 0;
  try{
      mysql_query("set @Message");
      mysql_query("set @Id");
      mysql_query("call P__Test_Login(@Message, @Id, '{$userId}', '{$pwd}')", $conn) or die("Query failed:".mysql_error());
      $result_mess = mysql_query("select @Message");
      $result_uid = mysql_query("select @Id");
      $row_mess = mysql_fetch_row($result_mess);
      $row_uid = mysql_fetch_row($result_uid);
      $Proc_Error = $row_mess[0];
      $uId = $row_uid[0];
  }
  catch( Exception $e )
  {
     echo $e;
  }
  echo 'proc return message:'$Proc_Error.'<br/>'; //输出来自存储过程中输出的变量
  echo 'User id:'.$uId; //获取用户id
  类型三:调用带返回结果集的方法,代码如下:
 
  try {
   $spname = 'P__Test_GetData';
   $query = mysql_query ( "call $spname()", $conn ) or die ( "[$spname]Query failed:".mysql_error() );
   while ( $row = mysql_fetch_array ( $query ) ) {
    echo $row ['ProvinceID'].'::'.$row ['ProvinceName']; //输出数据集
   }
  
  } catch ( Exception $e ) {
   echo $e;
  }
  类型四:调用带返回多个结果集的方法(目前只能通过mysqli来实现~~),代码如下:
 
  //PHP
  $rows = array ();   
  $db = new mysqli($server,$user,$psd,$dbname);   
  if (mysqli_connect_errno()){   
      $this->message('Can not connect to MySQL server');   
  }   
  $db->query("SET NAMES UTF8");   
  $db->query("SET @Message");
  if($db->real_query("call P__Test_GetData2(@Message)")){   
      do{   
          if($result = $db->store_result()){   
              while ($row = $result->fetch_assoc()){   
                  array_push($rows, $row);   
              }   
              $result->close();   
          }   
      }while($db->next_result());   
  }   
  $db->close();  
  print_r($rows);
  //Procedure  
  ……
  select * from T1 where ……
  select * from T2 where ……
  ……
  实例四:传出参数的inout存储过程,代码如下:
 
  $sql = "
  create procedure myproce4(inout sexflag int)
  begin
  SELECT * FROM user WHERE sex = sexflag;
  end;  
  ";
  mysql_query($sql);//创建一个myproce4的存储过程
  $sql = "set @sexflag = 1";
  mysql_query($sql);//设置性别参数为1
  $sql = "call test.myproce4(@sexflag);";
  mysql_query($sql);//调用myproce4的存储过程,在cmd下面看效果  
  实例五:使用变量的存储过程,代码如下:
 
  $sql = "
  create procedure myproce5(in a int,in b int)
  begin
  declare s int default 0;
  set s=a+b;
  select s;
  end;  
  ";
  mysql_query($sql);//创建一个myproce5的存储过程
  $sql = "call test.myproce5(4,6);";
  mysql_query($sql);//  
  调用myproce5的存储过程,在cmd下面看效果
 
  实例六:case语法,代码如下:
 
  $sql = "
  create procedure myproce6(in score int)
  begin
  case score
  when 60 then select '及格';
  when 80 then select '及良好';
  when 100 then select '优秀';
  else select '未知分数';
  end case;
  end;  
  ";
  mysql_query($sql);//创建一个myproce6的存储过程
  $sql = "call test.myproce6(100);";
  mysql_query($sql);//  
  调用myproce6的存储过程,在cmd下面看效果
 
  实例七:循环语句,代码如下:
 
  $sql = "
  create procedure myproce7()
  begin
  declare i int default 0;
  declare j int default 0;
  while i<10 do
  set j=j+i;
  set i=i+1;
  end while;
  select j;
  end;  
  ";
  mysql_query($sql);//创建一个myproce7的存储过程
  $sql = "call test.myproce7();";
  mysql_query($sql);//
  调用myproce7的存储过程,在cmd下面看效果
 
  实例八,repeat语句,代码如下:
 
  $sql = "  
  create procedure myproce8()
  begin
  declare i int default 0;
  declare j int default 0;
  repeat
  set j=j+i;
  set i=i+1;
  until j>=10
  end repeat;
  select j;
  end;  
  ";
  mysql_query($sql);//创建一个myproce8的存储过程
  $sql = "call test.myproce8();";
  mysql_query($sql);//  
  调用myproce8的存储过程,在cmd下面看效果
 
  实例九,loop语句,代码如下:
 
  $sql = "
  create procedure myproce9()
  begin
  declare i int default 0;
  declare s int default 0;
  
  loop_label:loop
  set s=s+i;
  set i=i+1;
  if i>=5 then
  leave loop_label;
  end if;
  end loop;
  select s;
  end;  
  ";
  mysql_query($sql);//创建一个myproce9的存储过程
  $sql = "call test.myproce9();";
  mysql_query($sql);//
  调用myproce9的存储过程,在cmd下面看效果
 
  实例十,删除存储过程,代码如下:
 
  mysql_query("drop procedure if exists myproce");//删除test的存储过程。

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读