程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 詳解php調用MySQL存儲過程方法

詳解php調用MySQL存儲過程方法

編輯:關於PHP編程

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;
";
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的存儲過程

實例十:存儲過程中的游標

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved