[RESOLU] Vérifier adresse IP

hikaru-59
Invité n'ayant pas de compte PHPfrance

22 avr. 2021, 15:45

Bonjour,
J'aimerais vérifier par l'adresse IP qu'une personne n'a pas déjà accédé à une page.
Voici mon code :

Code : Tout sélectionner

$logfilename = "controle-ip.log"; touch($logfilename); // Crée le fichier s'il n'existe pas, sinon modifie juste la date de dernier accès $ip = $_SERVER['REMOTE_ADDR']; // $file = ['127.0.0.1', '7.0.0.4', '17.0.0.2']; // Pour le test, ça marche $file = file($logfilename); // file() lit un fichier et renvoie le résultat dans un tableau if (in_array($ip, $file)) { /* On vérifie si $ip est dans le tableau $file */ echo '<h2>Vous avez déjà participé !</h2>'; exit(); // Si votre IP est déjà présente, on bloque } else { echo '<h2>Merci !</h2>'; array_push($file, $ip."\n"); // Empile à la fin du tableau $file } $nb_lines = count($file); // Compter nb lignes if ($nb_lines > 1000) { unset($file[0]); // Supprime la première ligne si le nb de lignes est supérieur à 1000. C'est pour éviter d'avoir un fichier log trop lourd } file_put_contents($logfilename, $file); // Écrit des données dans un fichier. Revient à appeler les fonctions fopen(), fwrite() et fclose() successivement.
Je n'arrive pas à bloquer les IP déjà utilisé.

Par contre, si je crée un tableau manuellement pour tester, alors ça marche :

Code : Tout sélectionner

$file = ['127.0.0.1', '7.0.0.4', '17.0.0.2'];
Le problème vient de la fonction file() ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 avr. 2021, 11:54

Utilise var_dump() pour voir le contenu de tes variables, notamment $file
Et vérifie ce que contient ton fichier de log en l'ouvrant simplement avec un éditeur de texte, car je suis pas sûr du comportement de file_put_contents() en mettant un tableau en paramètre plutôt qu'une chaine de caractère.
Tu auras besoin peut être de faire un implode() en indiquant "\n" comme séparateur (qui équivaut à un retour à la ligne)
Quand tout le reste a échoué, lisez le mode d'emploi...

hikaru-59
Invité n'ayant pas de compte PHPfrance

23 avr. 2021, 12:56

J'ai déjà fait var_dump() sur $file :

Code : Tout sélectionner

array(3) { [0]=> string(10) "127.0.0.1" [1]=> string(10) "127.0.0.1" [2]=> string(10) "127.0.0.1" }
Il y a bien les IP inscrit dans un tableau comme je voulais.

En ouvrant le fichier controle-ip.log avec un éditeur de texte, j'ai bien :
127.0.0.1
127.0.0.1
127.0.0.1

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 avr. 2021, 14:56

Du coup fait un var_dump(in_array($ip, $file)) pour vérifier ce que te renvoie ta condition
Quand tout le reste a échoué, lisez le mode d'emploi...

hikaru-59
Invité n'ayant pas de compte PHPfrance

23 avr. 2021, 19:34

Il retourne "false" tout le temps. C'est comme s'il ne trouve pas '127.0.0.1' dans le tableau $file.

Pourtant mon adresse IP 127.0.0.1 est bien dans le tableau $file.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

23 avr. 2021, 20:38

Et que te retourne :
var_dump($ip, $file, in_array($ip, $file))
Quand tout le reste a échoué, lisez le mode d'emploi...

hikaru-59
Invité n'ayant pas de compte PHPfrance

23 avr. 2021, 23:36

Ah oui, j'ai compris :

Code : Tout sélectionner

var_dump($ip); // string(9) "127.0.0.1"

Code : Tout sélectionner

var_dump($file); // /* array(3) { // [0]=> // string(10) "127.0.0.1 // " // [1]=> // string(10) "127.0.0.1 // " // [2]=> // string(10) "127.0.0.1 // " // } // */
Dans le tableau, c'est des chaines de 10 caractères (soit une de plus) à cause du saut de ligne.
Il suffit que je fasse ça :

Code : Tout sélectionner

if (in_array($ip."\n", $file)) { echo '<h2>Vous avez déjà envoyé un message !</h2>'; exit; }
Et ça marche ! Merci !

J'ai aussi pensé à faire une boucle foreach qui marche aussi si j'utilise trim() :

Code : Tout sélectionner

foreach ($file as $ip_recup) { if (trim($ip_recup) === $ip) { echo '<h2>Vous avez déjà envoyé un message !</h2>'; exit; } }
Je préfère la méthode in_array() qui n'a pas besoin de boucle.