好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php调用MySQL存储过程方法 - php高级应用

php调用MySQL存储过程方法

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 ; //开源代码phpfensi测试数据   ";  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的存储过程

查看更多关于php调用MySQL存储过程方法 - php高级应用的详细内容...

  阅读:56次