Чтобы реализовать функциональность голосования за песни с ограничением в один голос для каждого IP-адреса, можно использовать PHP и MySQL. Основная идея в том, чтобы хранить информацию о том, какие IP-адреса уже проголосовали за каждую песню. Для этого мы создадим дополнительную таблицу для хранения этих данных.
Допустим, у нас есть две таблицы: songs
и votes
. Структура таблиц может быть следующей:
songs
:id
,artist
,song
,votes
votes
:id
(PK),song_id
,ip_address
Ниже представлен пример кода, который реализует эту функциональность:
<?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['song_id'])) { $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 "Вы уже голосовали за эту песню."; } } // Выводим список песен и формы для голосования $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="song_id" value="' . htmlspecialchars($row['id']) . '">'; echo '<button type="submit">Голосовать</button>'; echo '</form><br>'; } } catch (PDOException $e) { echo "Ошибка подключения: " . $e->getMessage(); } ?>
Объяснение кода:
- Подключение к базе данных: Используем PDO для безопасного подключения к MySQL.
- Обработка формы: Проверяем, что запрос является POST и содержится идентификатор песни. Получаем IP-адрес пользователя.
- Проверка голосования: Запрос проверяет, голосовал ли IP-адрес за указанную песню. Если нет, добавляем запись в таблицу
votes
и увеличиваем счетчик голосов для песни. - Обработка ошибок: Используем транзакции для предотвращения неконсистентности данных.
- Вывод песен и форм голосования: Получаем список песен и для каждой создаем форму голосования.
Этот код обеспечивает базовую обработку голосов с проверкой по IP. Обратите внимание, что ограничения по IP-адресам могут быть обойдены технически подкованными пользователями, поэтому в реальных приложениях могут потребоваться дополнительные меры для предотвращения накруток голосов.