首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 操作 MySQL 核心注意事項:從語法陷阱到類型處理最佳實踐

     編輯:MySQL 資料庫相關知識

PHP 與 MySQL 交互的 5 大核心注意點,涵蓋語法終止符、數據類型誤區、通配符陷阱、NULL 處理、防注入鋼印。

1. SQL 語句終止符:PHP 代碼中省略分號


// 錯誤:雙重分號導致解析異常
mysql_query("INSERT INTO t (a) VALUES ('1');"); 

// 正確:PHP 處理分號,驅動自動補全
mysql_query("INSERT INTO t (a) VALUES ('1')");

// 垂直顯示結果集時用 \G 替代分號 (僅命令行客戶端)

2. 易混淆數據類型澄清

誤區真相
TEXT 是獨立類型實為 LONG VARCHAR/MEDIUMTEXT 別名,用 VARCHAR(65535) 或 TEXT 族
DATE 格式隨意強制 YYYY-MM-DD,PHP 生成:date('Y-m-d')
DATE 可直接減法得天數MySQL 支持 DATEDIFF(d1,d2) / TIMESTAMPDIFF(DAY,d1,d2),不可直接相減
SET/ENUM 區別模糊SET 多選 (位掩碼存儲,最多 64 值);ENUM 單選 (最多 65535 值);超 64 值集合需多列或關聯表

3. 通配符使用鐵律

  • *:僅用於 SELECT 列列表 (SELECT *),不可用於 WHERE
  • %:僅用於 LIKE/RLIKE 模式匹配,匹配任意長度字符 (含 0 字符)
  • _:僅用於 LIKE/RLIKE,匹配任意單字符
  • % 必須搭配 LIKE:WHERE col LIKE '%abc%',不可單獨用 WHERE col = '%abc%'

4. NOT NULL 與空值處理策略


-- 表定義
CREATE TABLE t (
  city VARCHAR(50) NOT NULL DEFAULT '未知',  -- 強制非空 + 默認值
  age  TINYINT NOT NULL DEFAULT 0
);

-- PHP 查詢構建 (安全模式)
$city = $_GET['city'] ?? '%';  // 未傳遞則全匹配
$sql = "SELECT * FROM users WHERE city LIKE ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('s', $city);
$stmt->execute();

核心原則:所有業務列定義 NOT NULL + 合理默認值,應用層統一用 % 代替空字符串通配,避免 NULL 與 '' 語義混淆導致 LIKE '%' 匹配不到 NULL 行。

5. 現代防注入鋼印 (PHP 7+ / MySQLi / PDO)


// MySQLi PreparedStatement
$stmt = $mysqli->prepare("SELECT * FROM users WHERE email = ? AND status = ?");
$stmt->bind_param('si', $email, $status);  // s=string, i=integer
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { ... }

// PDO (跨數據庫、更現代)
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass);
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => $email]);
foreach ($stmt as $row) { ... }

禁用:mysql_* 系列函數 (PHP 7.0 移除)、字符串拼接 SQL、addslashes() 手動轉義。

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