第十三章-PHP MySQL擴展

第十三章-PHP與MySQL

一,連接數據庫

1. 使用 MySQLi(面向對象方式)

<?php
// 數據庫參數
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'test_db';// 創建連接
$conn = new mysqli($host, $username, $password, $database);// 檢查連接是否成功
if ($conn->connect_error) {die("連接失敗: " . $conn->connect_error);
}echo "數據庫連接成功!";// 執行查詢示例
$sql = "SELECT id, name FROM users";
$result = $conn->query($sql);if ($result->num_rows > 0) {while ($row = $result->fetch_assoc()) {echo "ID: " . $row["id"] . ",姓名: " . $row["name"];}
} else {echo "沒有查詢到數據";
}// 關閉連接
$conn->close();
?>

2. 使用 MySQLi(過程化方式)

<?php
$host = 'localhost';
$username = 'root';
$password = '';
$database = 'test_db';// 創建連接
$conn = mysqli_connect($host, $username, $password, $database);// 檢查連接
if (!$conn) {die("連接失敗: " . mysqli_connect_error());
}echo "數據庫連接成功!";// 執行查詢示例
$sql = "SELECT id, name FROM users";
$result = mysqli_query($conn, $sql);if (mysqli_num_rows($result) > 0) {while ($row = mysqli_fetch_assoc($result)) {echo "ID: " . $row["id"] . ",姓名: " . $row["name"];}
}// 關閉連接
mysqli_close($conn);
?>

3. 使用 PDO(支持多種數據庫)

<?php
$host = 'localhost';
$database = 'test_db';
$username = 'root';
$password = '';try {// 創建 PDO 連接$conn = new PDO("mysql:host=$host;dbname=$database", $username, $password);// 設置錯誤模式為異常捕獲$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);echo "數據庫連接成功!";// 執行查詢示例(使用預處理語句防注入)$sql = "SELECT id, name FROM users";$stmt = $conn->prepare($sql);$stmt->execute();// 獲取結果$result = $stmt->fetchAll(PDO::FETCH_ASSOC);foreach ($result as $row) {echo "ID: " . $row["id"] . ",姓名: " . $row["name"];}} catch (PDOException $e) {die("連接失敗: " . $e->getMessage());
}// 關閉連接(PDO 自動管理)
$conn = null;
?>

關鍵注意事項

  1. 防止 SQL 注入

    • 使用預處理語句(如 $stmt->prepare() + bindParamexecute([參數]))。

    • 示例(PDO 預處理):

      $stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
      $stmt->bindParam(':name', $name);
      $stmt->bindParam(':email', $email);
      $stmt->execute();
      
  2. 錯誤處理

    • MySQLi 使用 $conn->connect_errormysqli_connect_error()
    • PDO 使用異常捕獲(try...catch + setAttribute)。
  3. 關閉連接

    • MySQLi:$conn->close()mysqli_close($conn)
    • PDO:$conn = null

常見問題

  • 連接失敗可能原因

    1. 用戶名/密碼錯誤
    2. 數據庫未啟動
    3. 防火墻阻止連接
    4. PHP 未啟用 MySQLi/PDO 擴展(檢查 php.ini
  • 啟用擴展
    php.ini 中取消注釋:

    ;extension=mysqli
    ;extension=pdo_mysql
    

    重啟 Web 服務器生效。


二、增刪改查操作實現

1. 增加數據(Create)

MySQLi 預處理插入
// 準備預處理語句
$stmt = $conn->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email); // "ss" 表示兩個字符串參數// 設置參數并執行
$name = "張三";
$email = "zhangsan@example.com";
$stmt->execute();echo "插入成功,ID: " . $stmt->insert_id;
$stmt->close();
PDO 預處理插入
try {$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";$stmt = $conn->prepare($sql);// 綁定參數并執行$stmt->execute([':name' => '李四',':email' => 'lisi@example.com']);echo "插入成功,ID: " . $conn->lastInsertId();
} catch (PDOException $e) {echo "錯誤: " . $e->getMessage();
}

2. 查詢數據(Read)

MySQLi 查詢并遍歷結果
$sql = "SELECT id, name, email FROM users";
$result = $conn->query($sql);if ($result->num_rows > 0) {while ($row = $result->fetch_assoc()) {echo "ID: {$row['id']}, 姓名: {$row['name']}, 郵箱: {$row['email']}<br>";}
} else {echo "沒有數據";
}
$result->free(); // 釋放結果集
PDO 查詢并遍歷結果
try {$stmt = $conn->query("SELECT id, name, email FROM users");$results = $stmt->fetchAll(PDO::FETCH_ASSOC);foreach ($results as $row) {echo "ID: {$row['id']}, 姓名: {$row['name']}, 郵箱: {$row['email']}<br>";}
} catch (PDOException $e) {echo "錯誤: " . $e->getMessage();
}

3. 更新數據(Update)

MySQLi 預處理更新
$stmt = $conn->prepare("UPDATE users SET email = ? WHERE id = ?");
$stmt->bind_param("si", $email, $id); // "si" 表示字符串和整數$email = "new_email@example.com";
$id = 1;
$stmt->execute();echo "更新了 {$stmt->affected_rows} 條記錄";
$stmt->close();
PDO 預處理更新
try {$sql = "UPDATE users SET email = :email WHERE id = :id";$stmt = $conn->prepare($sql);$stmt->execute([':email' => 'updated@example.com',':id' => 1]);echo "更新了 {$stmt->rowCount()} 條記錄";
} catch (PDOException $e) {echo "錯誤: " . $e->getMessage();
}

4. 刪除數據(Delete)

MySQLi 預處理刪除
$stmt = $conn->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id); // "i" 表示整數$id = 2;
$stmt->execute();echo "刪除了 {$stmt->affected_rows} 條記錄";
$stmt->close();
PDO 預處理刪除
try {$sql = "DELETE FROM users WHERE id = :id";$stmt = $conn->prepare($sql);$stmt->execute([':id' => 3]);echo "刪除了 {$stmt->rowCount()} 條記錄";
} catch (PDOException $e) {echo "錯誤: " . $e->getMessage();
}

5.安全與最佳實踐

  1. 始終使用預處理語句

    • 避免 SQL 注入攻擊,禁止直接拼接用戶輸入到 SQL 中。
  2. 錯誤處理

    • MySQLi 檢查 $conn->error,PDO 使用 try...catch 捕獲異常。
  3. 關閉連接

    // MySQLi
    $conn->close();// PDO
    $conn = null;
    
  4. 驗證輸入數據

    • 使用 filter_var() 驗證郵箱、URL 等格式。
    • 檢查數值范圍(如 $id > 0)。

6.完整流程圖

1. 連接數據庫 → 2. 準備SQL語句 → 3. 綁定參數 → 4. 執行操作 → 5. 處理結果 → 6. 關閉連接

7.擴展建議

  • 使用 ORM 框架
    如 Laravel 的 Eloquent 或 Doctrine,簡化數據庫操作。

  • 事務處理
    對于多個關聯操作,使用事務保證數據一致性:

    // PDO 事務示例
    $conn->beginTransaction();
    try {$conn->exec("UPDATE account SET balance = balance - 100 WHERE id = 1");$conn->exec("UPDATE account SET balance = balance + 100 WHERE id = 2");$conn->commit();
    } catch (Exception $e) {$conn->rollBack();echo "事務失敗: " . $e->getMessage();
    }
    

三,網站查詢操作

一,OOP 寫法

OOP(面向對象編程,Object-Oriented Programming) 是一種程序設計思想和方法,它把數據對數據的操作組織成對象(Object),通過對象之間的交互來完成程序設計。

OOP 的核心概念
  1. 類(Class)
    • 類是對象的藍圖或模板,定義了對象的屬性(數據)**和**方法(操作)
    • 比如:“狗”可以是一個類,它有顏色、品種這些屬性,還有叫、跑這些方法。
  2. 對象(Object)
    • 對象是類的實例,是具體存在的個體。
    • 比如:“小黑”是一只狗,它是“狗”類的一個對象。
  3. 封裝(Encapsulation)
    • 把數據和操作數據的方法打包在一起,對外隱藏內部細節,只暴露必要的接口。
    • 好處是保護數據安全,減少外部干擾。
  4. 繼承(Inheritance)
    • 子類可以繼承父類的屬性和方法,復用代碼,還可以擴展或修改已有功能。
    • 比如,“哈士奇”類可以繼承“狗”類的基本特性,再加上自己的特性。
  5. 多態(Polymorphism)
    • 同一種方法在不同對象上可以有不同表現
    • 比如,不同動物的“叫”方法,狗叫“汪汪”,貓叫“喵喵”,但都可以統一調用“叫”這個動作。
$mysqli = new mysqli('localhost', 'dbuser', 'dbpass', 'dbname');
if ($mysqli->connect_errno) {throw new Exception('數據庫連接失敗:' . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');$sql = "SELECT id, username, email FROM users WHERE status = 1 AND is_deleted = 0 ORDER BY created_at DESC LIMIT 10";
$result = $mysqli->query($sql);if (!$result) {throw new Exception('查詢失敗:' . $mysqli->error);
}$data = [];
while ($row = $result->fetch_assoc()) {$data[] = $row;
}
$result->free();// 返回數據
return $data;
  • 必須判斷連接和查詢是否成功
  • 必須釋放結果集
  • 查詢多行,循環 fetch_assoc() 拼到數組里
  • 查詢限制條件齊全:WHEREORDER BYLIMIT 都要標準化

二、參數化查詢(防SQL注入)

生產環境絕對禁止拼接變量,必須用預處理。

示例:按用戶名模糊搜索
$stmt = $mysqli->prepare("SELECT id, username, email FROM users WHERE username LIKE CONCAT('%', ?, '%') AND status = 1 LIMIT 20");
if (!$stmt) {throw new Exception('預處理失敗:' . $mysqli->error);
}$keyword = 'alice'; // 搜索關鍵詞
$stmt->bind_param('s', $keyword);
$stmt->execute();$result = $stmt->get_result();
$data = [];
while ($row = $result->fetch_assoc()) {$data[] = $row;
}
$stmt->close();return $data;
  • 預處理 (prepare + bind_param) 必須使用
  • 模糊搜索需要 CONCAT('%', ?, '%') 寫法
  • 不要用變量直接拼接到 SQL 字符串里

三、查詢單條記錄

如果只查一行,可以直接用 fetch_assoc() 拿一次。

php復制編輯$stmt = $mysqli->prepare("SELECT id, username, email FROM users WHERE id = ?");
$stmt->bind_param('i', $user_id);
$stmt->execute();$result = $stmt->get_result();
$user = $result->fetch_assoc();
$stmt->close();// 檢查是否查到
if (!$user) {throw new Exception('用戶不存在');
}return $user;
  • fetch_assoc() 只取一行,后面不用循環
  • 查不到數據時要有異常/提示處理

四、分頁查詢(帶總數)

分頁查詢是非常常見需求,要返回數據和總數。

$page = 1;
$page_size = 10;
$offset = ($page - 1) * $page_size;// 1. 查詢數據
$stmt = $mysqli->prepare("SELECT id, username, email FROM users WHERE status = 1 LIMIT ?, ?");
$stmt->bind_param('ii', $offset, $page_size);
$stmt->execute();
$result = $stmt->get_result();
$list = [];
while ($row = $result->fetch_assoc()) {$list[] = $row;
}
$stmt->close();// 2. 查詢總條數
$sql_total = "SELECT COUNT(*) AS total FROM users WHERE status = 1";
$res_total = $mysqli->query($sql_total);
$total_row = $res_total->fetch_assoc();
$total = (int)$total_row['total'];
$res_total->free();// 返回分頁結果
return ['list'  => $list,'total' => $total
];
  • 分頁必須返回數據列表 + 總條數
  • 分開兩次查詢更穩(一次查數據,一次查總數)

五、復雜條件動態查詢(實戰重點)

有些條件是用戶輸入的,要動態拼條件,但還要防注入。常規做法是動態構造 SQL + 參數綁定

$conditions = [];
$params = [];
$types = '';// 假設有用戶搜索過濾
if (!empty($filter['username'])) {$conditions[] = "username LIKE CONCAT('%', ?, '%')";$params[] = $filter['username'];$types .= 's';
}
if (isset($filter['status'])) {$conditions[] = "status = ?";$params[] = (int)$filter['status'];$types .= 'i';
}$where = $conditions ? 'WHERE ' . implode(' AND ', $conditions) : '';$sql = "SELECT id, username, email FROM users $where ORDER BY created_at DESC LIMIT 20";
$stmt = $mysqli->prepare($sql);
if ($params) {$stmt->bind_param($types, ...$params);
}
$stmt->execute();
$result = $stmt->get_result();$data = [];
while ($row = $result->fetch_assoc()) {$data[] = $row;
}
$stmt->close();return $data;
  • 拼接 SQL 時 條件動態組裝,值用綁定
  • 類型字符串 $types 也要跟著參數增長
  • 防止 SQL 注入,同時又靈活

總結

方面要點
查詢數據query 或 prepare + get_result
查詢多行while(fetch_assoc)
查詢單行fetch_assoc 直接用
分頁查詢兩次查詢:數據和總數分開
防SQL注入預處理 + bind_param
動態條件組裝 WHERE 和 參數,分離綁定
穩定性保障任何 query 或 prepare 后必須判斷成功
字符集設置$mysqli->set_charset('utf8mb4') 避免亂碼

四,相關函數

一,核心函數分類及用法

1. 連接與關閉
  • 創建連接

    // 面向對象
    $mysqli = new mysqli("localhost", "user", "password", "database", 3306);// 過程式
    $link = mysqli_connect("localhost", "user", "password", "database", 3306);
    
    • 失敗行為:默認返回 false,但若啟用 MYSQLI_REPORT_STRICT 模式,會拋出 mysqli_sql_exception
  • 檢查連接錯誤

    // 面向對象
    if ($mysqli->connect_errno) {die("連接失敗: " . $mysqli->connect_error);
    }// 過程式
    if (mysqli_connect_errno()) {die("連接失敗: " . mysqli_connect_error());
    }
    
  • 關閉連接

    $mysqli->close();       // 面向對象
    mysqli_close($link);    // 過程式
    

2. 執行查詢
  • 執行普通查詢

    // 面向對象
    $result = $mysqli->query("SELECT * FROM users");
    // 過程式
    $result = mysqli_query($link, "SELECT * FROM users");
    
    • 返回值
      • 成功(SELECT/SHOW/DESCRIBE)返回 mysqli_result 對象。
      • 成功(INSERT/UPDATE/DELETE)返回 true
      • 失敗返回 false(或拋出異常)。
  • 獲取結果數據

    // 獲取關聯數組
    while ($row = $result->fetch_assoc()) {echo $row["name"];
    }// 或直接獲取所有數據
    $data = $result->fetch_all(MYSQLI_ASSOC);
    

3. 預處理語句(防 SQL 注入)
  • 步驟prepare()bind_param()execute()get_result()

    $stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
    $name = "Alice";
    $email = "alice@example.com";// 綁定參數(類型標識符:s=string, i=int, d=double, b=blob)
    $stmt->bind_param("ss", $name, $email);// 執行
    $stmt->execute();// 獲取插入的 ID
    $inserted_id = $stmt->insert_id;// 關閉預處理語句
    $stmt->close();
    

4. 事務處理
  • 開啟事務

    $mysqli->begin_transaction();try {$mysqli->query("UPDATE account SET balance = balance - 100 WHERE user_id = 1");$mysqli->query("UPDATE account SET balance = balance + 100 WHERE user_id = 2");$mysqli->commit(); // 提交事務
    } catch (mysqli_sql_exception $e) {$mysqli->rollback(); // 回滾echo "事務失敗: " . $e->getMessage();
    }
    

5. 錯誤與異常處理
  • 啟用嚴格異常模式

    $driver = new mysqli_driver();
    $driver->report_mode = MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR;
    
  • 捕獲異常

    try {$mysqli->query("INVALID SQL");
    } catch (mysqli_sql_exception $e) {echo "錯誤信息: " . $e->getMessage();echo "錯誤代碼: " . $e->getCode();
    }
    

二、PHP 8.0 關鍵變更與適配

1. 類型嚴格性
  • 參數類型檢查
    例如 mysqli_query($link, 123) 中的第二個參數必須為字符串,否則拋出 TypeError

    // PHP 8.0 會報錯,PHP 7.x 僅警告
    $mysqli->query(123); // 錯誤:參數必須為字符串
    
2. 棄用與移除
  • 棄用函數
    • mysqli::get_client_info()(無參數調用)需改為 mysqli_get_client_info()
  • 移除別名
    • mysqli_bind_param()mysqli_bind_result() 已移除,僅保留 mysqli_stmt_bind_param()

三、常用函數速查表

函數用途示例
mysqli_connect()建立數據庫連接$link = mysqli_connect(...)
mysqli_query()執行 SQL 查詢$result = mysqli_query($link, $sql)
mysqli_prepare()創建預處理語句$stmt = mysqli_prepare($link, $sql)
mysqli_stmt_bind_param()綁定預處理語句參數mysqli_stmt_bind_param($stmt, "si", ...)
mysqli_fetch_assoc()獲取關聯數組結果$row = mysqli_fetch_assoc($result)
mysqli_insert_id()獲取最后插入的 ID$id = mysqli_insert_id($link)
mysqli_affected_rows()獲取受影響的行數$count = mysqli_affected_rows($link)
mysqli_real_escape_string()轉義字符串(用于非預處理語句)$safe = mysqli_real_escape_string($link, $input)

四、最佳實踐

  1. 始終使用預處理語句:避免 SQL 注入,尤其是處理用戶輸入時。

  2. 啟用異常模式

    $driver = new mysqli_driver();
    $driver->report_mode = MYSQLI_REPORT_STRICT | MYSQLI_REPORT_ERROR;
    
  3. 關閉調試信息:生產環境中隱藏數據庫錯誤細節,記錄到日志文件。

  4. 資源釋放:及時關閉 mysqli_result 和預處理語句對象。


項目名稱:學生信息管理系統

功能需求

  1. 查看學生列表
  2. 添加新學生
  3. 編輯學生信息
  4. 刪除學生
  5. 簡單的搜索功能

技術棧

  • 前端:HTML + Bootstrap 5(極簡界面)
  • 后端:PHP 8.0+(面向過程編程)
  • 數據庫:MySQL 5.7+
  • 安全:MySQLi 預處理語句、輸入過濾

項目結構

/student_manager
├── index.php         # 顯示學生列表
├── create.php        # 添加新學生
├── edit.php          # 編輯學生信息
├── delete.php        # 刪除學生
├── config.php        # 數據庫配置
└── style.css         # 簡單樣式

數據庫設計

表名:students

CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE NOT NULL,age INT NOT NULL
);

核心代碼實現

1. 數據庫配置文件 (config.php)
<?php
// 數據庫配置
$host = 'localhost';
$user = 'root';
$password = '123456';
$database = 'student_db';// 創建連接
$mysqli = new mysqli($host, $user, $password, $database);// 檢查連接
if ($mysqli->connect_error) {die("連接失敗: " . $mysqli->connect_error);
}// 設置字符集
$mysqli->set_charset('utf8mb4');
?>

2. 顯示學生列表 (index.php)
<?php
include 'config.php';// 搜索功能
$search = $_GET['search'] ?? '';
$query = "SELECT * FROM students";
if (!empty($search)) {$query .= " WHERE name LIKE ?";$stmt = $mysqli->prepare($query);$search_term = "%$search%";$stmt->bind_param('s', $search_term);
} else {$stmt = $mysqli->prepare($query);
}$stmt->execute();
$result = $stmt->get_result();
?><!DOCTYPE html>
<html>
<head><title>學生管理系統</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5"><h2>學生列表</h2><!-- 搜索框 --><form class="mb-3"><input type="text" name="search" placeholder="輸入姓名搜索" class="form-control"><button type="submit" class="btn btn-primary mt-2">搜索</button></form><!-- 添加學生鏈接 --><a href="create.php" class="btn btn-success mb-3">添加新學生</a><!-- 學生表格 --><table class="table table-striped"><thead><tr><th>ID</th><th>姓名</th><th>郵箱</th><th>年齡</th><th>操作</th></tr></thead><tbody><?php while ($row = $result->fetch_assoc()): ?><tr><td><?= htmlspecialchars($row['id']) ?></td><td><?= htmlspecialchars($row['name']) ?></td><td><?= htmlspecialchars($row['email']) ?></td><td><?= htmlspecialchars($row['age']) ?></td><td><a href="edit.php?id=<?= $row['id'] ?>" class="btn btn-warning btn-sm">編輯</a><a href="delete.php?id=<?= $row['id'] ?>" class="btn btn-danger btn-sm" onclick="return confirm('確認刪除?')">刪除</a></td></tr><?php endwhile; ?></tbody></table>
</div>
</body>
</html>

3. 添加學生 (create.php)
<?php
include 'config.php';if ($_SERVER['REQUEST_METHOD'] === 'POST') {$name = $_POST['name'];$email = $_POST['email'];$age = $_POST['age'];// 使用預處理語句防止SQL注入$stmt = $mysqli->prepare("INSERT INTO students (name, email, age) VALUES (?, ?, ?)");$stmt->bind_param('ssi', $name, $email, $age);if ($stmt->execute()) {header('Location: index.php'); // 添加成功跳轉exit;} else {$error = "添加失敗: " . $stmt->error;}
}
?><!DOCTYPE html>
<html>
<head><title>添加學生</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5"><h2>添加新學生</h2><?php if (!empty($error)): ?><div class="alert alert-danger"><?= $error ?></div><?php endif; ?><form method="POST"><div class="mb-3"><label class="form-label">姓名</label><input type="text" name="name" class="form-control" required></div><div class="mb-3"><label class="form-label">郵箱</label><input type="email" name="email" class="form-control" required></div><div class="mb-3"><label class="form-label">年齡</label><input type="number" name="age" class="form-control" required></div><button type="submit" class="btn btn-primary">提交</button></form>
</div>
</body>
</html>

4. 編輯學生 (edit.php)
<?php
include 'config.php';// 獲取當前學生信息
$id = $_GET['id'];
$stmt = $mysqli->prepare("SELECT * FROM students WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$student = $stmt->get_result()->fetch_assoc();if ($_SERVER['REQUEST_METHOD'] === 'POST') {$name = $_POST['name'];$email = $_POST['email'];$age = $_POST['age'];$stmt = $mysqli->prepare("UPDATE students SET name=?, email=?, age=? WHERE id=?");$stmt->bind_param('ssii', $name, $email, $age, $id);if ($stmt->execute()) {header('Location: index.php'); // 更新成功跳轉exit;} else {$error = "更新失敗: " . $stmt->error;}
}
?><!DOCTYPE html>
<html>
<head><title>編輯學生</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5"><h2>編輯學生信息</h2><?php if (!empty($error)): ?><div class="alert alert-danger"><?= $error ?></div><?php endif; ?><form method="POST"><div class="mb-3"><label class="form-label">姓名</label><input type="text" name="name" class="form-control" value="<?= htmlspecialchars($student['name']) ?>" required></div><div class="mb-3"><label class="form-label">郵箱</label><input type="email" name="email" class="form-control" value="<?= htmlspecialchars($student['email']) ?>" required></div><div class="mb-3"><label class="form-label">年齡</label><input type="number" name="age" class="form-control" value="<?= htmlspecialchars($student['age']) ?>" required></div><button type="submit" class="btn btn-primary">更新</button></form>
</div>
</body>
</html>

5. 刪除學生 (delete.php)
<?php
include 'config.php';if (isset($_GET['id'])) {$id = $_GET['id'];$stmt = $mysqli->prepare("DELETE FROM students WHERE id = ?");$stmt->bind_param('i', $id);if ($stmt->execute()) {header('Location: index.php'); // 刪除成功跳轉} else {die("刪除失敗: " . $stmt->error);}
}
?>

安全措施

  1. SQL注入防護
    • 所有用戶輸入通過 prepare + bind_param 處理。
  2. XSS防護
    • 使用 htmlspecialchars() 轉義所有動態輸出。
  3. 數據驗證
    • 前端使用 required 屬性確保必填字段。
    • 后端檢查 $_SERVER['REQUEST_METHOD'] 防止直接訪問。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903988.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【文獻閱讀】全球干旱地區植被突變的普遍性和驅動因素

一、研究背景 全球干旱區&#xff08;drylands&#xff09;覆蓋了陸地面積的40%以上&#xff0c;承載了全球約三分之一人口&#xff0c;是生態系統脆弱性較高的區域。這些地區對氣候變化和人類干擾尤其敏感。近年來&#xff0c;干旱區發生了大量植被突變現象&#xff0c;即生態…

【Vue3-Bug】中路由加載頁面直接顯示空白

Vue3中路由加載頁面直接顯示空白 沒有子路由 路由定義不能重復&#xff0c;請自己查看數據在main.js(或者)mina.ts入口文件中&#xff0c;需要將router的注入到vue中的執行放在&#xff0c;vue掛在元素之前 // 順序不能變 app.use(router) app.mount(#app)在App.vue中 // 在…

影樓精修-露齒笑算法解析

注意&#xff0c;為避免侵權&#xff0c;本文圖片均為AIGC生成或網絡公開數據&#xff1b; 像素蛋糕-露齒笑 在介紹本文之前&#xff0c;先說一下&#xff0c;其實露齒笑特效&#xff0c;并非像素蛋糕首創&#xff0c;早在幾年前&#xff0c;face app就率先推出了這個效果&am…

關于Python:7. Python數據庫操作

一、sqlite3&#xff08;輕量級本地數據庫&#xff09; sqlite3 是 Python 內置的模塊&#xff0c;用于操作 SQLite 數據庫。 SQLite 是一個輕量級、零配置的關系型數據庫系統&#xff0c;整個數據庫保存在一個文件中&#xff0c;適合小型項目和本地存儲。 SQLite 不需要安裝…

c++互斥鎖,競爭狀態與臨界區

競爭狀態與臨界區 1&#xff0c;基本互斥鎖2&#xff0c;try_lock3&#xff0c;互斥鎖存在的坑—線程搶占不到資源4&#xff0c;超時鎖5&#xff0c;遞歸鎖&#xff08;在一個線程內可以多次lock的鎖&#xff09;recursive_mutex和recursive_timed_mutex用于業務組合6&#xff…

實戰項目:基于控制臺與數據庫的圖書管理系統開發指南

一、項目概述與設計思路 1.1 為什么選擇圖書管理系統 圖書管理系統是學習編程的經典項目&#xff0c;它涵蓋了&#xff1a; 控制臺交互&#xff1a;學習用戶輸入輸出處理 數據庫操作&#xff1a;掌握CRUD核心功能 業務邏輯&#xff1a;理解實際應用場景 系統架構&#xff…

人工智能——層次聚類算法

目錄 摘要 18 層次聚類 18.1 本章工作任務 18.2 本章技能目標 18.3 本章簡介 18.4 編程實戰 18.5 本章總結 18.6 本章作業 本章已完結&#xff01;&#xff01;&#xff01; 摘要 本章實現的工作是&#xff1a;首先導入20名學生的3科成績&#xff0c;然后根據優先聚…

Linux中安裝mysql8,轉載及注意事項

一、先前往官網下載mysql8 下載地址&#xff1a; https://dev.mysql.com/downloads/選擇Linux 二、刪除Linux中的mysql&#xff08;如果有的話&#xff09;&#xff0c;上傳安裝包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql如果使用這…

《算法導論(第4版)》閱讀筆記:p4-p5

《算法導論(第4版)》學習第 3 天&#xff0c;p4-p5 總結&#xff0c;總計 2 頁。 一、技術總結 1.instance Thus, given the input sequence h31; 41; 59; 26; 41; 58i, a correct sorting algorithm returns as output the sequence h26; 31; 41; 41; 58; 59i. Such an inp…

第十四篇:系統分析師第三遍——15章

目錄 一、目標二、計劃三、完成情況四、意外之喜(最少2點)1.計劃內的明確認知和思想的提升標志2.計劃外的具體事情提升內容和標志 五、總結六、后面準備怎么做&#xff1f; 一、目標 通過參加考試&#xff0c;訓練學習能力&#xff0c;而非單純以拿證為目的。 1.在復習過程中&…

Easy云盤總結篇-登錄注冊

**說在前面&#xff1a;該項目是跟著B站一位大佬寫的&#xff0c;不分享源碼&#xff0c;支持項目付費 ** 獲取圖形驗證碼 可以看到這里有2兩種圖形驗證碼&#xff0c;分為&#xff1a; type0&#xff1a;如上圖下面那個&#xff0c;是完成操作后要進行注冊的驗證碼 type1: 如…

【前端知識】Vue3狀態組件Pinia詳細介紹

Vue3狀態組件Pinia詳細介紹 關聯知識 Pinia 組件介紹、核心原理及使用方式 Pinia 組件介紹 Pinia 是 Vue.js 的官方狀態管理庫&#xff0c;專為 Vue 3 設計&#xff0c;提供簡潔的 API 和強大的 TypeScript 支持。其核心組件包括&#xff1a; ? Store&#xff1a;狀態存儲容器…

mysql 云服務遠程linux創建數據庫

1. 本地使用已創建好的用戶創建數據庫出現問題 提示access deniey finalshell遠程創建新用戶 :~# mysql -u root -pR***34 > CREATE DATABASE r***e; > CREATE USER r**ue% IDENTIFIED BY Ry****34; > GRANT ALL PRIVILEGES ON ry_vue.* TO r***e%; > FLUSH PRI…

【“星瑞” O6 評測】 — CPU llama.cpp不同優化速度對比

前言 隨著大模型應用場景的不斷拓展&#xff0c;arm cpu 憑借其獨特優勢在大模型推理領域的重要性日益凸顯。它在性能、功耗、架構適配等多方面發揮關鍵作用&#xff0c;推動大模型在不同場景落地 1. Kleidi AI 簡介 Arm Kleidi 成為解決這些挑戰的理想方案&#xff0c;它能…

wireshark抓包也能被篡改?

wireshark本身并不能修改數據包&#xff0c;但是tcprewrite 可以修改數據包&#xff0c;然后通過tcpreplay 進行重放&#xff0c;這個時候wireshark抓的包&#xff0c;就是被篡改后的pcap包了。 ailx10 網絡安全優秀回答者 互聯網行業 安全攻防員 去咨詢 步驟一&#xff1a…

使用PyTorch進行熱狗圖像分類模型微調

本教程將演示如何使用PyTorch框架對預訓練模型進行微調&#xff0c;實現熱狗與非熱狗圖像的分類任務。我們將從數據準備開始&#xff0c;逐步完成數據加載、可視化等關鍵步驟。 1. 環境配置與庫導入 %matplotlib inline import os import torch from torch import nn from d2l…

內容中臺與企業內容管理核心差異剖析

功能定位與架構設計差異 在企業數字化進程中&#xff0c;內容中臺與企業內容管理&#xff08;ECM&#xff09;的核心差異首先體現在功能定位層面。傳統ECM系統以文檔存儲、版本控制及權限管理為核心&#xff0c;主要服務于企業內部知識庫的靜態管理需求&#xff0c;例如通過Ba…

使用PyMongo連接MongoDB的基本操作

MongoDB是由C語言編寫的非關系型數據庫&#xff0c;是一個基于分布式文件存儲的開源數據庫系統&#xff0c;其內容存儲形式類似JSON對象&#xff0c;它的字段值可以包含其他文檔、數組及文檔數組。在這一節中&#xff0c;我們就來回顧Python 3下MongoDB的存儲操作。 常用命令:…

第 12 屆藍橋杯 C++ 青少組中 / 高級組省賽 2021 年真題

一、選擇題 第 1 題 題目&#xff1a;下列符號中哪個在 C 中表示行注釋 ( )。 A. ! B. # C. ] D. // 正確答案&#xff1a;D 答案解析&#xff1a; 在 C 中&#xff0c;//用于單行注釋&#xff08;行注釋&#xff09;&#xff0c;從//開始到行末的內容會被編譯器忽略。選項 A…

【python】【UV】一篇文章學完新一代 Python 環境與包管理器使用指南

&#x1f40d; UV&#xff1a;新一代 Python 環境與包管理器使用指南 一、UV 是什么&#xff1f; UV 是由 Astral 團隊開發的高性能 Python 環境管理器&#xff0c;旨在統一替代 pyenv、pip、venv、pip-tools、pipenv 等工具。 1.1 UV 的主要功能 &#x1f680; 極速包安裝&…