PHP скрипт вывода песен из базы данных с возможностью за них голосовать 1 раз с одного ip-адреса
Чтобы реализовать функциональность голосования за песни с ограничением в один голос для каждого IP-адреса, можно использовать PHP и MySQL. Основная идея в том, чтобы хранить информацию о том, какие IP-адреса уже проголосовали за каждую песню. Для этого мы создадим дополнительную таблицу для хранения этих данных.
Допустим, у нас есть две таблицы: songs и votes. Структура таблиц может быть следующей:
songs:id,artist,song,votesvotes: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-адресам могут быть обойдены технически подкованными пользователями, поэтому в реальных приложениях могут потребоваться дополнительные меры для предотвращения накруток голосов.