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

PHP 連接 MySQL 報錯 "Call to undefined function mysql_connect()" 完整排查

     編輯:PHP 相關知識

錯誤現象

Fatal error: Call to undefined function mysql_connect() in ...

根本原因

PHP 5.3+ 默認**不再內置** MySQL 擴展 (ext/mysql),且 PHP 7.0 **完全移除** 該擴展。舊代碼使用 mysql_connect()、mysql_query() 等函數會直接報錯。

解決方案 (按推薦順序)

方案一:遷移至 mysqli / PDO (強烈推薦)

ext/mysql 已棄用,**新項目務必使用 mysqli 或 PDO**,支持預處理語句、事務、面向對象 API、更安全。

mysqli 面向對象風格

<?php
$mysqli = new mysqli('localhost', 'root', '123456', 'testdb');
if ($mysqli->connect_errno) {
    die("連接失敗: " . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');

$result = $mysqli->query("SELECT * FROM users");
while ($row = $result->fetch_assoc()) {
    print_r($row);
}
$mysqli->close();
?>

PDO (可移植性最強)

<?php
try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'root', '123456', [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);
    $stmt = $pdo->query("SELECT * FROM users");
    foreach ($stmt as $row) {
        print_r($row);
    }
} catch (PDOException $e) {
    die("連接失敗: " . $e->getMessage());
}
?>

方案二:啟用舊版 mysql 擴展 (僅限 PHP 5.x 維護老項目)

  1. Windows:
    • 打開 php.ini,搜索 ;extension=php_mysql.dll,去掉分號
    • 確保 libmysql.dll 位於系統 PATH 中 (如 C:\Windows\System32 或 PHP 安裝目錄)
    • 重啟 Apache/IIS
  2. Linux:
    • 安裝包:yum install php-mysql 或 apt-get install php5-mysql
    • 或重新編譯 PHP:./configure --with-mysql=mysqlnd ...

注意:PHP 7.0+ **無法** 使用此方案,必須遷移代碼。

方案三:使用 mysqlnd (MySQL Native Driver)

PHP 5.3+ 內建 mysqlnd,mysqli/PDO 可直接使用無需外部 libmysql。編譯時指定:

./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd

驗證擴展是否載入

<?php
phpinfo(); // 搜索 "mysql" 區塊
// 或命令行
php -m | grep -i mysql
// 預期輸出: mysqli, pdo_mysql, mysqlnd
?>

常見遷移對照表

舊 mysql 函數mysqli 替代PDO 替代
mysql_connect()new mysqli() / mysqli_connect()new PDO()
mysql_select_db()$mysqli->select_db()DSN 指定 dbname
mysql_query()$mysqli->query()$pdo->query()
mysql_fetch_assoc()$result->fetch_assoc()$stmt->fetch(PDO::FETCH_ASSOC)
mysql_num_rows()$result->num_rows$stmt->rowCount() (不精確)
mysql_real_escape_string()$mysqli->real_escape_string()$pdo->quote() / 預處理
mysql_insert_id()$mysqli->insert_id$pdo->lastInsertId()
mysql_close()$mysqli->close()$pdo = null

安全最佳實踐

  1. 永遠使用預處理語句 防止 SQL 注入:$stmt = $mysqli->prepare("SELECT * FROM users WHERE id=?");
  2. 設置字符集:$mysqli->set_charset('utf8mb4') 或 DSN charset=utf8mb4
  3. 錯誤模式設為異常:mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
  4. 最小權限原則:數據庫用戶僅授予必要表的 SELECT/INSERT/UPDATE/DELETE
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved