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

PHP 連接 MySQL:mysql vs mysqli 完整差異與遷移指南

     編輯:MySQL 綜合教學

前言

PHP 5.5 棄用、PHP 7.0 移除 mysql_* 系列函數,mysqli(MySQL Improved)與 PDO 成為唯一官方支援選項。本文深度對比兩者架構差異、API 風格、效能特性、預處理語句、事務處理,並提供遷移實戰清單。

核心架構差異

特性mysql (舊)mysqli (新)
連線模式非持久(每次呼叫新連線)支援持久連線(mysqli::persistent)
API 風格僅程序式程序式 + 物件導向雙模式
預處理語句不支援完整支援(防 SQL 注入核心)
多重查詢不支援支援 multi_query()
事務控制僅 mysql_query("COMMIT")autocommit(), commit(), rollback()
增強除錯無mysqli_report(), errno/error 屬性
非同步查詢不支援支援 poll(), reap_async_query()
PHP 版本支援≤ 5.6(已移除)≥ 5.0(持續維護)

常見錯誤:Class 'mysqli' not found

原因:PHP 編譯/安裝時未啟用 mysqli 擴展。

Windows (php.ini)

Linux (編譯/套件)

// 舊
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('dbname', $link);

// 新 - 程序式
$link = mysqli_connect('localhost', 'user', 'pass', 'dbname');
if (!$link) die('Connect Error: ' . mysqli_connect_error());

// 新 - 物件導向 (推薦)
$mysqli = new mysqli('localhost', 'user', 'pass', 'dbname');
if ($mysqli->connect_errno) die('Connect Error: ' . $mysqli->connect_error);
$mysqli->set_charset('utf8mb4'); // 關鍵:設定字元集

查詢與結果集

query("SELECT * FROM users WHERE id=1");
$row = $res->fetch_assoc();
$res->free();

預處理語句(防注入核心,mysqli 獨有)

bind_param("si", $email, $status); // s=string, i=integer, d=double, b=blob
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { /* ... */ }
$stmt->close();

事務處理

query("UPDATE inventory SET qty=qty-1 WHERE id=1");
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
    throw $e;
}
$mysqli->autocommit(true);

錯誤處理(推薦模式)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved