先前轉載的《PHP 呼叫 MySQL 預存程序》文章經測試發現方法不可行。呼叫包含 SELECT 語句的預存程序時會出現錯誤:PROCEDURE p can't return a result set in the given context。
經 Google 搜尋與查閱 MySQL 官方文件,發現 db_mysql 模組不支援預存程序呼叫,解決方案是改用 db_mysqli(MySQL Improved Extension)。實測後確認可正常運作。
<?php
/* 連線 MySQL 伺服器 */
$link = mysqli_connect(
'localhost', // 主機
'root', // 使用者
'root', // 密碼
'db_name' // 預設資料庫
);
if (!$link) {
printf("Can't connect to MySQL Server. Errorcode: %s\n", mysqli_connect_error());
exit;
}
/* 呼叫預存程序 */
if ($result = mysqli_query($link, "call se_proc('crm')")) {
/* 取得結果集 */
while ($row = mysqli_fetch_array($result)) {
echo $row[0] . "--------- SR. " . $row[1] . "\n";
}
/* 釋放結果集記憶體 */
mysqli_free_result($result);
}
/* 關閉連線 */
mysqli_close($link);
?>
雖然成功解決呼叫問題,但實測發現預存程序的執行效率反而不如原本直接在 PHP 中撰寫 SQL 查詢,這點頗令人意外。