存儲過程參數交互需通過會話級用戶變量:
IN/INOUT:PHP 變量 → SET @mysql_var = $php_var → 傳入過程。OUT:聲明 SET @out_var = 0 → 過程寫入 → SELECT @out_var 取回 PHP。$mysqli = new mysqli('localhost','root','pass','db');
if ($mysqli->connect_errno) die($mysqli->connect_error);
// 1. IN 參數綁定到用戶變量
$inVal = 'input_value';
$mysqli->query("SET @in_param = '$inVal'"); // 注意轉義或用參數化
// 2. OUT 參數預聲明
$mysqli->query("SET @out_param = 0");
// 3. 調用存儲過程
$mysqli->query("CALL my_proc(@in_param, @out_param)");
// 4. 獲取 OUT 結果
$res = $mysqli->query("SELECT @out_param");
$row = $res->fetch_row();
$outValue = $row[0];
echo "OUT 參數值: $outValue";
$mysqli->close();
<?php
$host='localhost'; $user='root'; $pwd='11212'; $db='samp_db';
$mysqli = new mysqli($host,$user,$pwd,$db);
if ($mysqli->connect_errno) die("Connect failed: ".$mysqli->connect_error);
// 假設存儲過程 aa(INOUT a VARCHAR(20))
$password = '11212';
$mysqli->query("SET @a = '$password'");
$mysqli->query("CALL aa(@a)");
$res = $mysqli->query("SELECT @a");
$row = $res->fetch_row();
echo $row[0]; // 輸出過程修改後的值
$res->free(); $mysqli->close();
函數有返回值,直接 SELECT func():
$res = $mysqli->query("SELECT my_func('param')");
$row = $res->fetch_row();
echo $row[0];
存儲過程可能返回多個結果集:
if ($mysqli->multi_query("CALL multi_result_proc()")) {
do {
if ($res = $mysqli->store_result()) {
while ($row = $res->fetch_assoc()) { print_r($row); }
$res->free();
}
} while ($mysqli->next_result());
}
mysqli 或 PDO 預處理,避免手動拼接 SET @var 時的注入風險。SHOW PROCESSLIST,防止長時間運行的存儲過程阻塞連接。