Stocker des IPs dans une table SQL

Darknoo
Invité n'ayant pas de compte PHPfrance

09 août 2011, 17:04

Bonjour, je voudrais pouvoir stocker les IPs de mes visiteurs dans une table SQL.

J'ai mis que le champ était du type "VARCHAR", donc déjà ça j'en suis pas sûr.

Ensuite, quand je veux chercher une valeur associée à une ip, je mets un

Code : Tout sélectionner

WHERE ip=($_SERVER["REMOTE_ADDR"])
Mais après plusieurs tests, je me suis rendu compte que ce bout de code rendait la page blanche (quand je l'enlève, ça marche).

Pourtant, je ne vois pas ce qui cloche ! Pouvez-vous m'aider svp ? :(

PS : $_SERVER["REMOTE_ADDR"] est la commande pour obtenir l'IP du visiteur.

Eléphant du PHP | 73 Messages

09 août 2011, 17:40

peux-tu montrer un peu plus de ton code s'il te plait (avec les guillemets etc.).

sinon essaye ça (si ta requête MySQL est dans une variable avec simples quotes):
WHERE ip = "'.$_SERVER["REMOTE_ADDR"].'"
ou ça (si ta requête MySQL est dans une variable avec doubles quotes):
WHERE ip = '".$_SERVER["REMOTE_ADDR"]."'
exemple :
$requete = 'INSERT INTO tableIP(ip_number, blabla, blabla) VALUES("'.$_SERVER['REMOTE_ADDR'].'", "blabla", "blabla")';
mysql_query($requete);
et puis si ça déconne à cause des guillemets, tu peux essayer de stocker d'abord la variable dans une autre, par exemple :
$ip_user = $_SERVER['REMOTE_ADDR'];
$requete = 'INSERT INTO tableIP(ip_number, blabla, blabla) VALUES("'.$ip_user.'", "blabla", "blabla")';
bonne soirée

Darknoo
Invité n'ayant pas de compte PHPfrance

09 août 2011, 18:27

Merci pour toute cette aide ! Déjà le problème local du WHERE est résolu, je l'avais isolé parmi un gros code qui marchait pas... et qui marche toujours pas xD

Le voici :

Code : Tout sélectionner

<?php $ip_user=$_SERVER["REMOTE_ADDR"]; $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options); if (($_POST['vote']=='oui') || ($_POST['vote']=='non') || ($_POST['vote']=='neutre') || ($_POST['vote']=='inconnu')) { setcookie('0', 'ok', time() + 10*365*24*3600, null, null, false, true); $bdd->exec('INSERT INTO ips(ip, 0) VALUES($ip_user, true')); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>Popularités</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" /> </head> <body> <?php include("entete.php"); ?> <div class="corpsvote"> <?php $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $reponse = $bdd->query('SELECT * FROM ips WHERE ip = "'.$ip_user.'"'); $donnees = $reponse->fetch(); $mem = $donnees[0]; if (($_POST['vote']=='oui') && ($_COOKIE['0']!=='ok') $$ ($mem!==false)) { $bdd->exec('UPDATE votes SET pour = pour+1 WHERE id = 0'); } if (($_POST['vote']=='non') && ($_COOKIE['0']!=='ok') $$ ($mem!==false)) { $bdd->exec('UPDATE votes SET contre = contre+1 WHERE id = 0'); } if (($_POST['vote']=='neutre') && ($_COOKIE['0']!=='ok') $$ ($mem!==false)) { $bdd->exec('UPDATE votes SET neutre = neutre+1 WHERE id = 0'); } if (($_POST['vote']=='inconnu') && ($_COOKIE['0']!=='ok') $$ ($mem!==false)) { $bdd->exec('UPDATE votes SET inconnu = inconnu+1 WHERE id = 0'); } $reponse = $bdd->query('SELECT * FROM votes LIMIT 0, 1'); $donnees = $reponse->fetch(); ?> <h3><?php echo $donnees['nom'] ?> <span class="ca">(<?php echo $donnees['cat'] ?>)</span></h3> <div class="im"><img src="<?php echo $donnees['image'] ?>" width="100%" " /></div> <div class="for"> <form method="post"> <input type="radio" name="vote" value="oui" id="oui" /> <label for="oui">J'aime</label></br> <input type="radio" name="vote" value="non" id="non" /> <label for="non">J'aime pas</label></br> <input type="radio" name="vote" value="neutre" id="neutre" /> <label for="neutre">J'ai pas d'avis</label></br> <input type="radio" name="vote" value="inconnu" id="inconnu" /> <label for="inconnu">Je connais pas</label></br></br> <input type="submit" value="Valider" /> </form> </div></div> <div class="stats"> <?php echo floor(1000*($donnees['pour']/($donnees['pour']+$donnees['contre']+$donnees['neutre']+$donnees['inconnu'])))/10 ; echo " %"; ?></br> <?php echo floor(1000*($donnees['contre']/($donnees['pour']+$donnees['contre']+$donnees['neutre']+$donnees['inconnu'])))/10 ; echo " %"; ?></br> <?php echo floor(1000*($donnees['neutre']/($donnees['pour']+$donnees['contre']+$donnees['neutre']+$donnees['inconnu'])))/10 ; echo " %"; ?></br> <?php echo floor(1000*($donnees['inconnu']/($donnees['pour']+$donnees['contre']+$donnees['neutre']+$donnees['inconnu'])))/10 ; echo " %"; ?></br></br> </div> <div class="nombre"> Votes : <?php echo $donnees['pour']+$donnees['contre']+$donnees['neutre']+$donnees['inconnu']; ?> </div> <div class="menu"><?php include("menu.php"); ?></div> </body> </html>
Mais là je vous avoue que j'ai pas encore cherché, je viens juste de résoudre l'autre bug grâce à vous, encore merci :)

Invité
Invité n'ayant pas de compte PHPfrance

09 août 2011, 18:32

(Désolé pour le double post) Voici une partie allégée qui bugge encore (le aa s'affiche pas) :

Code : Tout sélectionner

<?php $ip_user=$_SERVER["REMOTE_ADDR"]; $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options); if (($_POST['vote']=='oui') || ($_POST['vote']=='non') || ($_POST['vote']=='neutre') || ($_POST['vote']=='inconnu')) { setcookie('0', 'ok', time() + 10*365*24*3600, null, null, false, true); $bdd->exec('INSERT INTO ips(ip, 0) VALUES($ip_user, true')); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>Popularités</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link rel="stylesheet" media="screen" type="text/css" title="Design" href="design.css" /> </head> <body> <div class="corpsvote"> <?php $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $reponse = $bdd->query('SELECT * FROM ips WHERE ip = "'.$ip_user.'"'); $donnees = $reponse->fetch(); $mem = $donnees[0]; $reponse = $bdd->query('SELECT * FROM votes LIMIT 0, 1'); $donnees = $reponse->fetch(); ?> aa </body> </html>

Invité
Invité n'ayant pas de compte PHPfrance

09 août 2011, 18:33

Il faut enlever le div en trop. Je vais me faire un compte pour ne plus avoir à triple-poster.

Eléphant du PHP | 73 Messages

09 août 2011, 18:42

alors je ne connais pas PDO, mais le code a l'air pas mal si ce n'est que à mon avis :
$bdd->exec('INSERT INTO ips(ip, 0) VALUES($ip_user, true'));
ne fonctionnera pas (du moins, ca t'inscrira $ip_user dans ta base au lieu des données, il faut certainement aussi faire un '.$ip_user.' ici aussi

sinon, tu es sur apache ? que disent tes logs ? normalement si tu regarder le fichier sur /repertoire_apache/logs/tonsite_error-log
tu devrais voir les erreurs, et ça doit te dire quelle erreur c'est (il manque un point virgule etc..) et la ligne qui pose problème.

si tu n'as pas ça, tu peux tester bout par bout, déjà voir si c'est la première partie de ton code qui ne fonctionne pas (la condition), ou la suite après le code HTML (commente le bas)

Petit nouveau ! | 7 Messages

09 août 2011, 19:03

Euh j'ai téléchargé le pack phpMyAdmin et il y avait Apache dedans. Mais bizarrement quand je cherche "Apache" dans Windows je trouve rien, le seul accès que j'ai à lui est l'icône phpMyAdmin à gauche de l'heure. J'ai trouvé un XDebugClient, c'est ça ?

Eléphant du PHP | 73 Messages

09 août 2011, 19:23

mmh non.
ton code php tourne sur quel type de serveur web ?

tu utilises un truc genre EasyPHP ? Apache pour Windows ? IIS et un plugin ?
c'est dans les logs de ton serveur web en fait

des erreurs de ce genre :

Code : Tout sélectionner

[client 1.2.3.4] PHP Notice: Undefined variable: browserline in /foo/bar/zing.html on line 18

Petit nouveau ! | 7 Messages

09 août 2011, 19:51

Euh désolé je débute :oops: , mais pour visualiser mes pages web j'utilise l'interface de WAMP, qui contient Apache (comme indiqué ici : http://www.siteduzero.com/tutoriel-3-19 ... #ss_part_1). Donc je suppose que la réponse est Apache !

[EDIT] La page n'est plus blanche, mais dès que je vote elle le devient... un vrai casse-tête ! C'est en tout cas à cause de cette ligne :

Code : Tout sélectionner

$bdd->exec('INSERT INTO ips(ip, 0) VALUES('.$ip_user.', true)');

Eléphant du PHP | 73 Messages

10 août 2011, 10:50

regarde dans ton répertoire WAMP (par exemple c:\wamp\apache\log\*)

il doit y avoir un sous répertoire log avec des logs d'erreur dedans (genre error.log ou apache.log) et tu dois avoir les erreurs dedans.

sinon comme je ne connais pas PDO, je vois pas, ça a l'air correct. après es-tu sur que ta requête fonctionne ? et "0" c'est le nom de ton champ MySQL ?! (ip, 0)
si tu test par exemple (rajouter des doubles quotes dans tes values):

Code : Tout sélectionner

$bdd->exec('INSERT INTO ips(ip, 0) VALUES("'.$ip_user.'", "true")');
est-ce que ça marche ? si non

sinon il faut peut-être banaliser les parenthèses, je n'en sais rien, comme ça :

Code : Tout sélectionner

$bdd->exec('INSERT INTO ips\(ip, 0\) VALUES\("'.$ip_user.'", "true"\)');
Modifié en dernier par olivierg le 10 août 2011, 11:54, modifié 1 fois.

Petit nouveau ! | 7 Messages

10 août 2011, 11:29

J'ai trouvé le fichier avec les logs puis j'ai testé ce que vous m'aviez dit mais ça n'a pas marché.

Mais en fait, j'ai trouvé le problème : je pense qu'on ne peut pas faire commencer le nom d'une colonne de table SQL par un chiffre, puisqu'avec "c0", ça marche !

Voilà, merci à vous pour tout ^^

Eléphant du PHP | 73 Messages

10 août 2011, 11:54

eh oui c'est pour ça que j'ai trouvé ça louche :)