diff --git a/ajax_handler.php b/ajax_handler.php index 2f7ff21..85d86a3 100644 --- a/ajax_handler.php +++ b/ajax_handler.php @@ -143,7 +143,7 @@ try { $role = $stmt->fetchColumn(); $sender = ($role === 'admin') ? 'admin' : 'user'; - $stmt = $pdo->prepare("INSERT INTO support_messages (user_id, sender, message, is_read) VALUES (?, ?, ?, 0)"); + $stmt = $pdo->prepare("INSERT INTO support_messages (user_id, sender, message, `is_read`) VALUES (?, ?, ?, 0)"); $stmt->execute([$target_user_id, $sender, $message]); echo json_encode(['code' => 0, 'msg' => '已发送']); break; @@ -159,9 +159,9 @@ try { } if ($isAdmin && (int)$target_user_id !== (int)$_SESSION['user_id']) { - $pdo->prepare("UPDATE support_messages SET is_read = 1 WHERE user_id = ? AND sender = 'user'")->execute([$target_user_id]); + $pdo->prepare("UPDATE support_messages SET `is_read` = 1 WHERE user_id = ? AND sender = 'user'")->execute([$target_user_id]); } else if (!$isAdmin) { - $pdo->prepare("UPDATE support_messages SET is_read = 1 WHERE user_id = ? AND sender = 'admin'")->execute([$_SESSION['user_id']]); + $pdo->prepare("UPDATE support_messages SET `is_read` = 1 WHERE user_id = ? AND sender = 'admin'")->execute([$_SESSION['user_id']]); } $stmt = $pdo->prepare("SELECT * FROM support_messages WHERE user_id = ? ORDER BY id ASC"); @@ -177,7 +177,7 @@ try { // Optimized query to get last message reliably $stmt = $pdo->query(" SELECT u.id, u.username, m.message as last_message, m.created_at as last_time, - (SELECT COUNT(*) FROM support_messages WHERE user_id = u.id AND sender = 'user' AND is_read = 0) as unread_count + (SELECT COUNT(*) FROM support_messages WHERE user_id = u.id AND sender = 'user' AND `is_read` = 0) as unread_count FROM users u JOIN (SELECT user_id, MAX(id) as max_id FROM support_messages GROUP BY user_id) last_msg_idx ON u.id = last_msg_idx.user_id JOIN support_messages m ON m.id = last_msg_idx.max_id @@ -195,14 +195,14 @@ try { SELECT m.*, u.username FROM support_messages m JOIN users u ON m.user_id = u.id - WHERE m.sender = 'user' AND m.is_read = 0 + WHERE m.sender = 'user' AND m.`is_read` = 0 ORDER BY m.id DESC LIMIT 1 "); $last_unread = $stmt->fetch(PDO::FETCH_ASSOC); - $total_unread = $pdo->query("SELECT COUNT(*) FROM support_messages WHERE sender = 'user' AND is_read = 0")->fetchColumn(); + $total_unread = $pdo->query("SELECT COUNT(*) FROM support_messages WHERE sender = 'user' AND `is_read` = 0")->fetchColumn(); echo json_encode(['code' => 0, 'unread_total' => $total_unread, 'last_user' => $last_unread['username'] ?? '']); } else { - $stmt = $pdo->prepare("SELECT COUNT(*) FROM support_messages WHERE user_id = ? AND sender = 'admin' AND is_read = 0"); + $stmt = $pdo->prepare("SELECT COUNT(*) FROM support_messages WHERE user_id = ? AND sender = 'admin' AND `is_read` = 0"); $stmt->execute([$_SESSION['user_id']]); echo json_encode(['code' => 0, 'unread_total' => $stmt->fetchColumn()]); } diff --git a/db/schema.sql b/db/schema.sql index d01b773..1f4cefe 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS recharges ( txid VARCHAR(255), status ENUM('pending', 'completed', 'rejected') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users(id) + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS sms_orders ( @@ -29,7 +29,7 @@ CREATE TABLE IF NOT EXISTS sms_orders ( status ENUM('pending', 'received', 'canceled', 'expired') DEFAULT 'pending', expire_at TIMESTAMP NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users(id) + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS settings ( @@ -43,8 +43,9 @@ CREATE TABLE IF NOT EXISTS support_messages ( user_id INT NOT NULL, sender ENUM('user', 'admin') NOT NULL, message TEXT NOT NULL, + is_read TINYINT(1) DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users(id) + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); -- Default Settings @@ -60,4 +61,4 @@ ON DUPLICATE KEY UPDATE setting_value = VALUES(setting_value); -- Default Admin (admin / admin123) INSERT INTO users (username, password_hash, role) VALUES ('admin', '$2y$10$QbKYSCqJI0WQLyf6NNSML.ukYrOZ0MdY61ZpK7Ekn5QQ/A9oDr.hu', 'admin') -ON DUPLICATE KEY UPDATE role = 'admin'; \ No newline at end of file +ON DUPLICATE KEY UPDATE role = 'admin';