8791 sujets

Développement web côté serveur, CMS

Bonjour a tous,

j'essai de mettre en place sur mon site une table qui récuperera toutes les adresses ip des visiteurs ainsi que la date et l'heure de leur passage. Ca me permettrait eventuellement de retrouver un posteur fou ou encore un lamer qui chercherais a fiche la mer***

J'ai créer une table IP avec comme champs ip(meduimint et autoincrément), ip(varchar 15), date(date), heure(time) et j'ai codé comme ceci :

<?php
$date=date("d-m-Y");
$heure=date("H:i");
mysql_connect("localhost","login","mdp");
mysql_select_db("bdd");
mysql_query("INSERT INTO IP VALUES('$SERVER[REMOTE_ADDR]','$date','$heure')");
mysql_close;
?>


Mais le code n'inscrit rien dans ma Bdd.

Ou est ce que j'ai coincé ?

Merci pour votre aide.

Amicalement

Lonewolf
Salut lonewolf,
lonewolf a écrit :
J'ai créer une table IP avec comme champs ip(meduimint et autoincrément), ip(varchar 15), date(date), heure(time)
Je suppose que tu veux dire id Smiley cligne !

Sinon, au lieu d'avoir 2 champs pour la date et l'heure, autant n'en mettre qu'un de type timestamp ou datetime.

Pour ce qui est de l'INSERT il existe 3 méthodes possibles :

* INSERT INTO matable VALUES(...) : dans ce cas tu es obligé d'avoir exactement le même nombre de zones que ta table et pour ce qui est de ton id en auto_increment il faut mettre '' ce qui donne :
$ip = getenv('REMOTE_ADDR');
$rq = "INSERT INTO IP VALUES([#blue][b]''[/b][/#], $ip, NOW())";
mysql_query($rq) or die (mysql_error());

* INSERT INTO matable (zone2, zone5) VALUES(valeur2, valeur5) : dans ce cas tu peux renseigner seulement les champs que tu veux et par exemple une zone1 en auto_increment sera alimentée automatiquement ce qui donne :
$ip = getenv('REMOTE_ADDR');
$rq = "INSERT INTO IP (ip, DateConnect) VALUES($ip, NOW())";
mysql_query($rq) or die (mysql_error());

* INSERT INTO matable SET zone3 = $zone3, zone4 = $zone4, etc... : dans ce cas tu peux renseigner seulement les champs que tu veux et par exemple une zone1 en auto_increment sera alimentée automatiquement ce qui donne :
$ip = getenv('REMOTE_ADDR');
$rq = "INSERT INTO IP set ip = $ip, DateConnect = NOW()";
mysql_query($rq) or die (mysql_error());

A+ Smiley smile


Edit: concernant les champs date, datetime et timestamp le plus simple (et quand il s'agit de la date -et heure- actuelle) est souvent de laisser faire mysql en mettant NOW(). J'ai donc mis le code ci-dessus à jour...
Modifié par Heyoan (17 May 2008 - 22:23)
Bonjour et merci beaucoup,

Effectivement, le premier champs est bien id et non pas ip.

De plus, j'ai effectivement commis l'erreur de ne pas remplir dans ma requête d'ajout le champs id par un ".

J'essaie cela et vous tiens au courant pour déclarer ce post résolu.

Merci encore

Amicalement

lonewolf
RE,

Voila, j'ai trouvé ce qui clochait dans mon code et c'etait finalement pas grand chose, un oubli d'un _ entre $ et SERVER.

Par contre, si mon code fonctionne bien, il me renvoie un drole de résultat sur la date puisqu'il me situe en 2017.

Ais je fait une erreur en déclarant mon champs date en DATE ?

Ou alors ais je fais une bétise sur mon code ?

Ou encore ais je fait une bétise dans la déclaration de ma variable date ?

Encore merci pour votre aide.

<?php
$date=date("d-m-Y");
$heure=date("H:i");
mysql_connect("localhost","login","mdp");
mysql_select_db("bdd");
mysql_query("INSERT INTO IP VALUES('','$_SERVER[REMOTE_ADDR]','$date','$heure')");
mysql_close;
?>


Amicalement

Lonewolf

[Edit] Une autre question : y a t'il un moyen pour empêcher de nouveau l'inscription dans la Bdd si je reviens sur la page d'index en surfant sur le site ?

Merci encore
Modifié par lonewolf (17 May 2008 - 13:24)
Bon,

C'est bon j'ai trouvé le problème sur ma date. Il a suffit que je change le type du champs 'date' de 'date' à 'varchar' et tout fonctionne. C'est quand même un comble ca de changer le champs 'date' à 'varchar' pour un afficher correctement une date Smiley biggrin Smiley biggrin

Je déclare donc ce post résolu mais si vous avez une idée au sujet de mon edit du post précédent, je suis preneur.

Merci encore à tous.

Amicalement

Lonewolf
lonewolf a écrit :
Il a suffit que je change le type du champs 'date' de 'date' à 'varchar' et tout fonctionne.

Euh... oui mais non Smiley murf !

Il faut toujours utiliser le bon type de champ dans mysql (et encore plus avec ceux de type date) car cela permet d'avoir accès à tout plein de fonctionnalités de mysql (MONTH, YEAR, ADDDATE, etc...) et de se simplifier la vie et par la même occasion le code PHP pour les utiliser. Un exemple simple : impossible de trier ta colonne avec une sauvegarde JJ-MM-AAA en varchar Smiley cligne .

Ce qui ne fonctionnait pas (je pense) c'est que justement un champ date doit toujours être alimenté avec l'année en premier (AAAAMMJJ ou AAMMJJ ou AAAA/MM/JJ ou ...).

Tu n'avais peut-être pas vu que j'avais édité mon premier post (et je viens de le refaire pour mettre les requêtes à jour) mais encore une fois le mieux est d'utiliser NOW() dans la requête et de laisser faire mysql. Pour ce qui est de reformater le champ pour l'afficher correctement il suffit ensuite d'utiliser directement DATE_FORMAT dans la requête comme par exemple
SELECT DATE_FORMAT(madate, '%d:%m:%Y') from matable...
ou bien le faire dans le code PHP.

Quelques liens intéressants :
PHP
date
time
setlocale
strftime
strtotime

mysql
Les types DATETIME, DATE, et TIMESTAMP
Fonctions de dates et d'heures
UNIX_TIMESTAMP


Pour ce qui est d'un moyen pour "empêcher de nouveau l'inscription dans la Bdd", tu pourrais par exemple vérifier avant que cette ip n'est pas déjà présente :
"Select id from IP where ip=$ip"
et vérification que mysql_num_rows est égal à 0.

A+
Modifié par Heyoan (11 Jun 2009 - 23:10)