PHP检测重名通常是指在一个系统或数据库中检查某个名称是否已经被使用。这在用户注册、商品添加、文件上传等场景中非常常见,以确保数据的唯一性和避免冲突。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>检测重名</title>
<script>
function checkName() {
var name = document.getElementById('name').value;
var xhr = new XMLHttpRequest();
xhr.open('GET', 'check_name.php?name=' + encodeURIComponent(name), true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var result = JSON.parse(xhr.responseText);
if (result.exists) {
alert('名称已存在,请重新输入!');
} else {
alert('名称可用!');
}
}
};
xhr.send();
}
</script>
</head>
<body>
<input type="text" id="name" placeholder="请输入名称">
<button onclick="checkName()">检测</button>
</body>
</html>
<?php
// check_name.php
header('Content-Type: application/json');
$db_host = 'localhost';
$db_user = 'username';
$db_pass = 'password';
$db_name = 'database_name';
$conn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$conn) {
die('连接失败: ' . mysqli_connect_error());
}
$name = $_GET['name'];
$sql = "SELECT COUNT(*) as count FROM users WHERE username = '$name'";
$result = mysqli_query($conn, $sql);
if ($result) {
$row = mysqli_fetch_assoc($result);
if ($row['count'] > 0) {
echo json_encode(['exists' => true]);
} else {
echo json_encode(['exists' => false]);
}
}
mysqli_close($conn);
?>
原因:直接将用户输入拼接到SQL查询中,存在SQL注入风险。
解决方法:使用预处理语句或参数化查询。
$sql = "SELECT COUNT(*) as count FROM users WHERE username = ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, 's', $name);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $count);
mysqli_stmt_fetch($stmt);
if ($count > 0) {
echo json_encode(['exists' => true]);
} else {
echo json_encode(['exists' => false]);
}
mysqli_stmt_close($stmt);
原因:每次检测都需要查询数据库,可能导致性能瓶颈。
解决方法:使用缓存机制,如Redis,减少数据库查询次数。
// 假设使用Redis缓存
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$name = $_GET['name'];
$cacheKey = 'name:' . $name;
if ($redis->get($cacheKey)) {
echo json_encode(['exists' => true]);
} else {
$sql = "SELECT COUNT(*) as count FROM users WHERE username = '$name'";
$result = mysqli_query($conn, $sql);
$row = mysqli_fetch_assoc($result);
if ($row['count'] > 0) {
$redis->setex($cacheKey, 3600, 'true'); // 缓存1小时
echo json_encode(['exists' => true]);
} else {
echo json_encode(['exists' => false]);
}
}
通过以上方法,可以有效检测重名并解决相关问题。
云+社区沙龙online [技术应变力]
企业创新在线学堂
Elastic 实战工作坊
Elastic 实战工作坊
云+社区沙龙online [技术应变力]
高校公开课
云+社区技术沙龙[第12期]
DB・洞见
原引擎
云原生在发声
领取专属 10元无门槛券
手把手带您无忧上云