在PHP中执行依赖于变量的SQL查询是Web开发中常见的操作,但如果不正确处理,可能会导致SQL注入等安全问题。这类查询通常用于动态构建SQL语句,根据用户输入或其他变量条件从数据库中检索或修改数据。
预处理语句是执行变量依赖SQL查询最安全的方式,可以有效防止SQL注入。
// 使用PDO预处理语句
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id AND status = :status");
$stmt->execute([':id' => $userId, ':status' => $status]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 使用mysqli预处理语句
$mysqli = new mysqli("localhost", "username", "password", "test");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ? AND status = ?");
$stmt->bind_param("is", $userId, $status); // "i"表示整数,"s"表示字符串
$stmt->execute();
$result = $stmt->get_result();
$results = $result->fetch_all(MYSQLI_ASSOC);
// 使用PDO参数化查询
$sql = "SELECT * FROM users WHERE email = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$email]);
// 不安全的做法 - 容易导致SQL注入
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];
$result = $pdo->query($sql);
原因:直接拼接用户输入到SQL语句中 解决方案:始终使用预处理语句
原因:未正确使用索引或预处理语句 解决方案:
原因:变量类型与数据库字段类型不一致 解决方案:
$userId = (int)$_GET['id']; // 强制转换为整数
$conditions = [];
$params = [];
if (!empty($name)) {
$conditions[] = "name LIKE ?";
$params[] = "%$name%";
}
if (!empty($status)) {
$conditions[] = "status = ?";
$params[] = $status;
}
$sql = "SELECT * FROM users";
if (!empty($conditions)) {
$sql .= " WHERE " . implode(" AND ", $conditions);
}
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$sql = "INSERT INTO users (name, email, created_at) VALUES (:name, :email, :created_at)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':name' => $name,
':email' => $email,
':created_at' => date('Y-m-d H:i:s')
]);
通过正确使用预处理语句和参数化查询,可以安全高效地在PHP中执行依赖于变量的SQL查询。
没有搜到相关的文章