当前位置:首页 > PHP教程 > php高级应用 > 列表

php调用MySQL存储过程方法

发布:smiling 来源: PHP粉丝网  添加日期:2014-09-10 14:45:05 浏览: 评论: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()等函数获得结果.

下面我总结了一些调用存储过程的实例无参的存储过程,代码如下:

  1. $conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!"); 
  2. mysql_select_db('test',$conn); 
  3. $sql = " 
  4. create procedure myproce() 
  5. begin 
  6. INSERT INTO user (id, username, sex) VALUES (NULL, 's', '0'); 
  7. end;//开源代码phpfensi.com 
  8. "; 
  9. mysql_query($sql);//创建一个myproce的存储过程 
  10.  
  11. $sql = "call test.myproce();"; 
  12. mysql_query($sql);//调用myproce的存储过程,则数据库中将增加一条新记录 

类型一:调用带输入、输出类型参数的方法,代码如下:

  1. $returnValue = ''; 
  2. try { 
  3.  mysql_query ( "set @Return" ); 
  4.  $spname = 'P__Test_GetInfo1'; 
  5.  mysql_query ( "call $spname(@Return, '{$userId}', '{$pwd}')" ) or die ( "[$spname]Query failed:" . mysql_error () ); 
  6.  $result_return = mysql_query ( "select @Return" ); 
  7.  $row_return = mysql_fetch_row ( $result_return ); 
  8.  $returnValue = $row_return [0]; 
  9. } catch ( Exception $e ) { 
  10.  echo $e; 
  11. } 
  12. echo $returnValue; //输出来自存储过程中输出的变量 

类型二:调用带多个输出类型和多个输入类型参数的方法,代码如下:

  1. $userId = 0; 
  2. try{ 
  3.     mysql_query("set @Message"); 
  4.     mysql_query("set @Id"); 
  5.     mysql_query("call P__Test_Login(@Message, @Id, '{$userId}', '{$pwd}')", $conn) or die("Query failed:".mysql_error()); 
  6.     $result_mess = mysql_query("select @Message"); 
  7.     $result_uid = mysql_query("select @Id"); 
  8.     $row_mess = mysql_fetch_row($result_mess); 
  9.     $row_uid = mysql_fetch_row($result_uid); 
  10.     $Proc_Error = $row_mess[0]; 
  11.     $uId = $row_uid[0]; 
  12. } 
  13. catch( Exception $e ) 
  14. { 
  15.    echo $e; 
  16. } 
  17. echo 'proc return message:'$Proc_Error.'<br/>'; //输出来自存储过程中输出的变量 
  18. echo 'User id:'.$uId; //获取用户id 

类型三:调用带返回结果集的方法,代码如下:

  1. try { 
  2.  $spname = 'P__Test_GetData'; 
  3.  $query = mysql_query ( "call $spname()", $conn ) or die ( "[$spname]Query failed:".mysql_error() ); 
  4.  while ( $row = mysql_fetch_array ( $query ) ) { 
  5.   echo $row ['ProvinceID'].'::'.$row ['ProvinceName']; //输出数据集 
  6.  } 
  7.  
  8. } catch ( Exception $e ) { 
  9.  echo $e; 
  10. } 

类型四:调用带返回多个结果集的方法(目前只能通过mysqli来实现~~),代码如下:

  1. //PHP 
  2. $rows = array ();   
  3. $db = new mysqli($server,$user,$psd,$dbname);   
  4. if (mysqli_connect_errno()){   
  5.     $this->message('Can not connect to MySQL server');   
  6. }   
  7. $db->query("SET NAMES UTF8");   
  8. $db->query("SET @Message"); 
  9. if($db->real_query("call P__Test_GetData2(@Message)")){   
  10.     do{   
  11.         if($result = $db->store_result()){   
  12.             while ($row = $result->fetch_assoc()){   
  13.                 array_push($rows, $row);   
  14.             }   
  15.             $result->close();   
  16.         }   
  17.     }while($db->next_result());   
  18. }   
  19. $db->close();  
  20. print_r($rows); 
  21. //Procedure  
  22. …… 
  23. select * from T1 where …… 
  24. select * from T2 where …… 
  25. …… 

实例四:传出参数的inout存储过程,代码如下:

  1. $sql = " 
  2. create procedure myproce4(inout sexflag int) 
  3. begin 
  4. SELECT * FROM user WHERE sex = sexflag; 
  5. end;  
  6. "; 
  7. mysql_query($sql);//创建一个myproce4的存储过程 
  8. $sql = "set @sexflag = 1"; 
  9. mysql_query($sql);//设置性别参数为1 
  10. $sql = "call test.myproce4(@sexflag);"; 
  11. mysql_query($sql);//调用myproce4的存储过程,在cmd下面看效果  

实例五:使用变量的存储过程,代码如下:

  1. $sql = " 
  2. create procedure myproce5(in a int,in b int) 
  3. begin 
  4. declare s int default 0; 
  5. set s=a+b; 
  6. select s; 
  7. end;  
  8. "; 
  9. mysql_query($sql);//创建一个myproce5的存储过程 
  10. $sql = "call test.myproce5(4,6);"; 
  11. mysql_query($sql);//  

调用myproce5的存储过程,在cmd下面看效果

实例六:case语法,代码如下:

  1. $sql = " 
  2. create procedure myproce6(in score int) 
  3. begin 
  4. case score 
  5. when 60 then select '及格'; 
  6. when 80 then select '及良好'; 
  7. when 100 then select '优秀'; 
  8. else select '未知分数'; 
  9. end case; 
  10. end;  
  11. "; 
  12. mysql_query($sql);//创建一个myproce6的存储过程 
  13. $sql = "call test.myproce6(100);"; 
  14. mysql_query($sql);//  

调用myproce6的存储过程,在cmd下面看效果

实例七:循环语句,代码如下:

  1. $sql = " 
  2. create procedure myproce7() 
  3. begin 
  4. declare i int default 0; 
  5. declare j int default 0; 
  6. while i<10 do 
  7. set j=j+i; 
  8. set i=i+1; 
  9. end while; 
  10. select j; 
  11. end;  
  12. "; 
  13. mysql_query($sql);//创建一个myproce7的存储过程 
  14. $sql = "call test.myproce7();"; 
  15. mysql_query($sql);// 

调用myproce7的存储过程,在cmd下面看效果

实例八,repeat语句,代码如下:

  1. $sql = "  
  2. create procedure myproce8() 
  3. begin 
  4. declare i int default 0; 
  5. declare j int default 0; 
  6. repeat 
  7. set j=j+i; 
  8. set i=i+1; 
  9. until j>=10 
  10. end repeat; 
  11. select j; 
  12. end;  
  13. "; 
  14. mysql_query($sql);//创建一个myproce8的存储过程 
  15. $sql = "call test.myproce8();"; 
  16. mysql_query($sql);//  

调用myproce8的存储过程,在cmd下面看效果

实例九,loop语句,代码如下:

  1. $sql = " 
  2. create procedure myproce9() 
  3. begin 
  4. declare i int default 0; 
  5. declare s int default 0; 
  6.  
  7. loop_label:loop 
  8. set s=s+i; 
  9. set i=i+1; 
  10. if i>=5 then 
  11. leave loop_label; 
  12. end if; 
  13. end loop; 
  14. select s; 
  15. end;  
  16. "; 
  17. mysql_query($sql);//创建一个myproce9的存储过程 
  18. $sql = "call test.myproce9();"; 
  19. mysql_query($sql);// 

调用myproce9的存储过程,在cmd下面看效果

实例十,删除存储过程,代码如下:

mysql_query("drop procedure if exists myproce");//删除test的存储过程

Tags: php调用MySQL MySQL存储过程

分享到: