萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

PHP 調用 MySQL 5 存儲過程完整指南:IN/OUT 參數、預處理、mysqli 實戰範例

前置條件

  • MySQL 5.0+(首個支持存儲過程的版本)。
  • PHP mysqli / PDO 擴展。

核心概念:MySQL 用戶變量(@var)

存儲過程參數交互需通過會話級用戶變量:

  • 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();

完整實戰範例(mysqli 面向對象)

<?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 時的注入風險。
  • 存儲過程內部邏輯複雜時,考慮將業務邏輯下沉至應用層,減少數據庫 CPU 壓力。
  • 生產環境監控 SHOW PROCESSLIST,防止長時間運行的存儲過程阻塞連接。
copyright © 萬盛學電腦網 all rights reserved