PHP скрипт добавления песен в базу с формой ввода: артист и композиция с поддержкой голосования
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, и должна быть правильно настроена база данных. Убедитесь, что таблицы правильно созданы, а правильные учетные данные вставлены в соответствующие переменные.