Implementing User Background Change with Image Name Retention

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();
exit;

}

if ($_SERVER['REQU

Answer:

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

  1. Создайте новую таблицу для хранения фонов: Добавьте новую таблицу в вашу базу данных, чтобы хранить информацию о фонах пользователей.

  2. Сохраните имя файла в базе данных: Когда пользователь загружает новое изображение, сохраните имя файла в базе данных.

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

Вот пример того, как это можно сделать:

Шаг 1: Создание таблицы для фонов

Добавьте следующую строку в ваш код, чтобы создать таблицу для хранения фонов:

$db->exec('CREATE TABLE IF NOT EXISTS backgrounds (username TEXT PRIMARY KEY, background_image TEXT)');

Шаг 2: Сохранение имени файла в базе данных

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

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('INSERT OR REPLACE INTO backgrounds (username, background_image) VALUES (:username, :background_image)');
                $stmt->bindValue(':username', $username, SQLITE3_TEXT);
                $stmt->bindValue(':background_image', $backgroundPath, 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 (isset($_SESSION['username'])) {
    $username = $_SESSION['username'];
    $stmt = $db->prepare('SELECT background_image FROM backgrounds WHERE username = :username');
    $stmt->bindValue(':username', $username, SQLITE3_TEXT);
    $result = $stmt->execute()->fetchArray(SQLITE3_ASSOC);

    if ($result) {
        $currentBackground = $result['background_image'];
    } else {
        $currentBackground = 'default_background.jpg'; // Путь к изображению по умолчанию
    }
}

Шаг 4: Отображение фона на странице

Теперь, когда у вас есть путь к текущему фону, вы можете использовать его в вашем HTML:

<style>
    body {
        background-image: url('<?php echo isset($currentBackground) ? $currentBackground : 'default_background.jpg'; ?>');
    }
</style>

Заключение

Теперь, когда пользователь загружает новое изображение, оно будет сохраняться в папке user_fon, а имя файла будет храниться в базе данных. При входе в систему вы сможете загружать текущее изображение и устанавливать его в качестве фона.