View file messages/get_messages_ajax.php

File size: 2.22Kb
<?php
/**
 * CMS: LaiCMS (v1.0 Edition 2026)
 * File: messages/get_messages_ajax.php
 * Оптимизация: PHP 7.4+, Security Patch, Prepared Statements.
 */

declare(strict_types=1);

require_once '../system/db.php';
require_once '../system/functions.php';

// 1. Проверка сессии (безопасность)
$my_id = (int)($_SESSION['user_id'] ?? 0);
if (!$my_id) {
    exit('Unauthorized');
}

// 2. Получение и фильтрация ID собеседника
$opp_id = (int)($_GET['opp_id'] ?? 0);
if ($opp_id <= 0) {
    exit('Invalid User ID');
}

/** * 3. ПОДГОТОВЛЕННЫЙ ЗАПРОС (Prepared Statement)
 * Защищает от SQL-инъекций. Выбираем историю переписки между двумя пользователями.
 * Лимит 100 последних сообщений.
 */
$stmt = $mysqli->prepare("
    SELECT sender_id, message, file_path, created_at 
    FROM messages 
    WHERE (sender_id = ? AND receiver_id = ?) 
       OR (sender_id = ? AND receiver_id = ?) 
    ORDER BY created_at ASC 
    LIMIT 100
");

$stmt->bind_param("iiii", $my_id, $opp_id, $opp_id, $my_id);
$stmt->execute();
$history = $stmt->get_result();

/**
 * 4. ЦИКЛ ВЫВОДА СООБЩЕНИЙ
 */
while ($m = $history->fetch_assoc()): 
    // Определяем, является ли текущий пользователь отправителем
    $is_me = ((int)$m['sender_id'] === $my_id);
?>
    <div class="bubble <?= $is_me ? 'me' : 'opp' ?>">
        
        <?php if (!empty($m['file_path'])): ?>
            <a href="<?= htmlspecialchars($m['file_path']) ?>" target="_blank" class="chat-file" style="display:block; margin-bottom: 5px; text-decoration: underline;">
                <i class="fa-solid fa-file-arrow-down"></i> Файл вложения
            </a>
        <?php endif; ?>

        <div class="message-text">
            <?= nl2br(htmlspecialchars((string)$m['message'])) ?>
        </div>

        <span style="font-size: 0.65rem; display:block; opacity: 0.6; text-align: right; margin-top: 4px;">
            <?= date('H:i', strtotime($m['created_at'])) ?>
        </span>
    </div>
<?php endwhile; 

// Закрываем запрос
$stmt->close();
?>