掌握 INSERT 與 SELECT 的完整語法、參數化寫法、PHP 交互模式、結果集處理、內存釋放,是 MySQL 應用開發的基石。本文系統講解命令行與 PHP 兩種場景下的最佳實踐。
-- 全列插入(須匹配表定義順序)
INSERT INTO table_name VALUES (v1, v2, ..., vN);
-- 指定列插入(推薦:順序可調、擴展性強、未指定列用默認值)
INSERT INTO table_name (col1, col2, ..., colN) VALUES (v1, v2, ..., vN);
-- 批量插入(單條 SQL,性能比循環插入高數量級)
INSERT INTO table_name (col1, col2) VALUES
(v11, v12), (v21, v22), ..., (vN1, vN2);
規則:字符/日期類型值必須用單引號 'value';數值類型無需引號;NULL 不加引號。
mysql> USE tutorials_db;
mysql> INSERT INTO tutorials_tbl (tutorial_title, tutorial_author, submission_date)
-> VALUES ("Learn PHP", "John Poul", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl (tutorial_title, tutorial_author, submission_date)
-> VALUES ("Learn MySQL", "Abdul S", NOW());
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO tutorials_tbl (tutorial_title, tutorial_author, submission_date)
-> VALUES ("JAVA Tutorial", "Sanjay", '2007-05-06');
Query OK, 1 row affected (0.01 sec)
提示:-> 為續行提示符,非 SQL 一部分。NOW() 返回當前 datetime。自增主鍵 tutorial_id 無需指定。
<?php
$host = 'localhost'; $user = 'root'; $pass = 'rootpassword'; $db = 'TUTORIALS';
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) die('Connect failed: ' . $mysqli->connect_error);
$mysqli->set_charset('utf8mb4');
$title = $_POST['tutorial_title'] ?? '';
$author = $_POST['tutorial_author'] ?? '';
$date = $_POST['submission_date'] ?? date('Y-m-d');
// 預處理:防注入、性能優化
$stmt = $mysqli->prepare("INSERT INTO tutorials_tbl (tutorial_title, tutorial_author, submission_date) VALUES (?, ?, ?)");
$stmt->bind_param('sss', $title, $author, $date);
if ($stmt->execute()) {
echo "Inserted ID: " . $stmt->insert_id;
} else {
echo "Error: " . $stmt->error;
}
$stmt->close();
$mysqli->close();
?>
舊版 mysql 擴展已棄用,請直接使用 mysqli 或 PDO。
SELECT col1, col2, ... FROM table_name
[WHERE condition]
[GROUP BY col]
[HAVING condition]
[ORDER BY col [ASC|DESC]]
[LIMIT offset, row_count];
* 代表所有列(生產環境慎用,明確列名)WHERE 支持比較、邏輯、IN、BETWEEN、LIKE、IS NULL 等LIMIT 偏移量從 0 開始mysql> SELECT * FROM tutorials_tbl;
+-------------+----------------+-----------------+-----------------+
| tutorial_id | tutorial_title | tutorial_author | submission_date |
+-------------+----------------+-----------------+-----------------+
| 1 | Learn PHP | John Poul | 2007-05-21 |
| 2 | Learn MySQL | Abdul S | 2007-05-21 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-21 |
+-------------+----------------+-----------------+-----------------+
3 rows in set (0.01 sec)
<?php
$mysqli = new mysqli('localhost', 'root', 'rootpassword', 'TUTORIALS');
$mysqli->set_charset('utf8mb4');
$sql = "SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl";
$result = $mysqli->query($sql);
if (!$result) die('Query failed: ' . $mysqli->error);
// 方式一:關聯數組遍歷 (推薦,可讀性強)
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['tutorial_id']}
";
echo "Title: {$row['tutorial_title']}
";
echo "Author: {$row['tutorial_author']}
";
echo "Date: {$row['submission_date']}
";
}
// 方式二:數字索引數組
// while ($row = $result->fetch_row()) { echo $row[0] . ' ' . $row[1] . '...'; }
// 方式三:對象
// while ($obj = $result->fetch_object()) { echo $obj->tutorial_title; }
// 釋放結果集內存(重要!長連接/大結果集必須釋放)
$result->free();
// 關閉連接
$mysqli->close();
?>
<?php
$pdo = new PDO("mysql:host=localhost;dbname=TUTORIALS;charset=utf8mb4", 'root', 'rootpassword');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query("SELECT tutorial_id, tutorial_title, tutorial_author, submission_date FROM tutorials_tbl");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "ID: {$row['tutorial_id']}
Title: {$row['tutorial_title']}
...";
}
// PDOStatement 銷毀自動釋放結果集
?>
| mysqli 方法 | PDO 常量 | 返回類型 | 適用場景 |
|---|---|---|---|
fetch_assoc() | FETCH_ASSOC | 關聯數組 | 按列名訪問,業務代碼清晰 |
fetch_row() | FETCH_NUM | 數字索引數組 | 性能極致、列順序固定 |
fetch_array(MYSQLI_BOTH) | FETCH_BOTH | 雙模式 | 兼容舊代碼 |
fetch_object() | FETCH_OBJ | stdClass 對象 | 面向對象風格 |
fetch_all(MYSQLI_ASSOC) | fetchAll(FETCH_ASSOC) | 二維數組 | 小結果集一次性取完 |
prepare() + bind_param() / PDO::prepare(),杜絕 SQL 注入utf8mb4SELECT col1, col2 而非 SELECT *$result->free() / $stmt->close() / $pdo = nullmysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 或 PDO::ERRMODE_EXCEPTIONVALUES (...), (...), ...,事務包裹大批量DATETIME / TIMESTAMP,或應用層統一用 Unix 時間戳 INT