Update User Background Handling in PHP Code

Answered using OpenAI o1 preview by OpenAI o1

Question:

есть проблема если он заменить он после обновления страницы старый становица

дай только тот код что нужно добавить, изменить ,удалить,

<?php $dir = 'user_fon'; if (!is_dir($dir)) { mkdir($dir, 0755, true); } // Устанавливаем время жизни сессионного cookie в 30 дней (60 * 60 * 24 * 30 секунд) session_set_cookie_params([ 'lifetime' => 60 * 60 * 24 * 30, // 30 дней 'path' => '/', 'domain' => '', // Использовать текущий домен 'secure' => isset($_SERVER['HTTPS']), // Использовать secure cookie, если работаете по HTTPS 'httponly' => true, // Защита от XSS 'samesite' => 'Lax' // Защита от CSRF атак ]); session_start(); $db = new SQLite3('6rrhysRbnmKkEP546FDsWCXJyM1MWGqBBFMZjpdH0Ei9YQth2LsqVegEkanNKtzD.sqlite'); $db->exec('CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, username TEXT UNIQUE, password TEXT)'); $db->exec('CREATE TABLE IF NOT EXISTS bookmarks (id INTEGER PRIMARY KEY, url TEXT, name TEXT, username TEXT)'); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['background'])) { if ($_FILES['background']['error'] == UPLOAD_ERR_OK) { $username = $_SESSION['username']; $allowedMimeTypes = ['image/jpeg', 'image/png']; $mimeType = $_FILES['background']['type']; // Получаем MIME-тип напрямую из $_FILES if (in_array($mimeType, $allowedMimeTypes)) { $extension = $mimeType === 'image/png' ? '.png' : '.jpg'; $backgroundPath = 'user_fon/' . $username . '_' . uniqid() . $extension; if (move_uploaded_file($_FILES['background']['tmp_name'], $backgroundPath)) { echo json_encode(['status' => 'success', 'url' => $backgroundPath]); } else { echo json_encode(['status' => 'error', 'message' => 'Ошибка при загрузке файла']); } } else { echo json_encode(['status' => 'error', 'message' => 'Недопустимый тип файла']); } } else { echo json_encode(['status' => 'error', 'message' => 'Ошибка при загрузке файла']); } exit; } function generateUUID() { return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0x0fff) | 0x4000, mt_rand(0, 0x3fff) | 0x8000, mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); } function encryptPassword($password, $key) { return hash('sha256', $password . $key); } $decoderKey = 'KR5UH7WR7G8A9N1ZDBE8MTPA2KQ8TVA6'; if (isset($_POST['login'])) { $username = $_POST['username']; $password = encryptPassword($_POST['password'], $decoderKey); $stmt = $db->prepare('SELECT * FROM users WHERE username = :username'); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $result = $stmt->execute()->fetchArray(SQLITE3_ASSOC); if ($result && $password == $result['password']) { $_SESSION['username'] = $username; header("Location: bookmarks.php"); exit(); } else { echo "<script>alert('" . htmlspecialchars('Неверное имя пользователя или пароль', ENT_QUOTES, 'UTF-8') . "');</script>"; } } // Обработка перехода на страницу lewpol.php if (isset($_POST['goto_bookmarks'])) { header("Location: lewpol.php"); exit(); } if (isset($_POST['logout'])) { session_unset(); session_destroy(); header("Location: bookmarks.php"); exit(); } if (isset($_POST['register'])) { $username = $_POST['username']; $password = encryptPassword($_POST['password'], $decoderKey); $stmt = $db->prepare('SELECT * FROM users WHERE username = :username'); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $result = $stmt->execute()->fetchArray(SQLITE3_ASSOC); if ($result) { echo "<script>alert('Имя пользователя уже занято');</script>"; } else { $stmt = $db->prepare('INSERT INTO users (id, username, password) VALUES (:id, :username, :password)'); $stmt->bindValue(':id', generateUUID(), SQLITE3_TEXT); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->bindValue(':password', $password, SQLITE3_TEXT); try { $stmt->execute(); echo "<script>alert('Регистрация прошла успешно');</script>"; } catch (Exception $e) { echo "<script>alert('Ошибка при регистрации');</script>"; } } } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['username'])) { $data = json_decode(file_get_contents('php://input'), true); $username = $_SESSION['username']; if (isset($data['action'])) { switch ($data['action']) { case 'add': if (isset($data['url']) && isset($data['name'])) { $stmt = $db->prepare("INSERT INTO bookmarks (url, name, username) VALUES (:url, :name, :username)"); $stmt->bindValue(':url', $data['url'], SQLITE3_TEXT); $stmt->bindValue(':name', $data['name'], SQLITE3_TEXT); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->execute(); echo json_encode(['status' => 'success']); } break; case 'update': if (isset($data['index']) && isset($data['url']) && isset($data['name'])) { $stmt = $db->prepare("UPDATE bookmarks SET url = :url, name = :name WHERE id = :id AND username = :username"); $stmt->bindValue(':url', $data['url'], SQLITE3_TEXT); $stmt->bindValue(':name', $data['name'], SQLITE3_TEXT); $stmt->bindValue(':id', $data['index'], SQLITE3_INTEGER); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->execute(); echo json_encode(['status' => 'success']); } break; case 'delete': if (isset($data['index'])) { $stmt = $db->prepare("DELETE FROM bookmarks WHERE id = :id AND username = :username"); $stmt->bindValue(':id', $data['index'], SQLITE3_INTEGER); $stmt->bindValue(':username', $username, SQLITE3_TEXT); $stmt->execute(); echo json_encode(['status' => 'success']); } break; case 'move_up': if (isset($data['index'])) { $currentId = $data['index']; $result = $db->query("SELECT * FROM bookmarks WHERE id = $currentId"); $currentBookmark = $result->fetchArray(SQLITE3_ASSOC); $previousResult = $db->query("SELECT * FROM bookmarks WHERE id < $currentId ORDER BY id DESC LIMIT 1"); $previousBookmark = $previousResult->fetchArray(SQLITE3_ASSOC); if ($previousBookmark) { $db->exec("BEGIN"); $db->exec("UPDATE bookmarks SET id = -1 WHERE id = $currentId"); $db->exec("UPDATE bookmarks SET id = $currentId WHERE id = " . $previousBookmark['id']); $db->exec("UPDATE bookmarks SET id = " . $previousBookmark['id'] . " WHERE id = -1"); $db->exec("COMMIT"); echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'no_previous']); } } break; case 'move_down': if (isset($data['index'])) { $currentId = $data['index']; $result = $db->query("SELECT * FROM bookmarks WHERE id = $currentId"); $currentBookmark = $result->fetchArray(SQLITE3_ASSOC); $nextResult = $db->query("SELECT * FROM bookmarks WHERE id > $currentId ORDER BY id ASC LIMIT 1"); $nextBookmark = $nextResult->fetchArray(SQLITE3_ASSOC); if ($nextBookmark) { $db->exec("BEGIN"); $db->exec("UPDATE bookmarks SET id = -1 WHERE id = $currentId"); $db->exec("UPDATE bookmarks SET id = $currentId WHERE id = " . $nextBookmark['id']); $db->exec("UPDATE bookmarks SET id = " . $nextBookmark['id'] . " WHERE id = -1"); $db->exec("COMMIT"); echo json_encode(['status' => 'success']); } else { echo json_encode(['status' => 'no_next']); } } break; case 'upload_background': if (isset($_FILES['background'])) { // Проверка MIME-типа файла $allowedMimeTypes = ['image/jpeg', 'image/png']; $finfo = finfo_open(FILEINFO_MIME_TYPE); $mimeType = finfo_file(finfo, $_FILES['background']['tmp_name']); finfo_close(finfo); if (in_array($mimeType, $allowedMimeTypes)) { $username = $_SESSION['username']; $backgroundPath = 'user_fon/' . $username . '_' . uniqid() . '.jpg'; if (move_uploaded_file($_FILES['background']['tmp_name'], $backgroundPath)) { echo json_encode(['status' => 'success', 'url' => $backgroundPath]); } else { echo json_encode(['status' => 'error']); } } else { echo json_encode(['status' => 'error', 'message' => 'Недопустимый тип файла']); } } else { echo json_encode(['status' => 'error']); } break; } } if (isset($_SESSION['username'])) { $stmt = $db->prepare('SELECT * FROM bookmarks WHERE username = :username'); $stmt->bindValue(':username', $_SESSION['username'], SQLITE3_TEXT); $result = $stmt->execute(); $bookmarks = []; while ($row = $result->fetchArray(SQLITE3_ASSOC)) { $bookmarks[] = $row; } } else { $bookmarks = []; } $db->close(); ex
Answer:

Чтобы решить проблему с тем, что после обновления страницы старый фон остается, вам нужно убедиться, что вы обновляете фон пользователя в сессии или в базе данных. В вашем коде есть несколько мест, где можно внести изменения. Вот что нужно сделать:

  1. Сохранение пути к фону в базе данных: Добавьте поле для хранения пути к фону в таблице users.

  2. Обновление пути к фону после загрузки: После успешной загрузки нового фона обновите соответствующее поле в базе данных.

  3. Загрузка фона при входе в систему: При входе в систему загружайте путь к фону из базы данных и устанавливайте его в сессии.

Вот изменения, которые нужно внести:

1. Измените создание таблицы users:

$db->exec('CREATE TABLE IF NOT EXISTS users (id TEXT PRIMARY KEY, username TEXT UNIQUE, password TEXT, background TEXT)');

2. Обновите код загрузки фона:

Замените этот блок кода:

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['background'])) {
    // ... ваш код ...
    if (move_uploaded_file($_FILES['background']['tmp_name'], $backgroundPath)) {
        echo json_encode(['status' => 'success', 'url' => $backgroundPath]);
    }
    // ...
}

На следующий:

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['background'])) {
    if ($_FILES['background']['error'] == UPLOAD_ERR_OK) {
        $username = $_SESSION['username'];
        $allowedMimeTypes = ['image/jpeg', 'image/png'];
        $mimeType = $_FILES['background']['type'];

        if (in_array($mimeType, $allowedMimeTypes)) {
            $extension = $mimeType === 'image/png' ? '.png' : '.jpg';
            $backgroundPath = 'user_fon/' . $username . '_' . uniqid() . $extension;

            if (move_uploaded_file($_FILES['background']['tmp_name'], $backgroundPath)) {
                // Обновляем путь к фону в базе данных
                $stmt = $db->prepare('UPDATE users SET background = :background WHERE username = :username');
                $stmt->bindValue(':background', $backgroundPath, SQLITE3_TEXT);
                $stmt->bindValue(':username', $username, SQLITE3_TEXT);
                $stmt->execute();

                echo json_encode(['status' => 'success', 'url' => $backgroundPath]);
            } else {
                echo json_encode(['status' => 'error', 'message' => 'Ошибка при загрузке файла']);
            }
        } else {
            echo json_encode(['status' => 'error', 'message' => 'Недопустимый тип файла']);
        }
    } else {
        echo json_encode(['status' => 'error', 'message' => 'Ошибка при загрузке файла']);
    }
    exit;
}

3. Загрузка фона при входе в систему:

Добавьте следующий код после успешного входа в систему:

if ($result && $password == $result['password']) {
    $_SESSION['username'] = $username;
    $_SESSION['background'] = $result['background']; // Сохраняем путь к фону в сессии
    header("Location: bookmarks.php");
    exit();
}

4. Убедитесь, что фон загружается на странице:

На странице, где вы отображаете фон, добавьте следующий код, чтобы установить фон:

if (isset($_SESSION['background'])) {
    echo '<style>body { background-image: url("' . htmlspecialchars($_SESSION['background'], ENT_QUOTES, 'UTF-8') . '"); }</style>';
}

Эти изменения помогут вам сохранить и отображать новый фон после обновления страницы.