PHP скрипт для добавления песен в базу с формой ввода: артист и композиция, с ограничением повторного добавления дублирующей песни. Поддержка голосования за песни, с ограничением по ip-адресу повторного голосования за одну песню.
Для реализации такого функционала нам нужно создать две основные части скрипта: форма для добавления новых песен в базу данных с проверкой дублирования и система голосования с ограничением по IP-адресу. Предположим, что уже существует база данных с таблицами songs
и votes
, как упоминалось ранее.
Структура таблиц
songs
:id
(INT, PK, AUTO_INCREMENT)artist
(VARCHAR)song
(VARCHAR)votes
(INT, DEFAULT 0)votes
:id
(INT, PK, AUTO_INCREMENT)song_id
(INT)ip_address
(VARCHAR)
PHP-скрипт
<?php $host = 'localhost'; $dbname = 'your_database'; $user = 'your_username'; $pass = 'your_password'; try { $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; $pdo = new PDO($dsn, $user, $pass, $options); // Добавление новой песни if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['action']) && $_POST['action'] == 'add_song') { $artist = trim($_POST['artist']); $song = trim($_POST['song']); if ($artist != "" && $song != "") { // Проверяем, есть ли уже такая песня $stmt = $pdo->prepare("SELECT COUNT(*) FROM songs WHERE artist = ? AND song = ?"); $stmt->execute([$artist, $song]); $exists = $stmt->fetchColumn(); if ($exists == 0) { // Добавляем новую песню $stmt = $pdo->prepare("INSERT INTO songs (artist, song) VALUES (?, ?)"); $stmt->execute([$artist, $song]); echo "Песня успешно добавлена!"; } else { echo "Эта песня уже существует в базе данных."; } } else { echo "Пожалуйста, введите имя артиста и название песни."; } } // Голосование за песню if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['action']) && $_POST['action'] == 'vote') { $songId = $_POST['song_id']; $ipAddress = $_SERVER['REMOTE_ADDR']; // Проверяем, голосовал ли этот IP-адрес за эту песню $stmt = $pdo->prepare("SELECT COUNT(*) FROM votes WHERE song_id = ? AND ip_address = ?"); $stmt->execute([$songId, $ipAddress]); $alreadyVoted = $stmt->fetchColumn(); if ($alreadyVoted == 0) { // Если не голосовал, добавляем запись в таблицу голосов $pdo->beginTransaction(); try { // Добавляем запись в таблицу votes $stmt = $pdo->prepare("INSERT INTO votes (song_id, ip_address) VALUES (?, ?)"); $stmt->execute([$songId, $ipAddress]); // Увеличиваем счетчик голосов в таблице songs $stmt = $pdo->prepare("UPDATE songs SET votes = votes + 1 WHERE id = ?"); $stmt->execute([$songId]); $pdo->commit(); echo "Спасибо за ваш голос!"; } catch (Exception $e) { $pdo->rollBack(); echo "Ошибка при голосовании: " . $e->getMessage(); } } else { echo "Вы уже голосовали за эту песню."; } } // Форма для добавления песни echo '<form method="POST">'; echo '<input type="hidden" name="action" value="add_song">'; echo 'Артист: <input type="text" name="artist" required><br>'; echo 'Композиция: <input type="text" name="song" required><br>'; echo '<button type="submit">Добавить песню</button>'; echo '</form><br>'; // Выводим список песен и формы для голосования echo '<h3>Список песен:</h3>'; $stmt = $pdo->query("SELECT id, artist, song, votes FROM songs"); while ($row = $stmt->fetch()) { echo "ID: " . htmlspecialchars($row['id']) . "<br>"; echo "Artist: " . htmlspecialchars($row['artist']) . "<br>"; echo "Song: " . htmlspecialchars($row['song']) . "<br>"; echo "Votes: " . htmlspecialchars($row['votes']) . "<br>"; // Форма для голосования echo '<form method="POST">'; echo '<input type="hidden" name="action" value="vote">'; echo '<input type="hidden" name="song_id" value="' . htmlspecialchars($row['id']) . '">'; echo '<button type="submit">Голосовать</button>'; echo '</form><br>'; } } catch (PDOException $e) { echo "Ошибка подключения: " . $e->getMessage(); } ?>
Объяснение кода:
- Добавление песен: Форма ввода данных о новых песнях с полями для артиста и названия композиции. Перед добавлением проверяется наличие песни в базе данных.
- Голосование: Реализована возможность голосования с проверкой по IP, аналогично предыдущему примеру.
- Управление действиями: Используем скрытое поле
action
для различия между добавлением песен и голосованием в форме обработчика. - Защита от дублирования: Исполняется проверка на наличие одинаковой записи в базе данных перед добавлением новой.
Этот скрипт должен работать в среде, где PHP имеет доступ к серверу MySQL, и должна быть правильно настроена база данных. Убедитесь, что таблицы правильно созданы, а правильные учетные данные вставлены в соответствующие переменные.