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高级应用的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did30464