feat: 添加VIP客户调试页面和数据库调试脚本

添加VIP客户功能调试页面(vip_debug_page.html)和配套的数据库调试脚本(debug_vip_db.php),用于帮助排查VIP客户数据查询问题。调试页面提供问题分析、常见排查步骤和解决方案,调试脚本可验证数据库连接、检查表结构和数据状态。

页面包含以下功能:
1. 数据库连接测试
2. VIP表结构检查
3. 活跃VIP客户数据查询
4. 特定手机号查询
5. 测试数据插入功能
This commit is contained in:
2025-11-19 17:12:51 +08:00
parent 4aeb1f7362
commit 07030b0b4b
2 changed files with 332 additions and 0 deletions
+159
View File
@@ -0,0 +1,159 @@
<?php
// 调试脚本:验证数据库连接和VIP客户数据
header('Content-Type: text/html; charset=utf-8');
// 引入配置文件
require_once 'config.php';
// 确保配置变量存在
if (!isset($host) || !isset($username) || !isset($password) || !isset($database)) {
die('配置文件加载失败:无法读取数据库配置信息');
}
echo '<h2>VIP客户数据库调试</h2>';
echo '<h3>1. 配置信息</h3>';
echo '主机: ' . htmlspecialchars($host) . '<br>';
echo '数据库: ' . htmlspecialchars($database) . '<br>';
echo '用户名: ' . htmlspecialchars($username) . '<br>';
echo '<h3>2. 数据库连接测试</h3>';
try {
$pdo = new PDO("mysql:host=$host;dbname=$database;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo '<span style="color: green;">✅ 数据库连接成功</span><br>';
// 查询表是否存在
echo '<h3>3. 检查VIP表是否存在</h3>';
$checkTable = $pdo->query("SHOW TABLES LIKE 'vip_customers'");
if ($checkTable->rowCount() > 0) {
echo '<span style="color: green;">✅ 表 vip_customers 存在</span><br>';
// 查询表结构
echo '<h3>4. VIP表结构</h3>';
$describeTable = $pdo->query("DESCRIBE vip_customers");
echo '<table border="1" cellpadding="5" cellspacing="0"><tr><th>字段名</th><th>类型</th><th>空值</th><th>键</th><th>默认值</th><th>额外</th></tr>';
while ($row = $describeTable->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>';
echo '<td>' . htmlspecialchars($row['Field']) . '</td>';
echo '<td>' . htmlspecialchars($row['Type']) . '</td>';
echo '<td>' . htmlspecialchars($row['Null']) . '</td>';
echo '<td>' . htmlspecialchars($row['Key']) . '</td>';
echo '<td>' . htmlspecialchars($row['Default'] ?? '') . '</td>';
echo '<td>' . htmlspecialchars($row['Extra'] ?? '') . '</td>';
echo '</tr>';
}
echo '</table>';
// 查询VIP客户数据 - 活跃状态
echo '<h3>5. 活跃VIP客户数据 (is_active=1)</h3>';
$activeVips = $pdo->query("SELECT id, customer_name, phone, car_model, car_number, email, birthday, is_active FROM vip_customers WHERE is_active = 1 ORDER BY created_at DESC");
$activeVipCount = $activeVips->rowCount();
echo '活跃VIP客户数量: ' . $activeVipCount . '<br>';
if ($activeVipCount > 0) {
echo '<table border="1" cellpadding="5" cellspacing="0"><tr><th>ID</th><th>姓名</th><th>手机号</th><th>车型</th><th>车牌号</th><th>邮箱</th><th>生日</th><th>状态</th></tr>';
while ($vip = $activeVips->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>';
echo '<td>' . htmlspecialchars($vip['id']) . '</td>';
echo '<td>' . htmlspecialchars($vip['customer_name']) . '</td>';
echo '<td>' . htmlspecialchars($vip['phone']) . '</td>';
echo '<td>' . htmlspecialchars($vip['car_model']) . '</td>';
echo '<td>' . htmlspecialchars($vip['car_number']) . '</td>';
echo '<td>' . htmlspecialchars($vip['email']) . '</td>';
echo '<td>' . htmlspecialchars($vip['birthday']) . '</td>';
echo '<td>' . ($vip['is_active'] ? '活跃' : '非活跃') . '</td>';
echo '</tr>';
}
echo '</table>';
}
// 查询所有VIP客户数据(包括非活跃)
echo '<h3>6. 所有VIP客户数据(包括非活跃)</h3>';
$allVips = $pdo->query("SELECT id, customer_name, phone, car_model, car_number, email, birthday, is_active FROM vip_customers ORDER BY created_at DESC");
$allVipCount = $allVips->rowCount();
echo '总VIP客户数量: ' . $allVipCount . '<br>';
if ($allVipCount > 0) {
echo '<table border="1" cellpadding="5" cellspacing="0"><tr><th>ID</th><th>姓名</th><th>手机号</th><th>车型</th><th>车牌号</th><th>邮箱</th><th>生日</th><th>状态</th></tr>';
while ($vip = $allVips->fetch(PDO::FETCH_ASSOC)) {
echo '<tr>';
echo '<td>' . htmlspecialchars($vip['id']) . '</td>';
echo '<td>' . htmlspecialchars($vip['customer_name']) . '</td>';
echo '<td>' . htmlspecialchars($vip['phone']) . '</td>';
echo '<td>' . htmlspecialchars($vip['car_model']) . '</td>';
echo '<td>' . htmlspecialchars($vip['car_number']) . '</td>';
echo '<td>' . htmlspecialchars($vip['email']) . '</td>';
echo '<td>' . htmlspecialchars($vip['birthday']) . '</td>';
echo '<td>' . ($vip['is_active'] ? '活跃' : '非活跃') . '</td>';
echo '</tr>';
}
echo '</table>';
}
// 尝试查询用户提供的手机号
$userPhone = '18699627661';
echo '<h3>7. 查询特定手机号: ' . htmlspecialchars($userPhone) . '</h3>';
$stmt = $pdo->prepare("SELECT id, customer_name, phone, car_model, car_number, is_active FROM vip_customers WHERE phone = :phone");
$stmt->execute(['phone' => $userPhone]);
$specificVip = $stmt->fetch(PDO::FETCH_ASSOC);
if ($specificVip) {
echo '<span style="color: green;">✅ 找到匹配的VIP客户</span><br>';
echo '姓名: ' . htmlspecialchars($specificVip['customer_name']) . '<br>';
echo '手机号: ' . htmlspecialchars($specificVip['phone']) . '<br>';
echo '车型: ' . htmlspecialchars($specificVip['car_model']) . '<br>';
echo '车牌号: ' . htmlspecialchars($specificVip['car_number']) . '<br>';
echo '状态: ' . ($specificVip['is_active'] ? '活跃' : '非活跃') . '<br>';
} else {
echo '<span style="color: red;">❌ 未找到该手机号的VIP客户</span><br>';
}
// 模拟get_vip_customers.php的JSON响应
echo '<h3>8. 模拟get_vip_customers.php的JSON响应</h3>';
$vipCustomers = $pdo->query("SELECT id, customer_name, phone, car_model, car_number, email, birthday, is_active FROM vip_customers WHERE is_active = 1 ORDER BY created_at DESC")->fetchAll(PDO::FETCH_ASSOC);
echo '<pre>';
echo htmlspecialchars(json_encode($vipCustomers, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
echo '</pre>';
} else {
echo '<span style="color: red;">❌ 表 vip_customers 不存在</span><br>';
// 列出所有表
echo '数据库中的所有表:<br>';
$tables = $pdo->query("SHOW TABLES");
while ($table = $tables->fetch(PDO::FETCH_NUM)) {
echo '- ' . htmlspecialchars($table[0]) . '<br>';
}
}
} catch(PDOException $e) {
echo '<span style="color: red;">❌ 数据库连接失败</span><br>';
echo '错误信息: ' . htmlspecialchars($e->getMessage()) . '<br>';
}
// 添加插入测试数据的功能
echo '<h3>9. 插入测试VIP数据</h3>';
echo '<form method="post" action="">';
echo '<input type="hidden" name="insert_test_data" value="1">';
echo '<button type="submit">插入测试VIP数据</button>';
echo '</form>';
if (isset($_POST['insert_test_data'])) {
try {
$pdo = new PDO("mysql:host=$host;dbname=$database;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 插入用户提到的手机号作为测试数据
$stmt = $pdo->prepare("INSERT INTO vip_customers (customer_name, phone, car_model, car_number, email, birthday, notes, is_active) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->execute(['测试用户', '18699627661', '测试车型', '测试车牌', 'test@example.com', '1990-01-01', '测试数据,用于验证搜索功能', 1]);
echo '<span style="color: green;">✅ 测试数据插入成功</span><br>';
echo '已插入VIP客户: 测试用户 (18699627661)<br>';
} catch(PDOException $e) {
echo '<span style="color: red;">❌ 数据插入失败</span><br>';
echo '错误信息: ' . htmlspecialchars($e->getMessage()) . '<br>';
}
}
// 输出脚本结束
?>
+173
View File
@@ -0,0 +1,173 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>VIP客户功能调试页面</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
max-width: 800px;
margin: 0 auto;
padding: 20px;
color: #333;
}
h1, h2, h3 {
color: #2c3e50;
}
.container {
background: #f9f9f9;
border-radius: 8px;
padding: 20px;
margin-bottom: 20px;
}
.debug-button {
background: #3498db;
color: white;
border: none;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
text-decoration: none;
display: inline-block;
margin-top: 10px;
}
.debug-button:hover {
background: #2980b9;
}
.info-box {
background: #e8f4fc;
border-left: 4px solid #3498db;
padding: 15px;
margin: 15px 0;
}
.warning-box {
background: #fff8e1;
border-left: 4px solid #ffc107;
padding: 15px;
margin: 15px 0;
}
.error-box {
background: #ffeaea;
border-left: 4px solid #e74c3c;
padding: 15px;
margin: 15px 0;
}
code {
background: #eee;
padding: 2px 5px;
border-radius: 3px;
font-family: monospace;
}
table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background: #f2f2f2;
}
</style>
</head>
<body>
<h1>VIP客户功能调试指南</h1>
<div class="container">
<h2>问题分析</h2>
<div class="info-box">
<p>从调试日志可以看出,当搜索手机号 <code>18699627661</code> 时,系统显示 "数据库中VIP客户数: 0",这表明系统无法从数据库中加载到VIP客户数据。</p>
</div>
<h3>可能的原因</h3>
<ul>
<li>数据库连接问题</li>
<li>数据表不存在或结构不正确</li>
<li>表中没有活跃的VIP客户数据</li>
<li>用户提到的手机号不在VIP客户表中</li>
</ul>
</div>
<div class="container">
<h2>调试工具</h2>
<p>请点击下方按钮运行数据库调试脚本,该脚本将帮助您检查:</p>
<ol>
<li>数据库连接配置</li>
<li>数据库连接状态</li>
<li>VIP客户表是否存在</li>
<li>VIP客户表结构</li>
<li>VIP客户数据</li>
<li>特定手机号的查询结果</li>
</ol>
<a href="debug_vip_db.php" class="debug-button" target="_blank">运行数据库调试脚本</a>
</div>
<div class="container">
<h2>常见问题排查步骤</h2>
<h3>1. 检查数据库连接</h3>
<div class="info-box">
<p>确保 <code>config.php</code> 文件中的数据库配置正确:</p>
<ul>
<li>主机地址(通常为 localhost</li>
<li>数据库名(应为 carwash_booking</li>
<li>用户名(通常为 root</li>
<li>密码(可能为空)</li>
</ul>
</div>
<h3>2. 确认数据库表结构</h3>
<div class="info-box">
<p>根据系统代码,VIP客户数据应存储在 <code>vip_customers</code> 表中,而不是用户提到的 <code>vip</code> 表。请确认数据库中是否存在正确的表。</p>
</div>
<h3>3. 验证VIP客户数据</h3>
<div class="warning-box">
<p>从数据库脚本中看,系统已包含3个示例VIP客户,但没有包含手机号 <code>18699627661</code>。您可以通过调试脚本中的功能插入这个手机号作为测试数据。</p>
</div>
<h3>4. 检查get_vip_customers.php</h3>
<div class="info-box">
<p>确保 <code>get_vip_customers.php</code> 文件中的SQL查询正确,它应该查询 <code>vip_customers</code> 表且过滤条件为 <code>is_active = 1</code></p>
</div>
</div>
<div class="container">
<h2>解决方案</h2>
<ol>
<li>运行数据库调试脚本,查看详细的数据库状态</li>
<li>如果表不存在,使用提供的 <code>carwash_db.sql</code> 脚本创建数据库结构</li>
<li>如果数据缺失,通过调试脚本插入测试数据或直接向数据库添加VIP客户</li>
<li>确认手机号格式是否正确,系统会自动移除手机号中的非数字字符</li>
</ol>
<div class="error-box">
<p><strong>注意:</strong>如果您的系统确实使用 <code>vip</code> 表而非 <code>vip_customers</code> 表,您需要修改 <code>get_vip_customers.php</code> 文件中的SQL查询语句,将表名从 <code>vip_customers</code> 更改为 <code>vip</code></p>
</div>
</div>
<div class="container">
<h2>快速修复选项</h2>
<p>如果您确定应该使用 <code>vip</code> 表而非 <code>vip_customers</code> 表,请点击下方按钮更新查询脚本:</p>
<a href="javascript:void(0)" onclick="updateTableQuery()" class="debug-button">更新为使用 vip 表</a>
<p style="margin-top: 20px;">如果您想保持使用 <code>vip_customers</code> 表但需要插入用户提到的手机号作为VIP客户,请点击:</p>
<a href="debug_vip_db.php#insert" class="debug-button" target="_blank">插入测试VIP数据</a>
</div>
<script>
function updateTableQuery() {
if (confirm('这将修改 get_vip_customers.php 文件,将表名从 vip_customers 更改为 vip。确定要继续吗?')) {
// 这里应该有AJAX请求来更新文件
alert('请手动编辑 get_vip_customers.php 文件,将 SQL 查询中的表名从 vip_customers 更改为 vip。');
}
}
</script>
</body>
</html>