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

PHP 「mysql_fetch_array() expects parameter 1 to be resource」錯誤排查與規範寫法

     編輯:PHP 綜合知識

錯誤訊息

Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in ...

原因

mysql_query() 失敗回傳 false(boolean),直接傳給 mysql_fetch_array() 導致型別錯誤。常見原因:SQL 語法錯誤、資料表不存在、欄位名錯誤、連線失敗。

錯誤示範

$sql = "select * from news where `id`='".$_GET['id']."'";
$query = mysql_query($sql);
$rs = mysql_fetch_array($query); // 若 $query 為 false 即報錯

正確寫法:必須檢查查詢結果

$sql = "select * from news where `id`='".intval($_GET['id'])."'"; // 簡單防注入
$query = mysql_query($sql);
if (!$query) {
    die('SQL Error: '.mysql_error().' | SQL: '.$sql); // 開發環境顯示,生產記錄日誌
}
if (mysql_num_rows($query) > 0) {
    $rs = mysql_fetch_array($query);
    // 處理資料
} else {
    echo '無資料';
}

更佳寫法:統一錯誤處理函式

function query($sql) {
    $res = mysql_query($sql);
    if (!$res) {
        error_log('[MySQL Error] '.mysql_error().' | SQL: '.$sql);
        return false;
    }
    return $res;
}

$query = query("select * from news where id=".intval($_GET['id']));
if ($query && mysql_num_rows($query)) {
    $row = mysql_fetch_assoc($query);
}

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

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$stmt = $pdo->prepare('SELECT * FROM news WHERE id = ?');
$stmt->execute([$_GET['id']]);
$row = $stmt->fetch(); // false 或陣列,無需檢查 resource
  • Prepared Statements 徹底防注入。
  • 例外模式自動拋錯,無需手動檢查每個查詢回傳值。
  • mysql_* 自 PHP 7.0 移除,舊專案務必規劃遷移。

快速除錯清單

  1. 輸出完整 SQL 執行於 phpMyAdmin/MySQL Workbench 驗證。
  2. 檢查資料庫連線是否成功(mysql_connect 回傳值)。
  3. 確認資料表/欄位名稱拼寫(反引號包裹)。
  4. 檢查 mysql_error() 具體錯誤碼(如 1064 語法、1146 表不存在)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved