Как можно реализовать в PHP бан по IP, если текущий вариант не работает?

Как изменить код для проверки наличия IP-адреса в базе данных и запрета повторной регистрации с выводом ошибки?
  • 4 марта 2024 г. 13:08
Ответы на вопрос 3
Для реализации бана по IP в PHP с проверкой наличия IP-адреса в базе данных и запретом повторной регистрации с выводом ошибки, можно использовать следующий код:

```php
<?php
// Подключение к базе данных
$host = 'localhost';
$dbname = 'your_database';
$username = 'your_username';
$password = 'your_password';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
} catch (PDOException $e) {
    die("Ошибка подключения к базе данных: " . $e->getMessage());
}

// Получение IP-адреса пользователя
$ip = $_SERVER['REMOTE_ADDR'];

// Проверка наличия IP-адреса в базе данных
$stmt = $pdo->prepare("SELECT * FROM banned_ips WHERE ip_address = :ip");
$stmt->bindParam(':ip', $ip);
$stmt->execute();

if ($stmt->rowCount() > 0) {
    die("Ваш IP-адрес заблокирован.");
}

// Проверка наличия IP-адреса при регистрации нового пользователя
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // Получение данных формы регистрации
    $username = $_POST['username'];
    $email = $_POST['email'];
    
    // Проверка наличия IP-адреса в базе данных
    $stmt = $pdo->prepare("SELECT * FROM users WHERE ip_address = :ip");
    $stmt->bindParam(':ip', $ip);
    $stmt->execute();
    
    if ($stmt->rowCount() > 0) {
        die("Вы уже зарегистрированы.");
    }
    
    // Добавление нового пользователя в базу данных
    $stmt = $pdo->prepare("INSERT INTO users (username, email, ip_address) VALUES (:username, :email, :ip)");
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':email', $email);
    $stmt->bindParam(':ip', $ip);
    $stmt->execute();
    
    echo "Пользователь успешно зарегистрирован.";
}
?>
```

В данном коде сначала происходит проверка наличия IP-адреса в таблице `banned_ips`. Если IP-адрес найден, выводится сообщение о блокировке. Затем, при попытке регистрации нового пользователя, происходит проверка наличия IP-адреса в таблице `users`. Если IP-адрес уже присутствует в базе данных, выводится сообщение о том, что пользователь уже зарегистрирован. Если IP-адрес не найден, то происходит добавление нового пользователя в базу данных.

Не забудьте создать таблицы `banned_ips` и `users` в вашей базе данных с необходимыми полями.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$ip = $_SERVER['REMOTE_ADDR'];
$result = $mysqli->query("SELECT * FROM `наша таблица` WHERE `userip` = '$ip' LIMIT 1");
if ($result->num_rows > 0) {
  echo 'Сорян, такой айпишник уже есть в базе';
} else {
  echo 'Ok, регистрирую вас';
}
Эммм, ошибка на столько тупая, что даже не верится... 

Подумайте, во время выполнения запроса чему равна используемая в нём переменная $useip?

И дальше, идёт сравнение $useip с другой переменной $ip, что в этом if() с чем сравнивается?

P.S. Да банальнейший var_dump($ip, $useip) перед if() раскроет всю глубину глупости!
Похожие вопросы