MySQL 預存程序能將複雜的商業邏輯封裝在資料庫層,PHP 透過不同方式呼叫可應對各種參數與回傳需求。本文整理四種實用呼叫模式。
使用用戶變數 @Return 接收輸出值:
$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;
直接遍歷查詢結果:
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;
}
舊版 mysql 擴充套件不支援多結果集,必須改用 mysqli:
$rows = array();
$db = new mysqli($server, $user, $psd, $dbname);
if (mysqli_connect_errno()) {
die('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);