首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 「expects parameter 1 to be resource, array given」錯誤成因與解決方案

     編輯:PHP 綜合知識

錯誤典型場景

<?php
function fetch_array($query, $result_type = MYSQL_ASSOC) {
    return mysql_fetch_array($query, $result_type); // 報錯行
}

// 錯誤呼叫
$result = mysql_query("SELECT * FROM users WHERE id = 999"); // 查無資料回傳 false
fetch_array($result); // 傳入 false 而非 resource

錯誤訊息:Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given

根本原因

  • mysql_query() 失敗(SQL 錯誤、查無資料、連線中斷)時回傳 false (boolean)
  • 未檢查回傳值直接傳給 mysql_fetch_array()
  • mysql_fetch_array() 要求第一參數為 resource 型別

三種解決方案

方案一:錯誤抑制符 @(不推薦生產環境)

function fetch_array($query, $result_type = MYSQL_ASSOC) {
    return @mysql_fetch_array($query, $result_type);
}
// 呼叫端仍需檢查回傳值是否為 false

方案二:嚴格檢查資源型別(推薦)

function fetch_array($query, $result_type = MYSQL_ASSOC) {
    if (!is_resource($query)) {
        trigger_error('mysql_query 回傳非 resource,可能 SQL 失敗', E_USER_WARNING);
        return false;
    }
    return mysql_fetch_array($query, $result_type);
}

方案三:完整錯誤處理流程(最佳實務)

<?php
// 1. 執行查詢並檢查
$result = mysql_query($sql);
if (!$result) {
    // 記錄錯誤:SQL、錯誤碼、錯誤訊息
    error_log("SQL Error: " . mysql_error() . " | SQL: $sql");
    // 回傳空陣列或拋出例外
    return [];
}

// 2. 正常處理資料
$data = [];
while ($row = mysql_fetch_assoc($result)) {
    $data[] = $row;
}
mysql_free_result($result);
return $data;

現代化建議:棄用 mysql_* 改用 PDO/MySQLi

<?php
// PDO 範例(推薦)
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $stmt = $pdo->query("SELECT * FROM users WHERE id = 999");
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    // 查無資料回傳空陣列,不會報錯
} catch (PDOException $e) {
    error_log("DB Error: " . $e->getMessage());
    $rows = [];
}

快速檢查清單

  • [ ] SQL 語法正確?(在 phpMyAdmin/Workbench 先跑一次)
  • [ ] 資料表/欄位名稱拼寫正確?
  • [ ] 連線狀態正常?
  • [ ] mysql_query() 回傳值有檢查?
  • [ ] 是否已升級至 PHP 7+ 並改用 PDO/MySQLi?
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved