本文通過完整代碼示例,演示如何使用PHP原生mysql擴展(注意:PHP 7.0+已棄用,生產環境請用mysqli或PDO)連接MySQL,實現數據的插入與查詢操作,並講解編碼、加密、調試等關鍵技巧。
<?php
$host = 'localhost';
$user = 'root';
$pass = 'root123';
$dbname = 'test';
$conn = @mysql_connect($host, $user, $pass);
if (!$conn) {
die('連接數據庫失敗:' . mysql_error());
}
mysql_select_db($dbname, $conn);
// 關鍵:設置字符集,防止中文亂碼
// PHP文件為GBK編碼時
mysql_query("SET NAMES 'gbk'", $conn);
// PHP文件為UTF-8編碼時
// mysql_query("SET NAMES 'utf8'", $conn);
?>
說明:@抑制錯誤輸出,die()終止腳本並顯示錯誤。SET NAMES等同於同時設置character_set_client、connection、results。
-- 全列插入(須匹配表結構順序)
INSERT INTO table_name VALUES (v1, v2, ...);
-- 指定列插入(推薦,順序可調整,未指定列需有默認值或允許NULL)
INSERT INTO table_name (col1, col2, ...) VALUES (v1, v2, ...);
<?php
// 接收表單數據(假設POST提交)
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
// 安全處理:密碼加密、轉義
$password = md5($password); // 實際項目請用password_hash()
$regdate = time(); // Unix時間戳
// 構建SQL(字符值必須用單引號)
$sql = "INSERT INTO user (username, password, email, regdate)
VALUES ('$username', '$password', '$email', $regdate)";
// 調試技巧:打印SQL檢查
// exit($sql);
if (!mysql_query($sql, $conn)) {
echo '添加數據失敗:' . mysql_error();
} else {
echo '添加數據成功!ID: ' . mysql_insert_id();
}
?>
mysql_query前必須SET NAMES,否則中文入庫亂碼MD5不可逆,驗證時對比加密後值。生產環境請用password_hash() + password_verify()mysql擴展無預處理,必須用mysql_real_escape_string()轉義輸入,或升級mysqli/PDO使用參數綁定exit($sql),上線前註釋-- 查詢指定列
SELECT col1, col2 FROM table_name [WHERE condition] [ORDER BY col] [LIMIT offset, rows];
-- 查詢所有列
SELECT * FROM table_name ...
<?php
$sql = "SELECT * FROM user";
$result = mysql_query($sql, $conn);
if (!$result) {
die('查詢失敗:' . mysql_error());
}
// 設置輸出字符集(讀取時防亂碼)
mysql_query("SET CHARACTER SET 'gbk'", $conn); // 或 utf8
echo '<table border="1"><tr><th>用戶名</th><th>郵箱</th><th>注冊時間</th></tr>';
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
// MYSQL_ASSOC 返回關聯數組,可用列名訪問
// MYSQL_NUM 返回數字索引數組
// MYSQL_BOTH 兩者兼有(默認)
echo '<tr>';
echo '<td>' . htmlspecialchars($row['username']) . '</td>';
echo '<td>' . htmlspecialchars($row['email']) . '</td>';
echo '<td>' . date('Y-m-d', $row['regdate']) . '</td>';
echo '</tr>';
}
echo '</table>';
// 釋放結果集內存(良好習慣)
mysql_free_result($result);
mysql_close($conn);
?>
| 函數 | 返回值 | 適用場景 |
|---|---|---|
mysql_fetch_array($res, MYSQL_ASSOC) | 關聯數組 | 按列名訪問,代碼可讀性強 |
mysql_fetch_assoc($res) | 關聯數組 | mysql_fetch_array($res, MYSQL_ASSOC)簡寫 |
mysql_fetch_array($res, MYSQL_NUM) | 數字索引數組 | 性能略高,需記住列順序 |
mysql_fetch_row($res) | 數字索引數組 | mysql_fetch_array($res, MYSQL_NUM)簡寫 |
mysql_fetch_object($res) | 對象 | 面向對象風格訪問 |
用戶瀏覽器 --(POST表單)--> PHP處理頁
1. 接收 $_POST 數據
2. 驗證、過濾、轉義
3. 密碼加密、時間戳生成
4. 構建參數化SQL (mysqli/PDO) 或 轉義SQL (mysql)
5. 執行 INSERT
6. 判斷結果,反饋用戶
7. 關閉連接、釋放資源
mysql擴展自PHP 5.5棄用,7.0移除。新項目請直接使用:
// PDO 插入示例
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("INSERT INTO user (username, password, email, regdate) VALUES (?, ?, ?, ?)");
$stmt->execute([$username, password_hash($password, PASSWORD_DEFAULT), $email, time()]);
echo "插入成功,ID: " . $pdo->lastInsertId();
掌握基礎CRUD後,重點學習預處理語句、事務控制、連接池、ORM框架,構建安全高效的數據訪問層。