feat: 添加VIP客户调试页面和数据库调试脚本
添加VIP客户功能调试页面(vip_debug_page.html)和配套的数据库调试脚本(debug_vip_db.php),用于帮助排查VIP客户数据查询问题。调试页面提供问题分析、常见排查步骤和解决方案,调试脚本可验证数据库连接、检查表结构和数据状态。 页面包含以下功能: 1. 数据库连接测试 2. VIP表结构检查 3. 活跃VIP客户数据查询 4. 特定手机号查询 5. 测试数据插入功能
This commit is contained in:
@@ -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>';
|
||||
}
|
||||
}
|
||||
|
||||
// 输出脚本结束
|
||||
?>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user