Команды бота

    Редактирование файла

    Создать автоматизацию

    Создать правило автоотправки

    Переслать сообщение в...

    • Загрузка списка групп...

    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();
    }
    ?>

    Объяснение кода:

    1. Добавление песен: Форма ввода данных о новых песнях с полями для артиста и названия композиции. Перед добавлением проверяется наличие песни в базе данных.
    2. Голосование: Реализована возможность голосования с проверкой по IP, аналогично предыдущему примеру.
    3. Управление действиями: Используем скрытое поле action для различия между добавлением песен и голосованием в форме обработчика.
    4. Защита от дублирования: Исполняется проверка на наличие одинаковой записи в базе данных перед добавлением новой.

    Этот скрипт должен работать в среде, где PHP имеет доступ к серверу MySQL, и должна быть правильно настроена база данных. Убедитесь, что таблицы правильно созданы, а правильные учетные данные вставлены в соответствующие переменные.

    Edit Message

    Attachments:

    AI Assistant

    Enter your instruction to edit the text: