что нужно сделать чтобы когда пользователь меняет фонто заменялось изображение на новое но название сохранялось <?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
Чтобы реализовать функциональность, при которой пользователь может менять фон, а название изображения сохраняется, вам нужно внести несколько изменений в ваш код. Основная идея заключается в том, чтобы сохранять имя файла изображения в базе данных, а не просто загружать его в папку. Вот шаги, которые вам нужно выполнить:
Создайте новую таблицу для хранения фонов: Добавьте новую таблицу в вашу базу данных, чтобы хранить информацию о фонах пользователей.
Сохраните имя файла в базе данных: Когда пользователь загружает новое изображение, сохраните имя файла в базе данных.
Загрузите текущее изображение при входе: При входе пользователя загружайте текущее изображение из базы данных.
Вот пример того, как это можно сделать:
Добавьте следующую строку в ваш код, чтобы создать таблицу для хранения фонов:
$db->exec('CREATE TABLE IF NOT EXISTS backgrounds (username TEXT PRIMARY KEY, background_image TEXT)');
Измените часть кода, где вы обрабатываете загрузку изображения, чтобы сохранить имя файла в таблице 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;
}
Когда пользователь входит в систему, вы можете загрузить текущее изображение из базы данных:
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'; // Путь к изображению по умолчанию
}
}
Теперь, когда у вас есть путь к текущему фону, вы можете использовать его в вашем HTML:
<style>
body {
background-image: url('<?php echo isset($currentBackground) ? $currentBackground : 'default_background.jpg'; ?>');
}
</style>
Теперь, когда пользователь загружает новое изображение, оно будет сохраняться в папке user_fon
, а имя файла будет храниться в базе данных. При входе в систему вы сможете загружать текущее изображение и устанавливать его в качестве фона.