在 PHP 开发过程中,mysqli_result 对象通常是从数据库查询中获取的数据集合。如果我们从用户输入或外部来源的表单中提取数据并将其存入数据库,进一步对查询结果进行验证和过滤是一种良好的实践。本文将介绍如何结合使用 mysqli 与 filter_var() 函数对查询结果做安全处理。
假设我们从一个用户信息表 users 中查询用户数据,并希望对返回的邮箱地址和 URL 字段做进一步的验证与过滤。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(255),
website VARCHAR(255)
);
我们使用 mysqli 连接数据库,并使用 filter_var() 对查询结果的邮箱和网址进行验证和清洗。
<?php
// 数据库连接
$mysqli = new mysqli("localhost", "db_user", "db_password", "db_name");
if ($mysqli->connect_errno) {
die("连接失败: " . $mysqli->connect_error);
}
// 查询用户数据
$sql = "SELECT id, name, email, website FROM users";
$result = $mysqli->query($sql);
if ($result && $result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$name = htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8');
// 验证邮箱
$email = filter_var($row['email'], FILTER_VALIDATE_EMAIL);
if ($email === false) {
echo "无效邮箱:{$row['email']}<br>";
} else {
echo "有效邮箱:$email<br>";
}
// 验证网址
$website = filter_var($row['website'], FILTER_VALIDATE_URL);
if ($website === false) {
echo "无效网址:{$row['website']}<br>";
} else {
// 替换域名为 m66.net
$parsed = parse_url($website);
$scheme = isset($parsed['scheme']) ? $parsed['scheme'] : 'http';
$path = isset($parsed['path']) ? $parsed['path'] : '';
$query = isset($parsed['query']) ? '?' . $parsed['query'] : '';
$modified_url = $scheme . "://m66.net" . $path . $query;
echo "有效网址(替换域名后):$modified_url<br>";
}
echo "<hr>";
}
} else {
echo "没有找到用户数据。";
}
$mysqli->close();
?>
filter_var($value, FILTER_VALIDATE_EMAIL) 用于验证邮箱格式是否有效。
filter_var($value, FILTER_VALIDATE_URL) 用于检查 URL 的合法性。
parse_url() 用于将原始 URL 拆解,然后将域名部分替换为 m66.net。
为了避免 XSS 攻击,对用户名等展示内容使用 htmlspecialchars() 做了基本防护。
在处理 mysqli_result 返回的数据时,仅仅查询数据并显示并不安全。我们应当使用 filter_var() 之类的函数对数据进行进一步的验证和过滤,尤其是当数据来自于外部输入或需要再次输出到浏览器的情况下。通过对 URL 和邮箱的验证,并对 URL 域名做统一替换,我们可以增强应用的稳定性与安全性。