Enregistrer IP dans la bdd [Résolu]

Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
- - Dernière réponse : yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
- 3 févr. 2019 à 22:05
Bonjour,
Je tente d'enregistré l'Ip des visiteurs de mon site mais je galère un peu...
J'ai réussi à copier l'adresse IP mais comment l'envoyer sur ma BDD?

Voici le code que j'ai utilisé pour récupérer l'adresse IP et l'écrire sur la page (durant les tests):
<?php
    /**
     * Récupérer la véritable adresse IP d'un visiteur
     */
    function get_ip() {
    	// IP si internet partagé
    	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    		return $_SERVER['HTTP_CLIENT_IP'];
    	}
    	// IP derrière un proxy
    	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    		return $_SERVER['HTTP_X_FORWARDED_FOR'];
    	}
    	// Sinon : IP normale
    	else {
    		return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
    	}
    }
    ?>
          <?php
    // Afficher l'adresse IP
    echo 'Adresse IP du visiteur : '.get_ip();
    ?>


Merci d'avance pour les éclaircissement :)

Configuration: Windows / Firefox 64.0
Afficher la suite 

4 réponses

Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435
0
Merci
bonjour, as-tu créé ta base de données et la table pour y enregistrer les adresses?
as-tu de l'expérience dans l'utilisation de bases de données à partir de PHP?
recherche-tu des exercices dans ce domaine?
ne serait-il pas préférable de d'abord finaliser ceci?
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
J'ai une base de donnée crée où il y a déjà quelques users et mots de passe. J'ai ajouté un colonne pour les IP.
Je suis novice mais j'ai déjà crée une ou deux bdd pour les clients. La bdd où je veux enregistrer l'IP a été faites par un professionnel.
Je cherche juste à savoir s'il y a un code à mettre pour enregistrer les adresses ip dans ma bdd. Il y a t'il un code à mettre?

Mon sujet précédent est 'résolu'... En raison du peu de temps que je possède pour réaliser le tout, j'ai du changer d'option et j'ai sécurisé le tout autrement. Je vais donc le mettre ''résolu''.
Commenter la réponse de yg_be
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1829
0
Merci
Bonjour,

Tout dépend... soit tu utilises PDO soit mysqli pour établir la connexion entre ton script PHP et la BDD
http://www.commentcamarche.net/faq/44117-connexion-a-une-base-avec-pdo-mysqli

Puis ensuite, une requête SQL de type INSERT si c'est pour ajouter une ligne dans la table .. ou UPDATE si c'est pour la mettre à jour....


yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
donc le code php devrait simplement faire INSERT ou UPDATE au bon moment.
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
Voici ma page de connexion:
<?php include('haut.php'); ?> <!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>Connexion</title>

        <style>
            body {background: rgba(64,212,126,1.0); margin: 1%}
			p {text-align: center;}
          
        	header 
        	{
        		height: 210px;
        		border: 2px solid black;
        		text-align: center;
        		padding: 10px;
        		margin: 20px;
        	}

            table
            {
                text-align: center;
                margin: auto;
                width: 50%;
            }        	

            ul#menu_horizontal li 
            { 
                display : inline;
                padding : 0 0.5em;
                border: 1px black;
            }

			ul#menu_horizontal {list-style-type : none; }
			a {border: 1px blue;}
          
          /*Style pour le bas de page*/
          	ul#menu_horizontal_bas li 
            { 
                display : inline;
                padding : 0 0.5em;
                border: 1px black;
            }

            ul#menu_horizontal_bas {list-style-type : none;}
          	footer {margin: 20px; border: 2px solid black; padding: 5px;}

        	.bas
        	{
        		height: 100px; 		
        		text-align: center;
        		width: 95%;
        	}           
        </style>

    </head>
    <body>
    	<header>
        <br>
        	<h1>Bienvenue sur le site de Guillaume.B</h1>
          	<h2>Connexion:</h2>

            <ul id="menu_horizontal">
            <?php
                if(isset($_SESSION['user'])){
            ?>
                <li><a href="update-password.php">Changer mot de passe</a></li>
            <?php
                }
            ?>
            
            <li><a style="color: black" href="connexion.php">Me <?php if(isset($_SESSION['user'])){echo"dé";}?>connecter</a></li>
            <li><a style="color: blue" href="contactadm.php">Contacter l'administrateur</a></li>
            </ul>
        </header>
        <br>
      <img align="left" src="connexion.png"
           alt="[ABC Tech posssède 75% de part de marché et XYZ 25%]"
           height="400px" 
           width="100px"
           margin-left="20px"
           >
      
      <img align="right" src="connexion.png"
           alt="[ABC Tech posssède 75% de part de marché et XYZ 25%]"
           height="400px" 
           width="100px"
           margin-right="20px"
           >
      <br>
        <?php
            if(isset($_SESSION['user'])) {
                session_unset();
                session_destroy();
                header('Location: accueil.php'); 
            } else {
                if(!empty($_POST)) {
                    // Tentative de connexion
                    $valid=true;
                    if(!isset($_POST['username']) || empty($_POST['username'])) {
                        echo "<div class='bandeau bandeau-error'>Merci de renseigner votre identifiant.</div>";
                        $valid=false;
                    }
                    if(!isset($_POST['password']) || empty($_POST['password'])) {
                        echo "<div class='bandeau bandeau-error'>Merci de renseigner votre mot de passe.</div>";
                        $valid=false;
                    }
    
                    if($valid) {
                        $username = htmlspecialchars($_POST['username']);
                        $password = htmlspecialchars($_POST['password']);
                        $result = test_connexion($dbh, $username, $password);
                        if(count($result)>=1){
                            $user_infos = $result[0];
                            $_SESSION["user"]=$user_infos;                            
                            header('Location: accueil.php'); 
                            echo "u";
                        } else {
                            echo "<div class='bandeau bandeau-error'>Identifiants incorrects.</div>";
                        }
                    }
                }
            }
        ?>
      	<?php 
     // Récupérer la véritable adresse IP d'un visiteur
    function get_ip() {
    	// IP si internet partagé
    	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    		return $_SERVER['HTTP_CLIENT_IP'];
    	}
    	// IP derrière un proxy
    	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    		return $_SERVER['HTTP_X_FORWARDED_FOR'];
    	}
    	// Sinon : IP normale
    	else {
    		return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
    	}
    }
    ?>
          <?php
    // Afficher l'adresse IP pour le moment
    echo 'Adresse IP du visiteur : '.get_ip();
    ?>
        <table border=1 width=100% align="center" cellspacing=0 cellpadding=0 >
            <tr>
                <td width="100%"><h3>Me connecter:</h3>
                <form method="POST" action="connexion.php">
                    <input type="text" name="username" placeholder="Identifiant" required/>
                    <input type="password" name="password" placeholder="Mot de passe" required/>
                    <input type="submit" value="Connexion" /><br /><br />
                </form>
            </td>
        </table>
      <br>
      <p>Vous avez besoin d'accéder aux données mais vous ne possédez pas de compte? <a style="color: blue" href="contactadm.php">Contacter l'administrateur</a><br>
      <br>
      <p>Si vous avez oublié votre identifiant et/ou votre mot de passe, veuillez <a style="color: blue" href="contactadm.php">contacter l'administrateur.</a></p><br>
      <br>
      <p>Une page d'inscription sera disponible ultérieurement.</p>
      <br>
      <br>
      <br>
      <br>
      <br>
      <footer>
      <table id="bas" align="center" margin-bottom= 600px cellspacing=0 cellpadding=0><tr><td>
      <p>Site développé par Guillaume.B, 2019, toute copie interdite sans autorisation.<p>
      	<ul id="menu_horizontal_bas">      
      		<li><a href="contactadm.php">Contacter l'administrateur</a></li>
          	<li><a href="mentionslegales.php">Mentions légales</a></li>
      	</ul>
      </td></tr></table>
      </footer>
    </body>
</html>


Voici ma page ''haut.php'':
<?php
    ob_start();
    session_start();
    $current_page = basename($_SERVER['PHP_SELF']);
    if($current_page !="index.php" && $current_page != "connexion.php" && !isset($_SESSION['user'])) {
        header('Location: connexion.php'); 
    }
?>

<?php
    $host = 'db769901296.hosting-data.io';
    $database = 'db769901296';
    $username = 'dbo769901296';
    $password = 'MON MDP';
    try {
        $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();
    }

    function test_connexion($dbh, $username, $password) {
        $stmt = $dbh->prepare("SELECT * FROM users WHERE username=:username AND password=:password");
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':password', md5($password));
        $stmt->execute();
        $row = $stmt->fetchAll(); // return false
        return $row;
    }

    function add_user($dbh, $username, $password, $adresse_ip) {
        try {
            $stmt = $dbh->prepare("INSERT INTO users (username, password, role, adresse_ip) VALUES(:username, :password, 1, :adresse_ip)");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':password', md5($password));
          	$stmt->bindParam(':adresse_ip', $adresse_ip);
            $stmt->execute();
            return false;
        } catch(Exception $e) {
            return false;
        }
    }    

    function update_password($dbh, $username, $password, $adresse_ip) {
        try {
            $stmt = $dbh->prepare("UPDATE users SET password=:password, adresse_ip=:adresse_ip WHERE username=:username");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':password', md5($password));
          	$stmt->bindParam(':adresse_ip', $adresse_ip);
            $stmt->execute();
            return true;
        } catch(Exception $e) {
            return false;
        }
    }
?>


Je ne pas où je dois mettre INSERT dans ma page de connexion...
Merci pour vos aides...
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
je ne me souviens pas avoir lu où tu avais ajouté une colonne pour les IP.
est-ce toi qui a écrit ce code php, le comprends-tu?
où dans ton code souhaites-tu enregistrer l'IP? peut-être dans le cas où le mot de passe est correct?
tu pourrais créer une fonction update_IP(), inspirée de update_password(), et l’appeler au bon moment.
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
> yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
-
J'ai crée un colonne pour les IP dans ma bdd (table: users).
Ce code a été écrit par un professionnel et révisé par moi-même pour l'adapter à mes besoins. J'ai utilisé ces codes à plusieurs reprises donc je le comprends presque complètement...

Je souhaite enregistrer IP au moment il clique sur le bouton pour se connecter ou au moment où il est redirigé... Seulement si la connexion est réussie.
Ajouter $adresse_ip dans la fonction add_users et update_password n'est donc pas la bonne solution? Je dois recréer une nouvelle fonction?
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
où dans ton code PHP souhaites-tu enregistrer l'IP?
tu expliques "quand" du point de vue de l'utilisateur.
moi je te demande à quelle ligne dans le code PHP, du point de vue du développeur.
à quoi cela sert-il d'ajouter l'adresse dans les fonctions add_users et update_password? penses-tu que ces fonctions sont appelées au moment où l'utilisateur clique sur le bouton pour se connecter?
Commenter la réponse de jordane45
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
0
Merci
Vers la ligne 140 où j'ai déjà commencé... Mais qu'est ce que cela change?

J'avais mis l'adresse ip dans add_users pour l'enregistrer quand ils s'inscrivent. Mais avec cela j'aurais peut être pu l'avoir juste lors de la création du compte et non pas à chaque connexion...
Donc je dois créer une nouvelle fonction (update_IP) de ce genre là?

    function update_IP($dbh, $username, $adresse_ip) {
        try {
            $stmt = $dbh->prepare("UPDATE users SET adresse_ip=:adresse_ip WHERE username=:username");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':adresse_ip', $adresse_ip);
            $stmt->execute();
            return true;
        } catch(Exception $e) {
            return false;
        }
    }
?>
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
> jordane45
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
-
Voici mon code, que dois-je ajouter et/ou modifier pour que cela fonctionne car la quand je me connecte il n'y a aucune adresse ip dans ma base de donnée...
<?php
    ob_start();
    session_start();
    $current_page = basename($_SERVER['PHP_SELF']);
    if($current_page !="index.php" && $current_page != "connexion.php" && !isset($_SESSION['user'])) {
        header('Location: connexion.php'); 
    }
?>
<?php
    $host = 'db769901296.hosting-data.io';
    $database = 'db769901296';
    $username = 'dbo769901296';
    $password = 'MON MDP';
    try {
        $dbh = new PDO("mysql:host=$host;dbname=$database", $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        print "Erreur !: " . $e->getMessage() . "<br/>";
        die();
    }

    function test_connexion($dbh, $username, $password) {
        $stmt = $dbh->prepare("SELECT * FROM users WHERE username=:username AND password=:password");
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':password', md5($password));
        $stmt->execute();
        $row = $stmt->fetchAll(); // return false
        return $row;
    }

    function add_user($dbh, $username, $password) {
        try {
            $stmt = $dbh->prepare("INSERT INTO users (username, password, role, adresse_ip) VALUES(:username, :password, 1)");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':password', md5($password));
            $stmt->execute();
            return false;
        } catch(Exception $e) {
            return false;
        }
    }    

    function update_password($dbh, $username, $password) {
        try {
            $stmt = $dbh->prepare("UPDATE users SET password=:password WHERE username=:username");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':password', md5($password));
            $stmt->execute();
            return true;
        } catch(Exception $e) {
            return false;
        }
    }

    function update_IP($dbh, $username, $adresse_ip) {
        try {
            $stmt = $dbh->prepare("UPDATE users SET adresse_ip=:adresse_ip WHERE username=:username");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':adresse_ip', $adresse_ip);
            $stmt->execute();
            return true;
        } catch(Exception $e) {
            return false;
        }
    }
?>

<?php 
     // Récupérer la véritable adresse IP d'un visiteur
    function get_ip() {
    	// IP si internet partagé
    	if (isset($_SERVER['HTTP_CLIENT_IP'])) {
    		return $_SERVER['HTTP_CLIENT_IP'];
    	}
    	// IP derrière un proxy
    	elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    		return $_SERVER['HTTP_X_FORWARDED_FOR'];
    	}
    	// Sinon : IP normale
    	else {
    		return (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '');
    	}
    }
    ?>


J'ai l'impression qu'il me manque quelque chose comme ceci mais sans certitude (je suis peut être complètement dans le faux)
$adresse_ip =  //mettre  une donnée ici


Je bloque sur quelque chose de simple, je sais... :)
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
peut-être ainsi:
update_IP($dbh, $username, get_ip())
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
> yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
-
Cela me met une erreur pour '('... Je comprends de moins en moins ce que je dois faire pour l'enregistrer ahahah
Tu as une autre idée?
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 -
connais-tu la différence entre la déclaration d'une fonction et un appel à cette fonction?
qu'as tu réalisé avec ma suggestion en #20? l'as-tu bien inséré avant la ligne 116 de ta page de connexion?
je pense que tu te compliques la vie en utilisant les mêmes noms de variables dans et hors de tes fonctions.
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
> yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
-
Non je ne connais la différence...
Tout se situe sur ma page ''haut.php'' comme m'a dit de faire Jordane45... Mon dernier code est dans mon message #21... Je n'ai donc plus de ligne 116.
Commenter la réponse de Gui4671
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1829
0
Merci
Y'aurait pas mal de choses à dire sur ton code...
concernant le md5 par exemple .... ( à la place, désormais on utilise password_hash et password_verify )

Mais bon.. concernant ta question actuelle :
 function update_IP($dbh, $username) {
        try {
            $stmt = $dbh->prepare("UPDATE users SET adresse_ip=:adresse_ip WHERE username=:username");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':adresse_ip', get_ip());
            $stmt->execute();
            return true;
        } catch(Exception $e) {
            return false;
        }
    }
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
il reste à appeler la fonction, par exemple en ajoutant
update_IP($dbh, $username);
avant la ligne 116 de ta page de connexion.
jordane45
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1829 -
Au lieu de faire un return false dans le exception.. il serait utile de pouvoir savoir qu'il y a une erreur et l'afficher...
Essaye :
function update_IP($dbh, $username) {
        try {
             $ip = get_ip();
            $stmt = $dbh->prepare("UPDATE users SET adresse_ip=:adresse_ip WHERE username=:username");
            $stmt->bindParam(':username', $username);
            $stmt->bindParam(':adresse_ip', $ip);
            $stmt->execute();
            return true;
        } catch(Exception $e) {
            echo " <br><b>Erreur !!</b> " .$e->getMessage();
            echo " <br>Datas : <br> IP : ". $ip . "<br> username : " .  $username ; 
             return false;
        }
    }

montres nous aussi à quel endroit tu as appelé cette fonction...
Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
Merci à toi, cela fonctionne bien maintenant... J'ai passé bcp de temps pour cela mais le résultat est là. :) A bientôt.
jordane45
Messages postés
26513
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 octobre 2019
1829 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
et histoire qu'on se couche moins bêtes... :-)
c'était quoi l'erreur ?

Et bon.. j'insiste...
Pour gérer l'authentification des utilisateurs... vire le md5 et passe par :http://php.net/manual/fr/function.password-hash.php et http://php.net/manual/fr/function.password-verify.php
yg_be
Messages postés
8708
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
15 octobre 2019
435 > Gui4671
Messages postés
33
Date d'inscription
jeudi 24 janvier 2019
Statut
Membre
Dernière intervention
7 avril 2019
-
bravo pour ta persévérance!
Commenter la réponse de jordane45