Afichage frame par ip unique et par jours.

Grumos
Invité n'ayant pas de compte PHPfrance

10 déc. 2006, 03:53

Bonsoir,
J'ai fait un script pour afficher une frame une fois par ip et par jours mais il ne fonctionne pas vraiments. Le script que j'ai fait vide donc la table dès que quelqu'un ouvre la page si la date n'est pas trouvée dans la table pour ensuite afficher la frame et inscrire sont ip dans la base pour normalement ne plus afficher la frame à sa prochaine visite le même jours. Mais je ni arrive pas après plusieurs essaie j'ai arrété sur se script et là il ne veut plus afficher la frame pouriez vous m'aider svp. Voici le script :

Code : Tout sélectionner

<?php $Ip = $_SERVER['REMOTE_ADDR']; $Date = date("d/m/Y"); $db = mysql_connect('localhost', 'login', 'mdp') or die('Erreur de connexion '.mysql_error()); mysql_select_db('base',$db) or die('Erreur de selection '.mysql_error()); define( _TABLE , 'Ip_Unique' ); $sql = "SELECT Ip,Date FROM " . _TABLE . " ORDER BY DATE DESC "; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $data = mysql_fetch_assoc($req); if($data['Date'] != $Date) { mysql_query("TRUNCATE TABLE " . _TABLE . ""); } if($data['Ip'] != $Ip) { mysql_query("INSERT INTO " . _TABLE . " (Ip,Date) VALUES ('$Ip','$Date') WHERE Ip!='".$Ip."'"); } if($Ip != $data['Ip']) { if($Date != $data['Date']) { echo ("<iframe src='http://www.bonus.grumosweb.fr/PTP2.php' width=0 height=0 MARGINWIDTH=0 MARGINHEIGHT=0 HSPACE=0 VSPACE=0 FRAMEBORDER=0 SCROLLING=no></iframe>"); } } mysql_close(); ?>
Me suis-je bien fait comprendre ?[/color]

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

10 déc. 2006, 12:18

Tu as un petit soucis dans la récupération de l'ip en base. En effet tu récupère celle associée à la dernière date, mais tu ne sais pas si entre temps tu as vidé la table ou pas. Je ne suis par ailleurs pas certain que l'on puisse utiliser la condition WHERE dans un INSERT.

Pour ma part, la première chose que je ferais c'est de ramener uniquement la date max de ta table sans ramener les autres enregistrements (actuellement tu ramenes toutes les lignes pour ne traiter que la première) et sans te soucier de l'ip. (soit avec un "max", soit avec un "limit 0,1")
Si la date est différente, effectivement tu tronques.

Ensuite, je me consacrerais à l'ip. Je ferais donc un count(*) dans la table avec un WHERE sur l'ip pour savoir s'il y a déjà un enregistrement correspondant ou pas (si on vient de faire un truncate, c'est pas utile, on sait déjà qu'il n'y en aura pas)

Et en fonction du résultat du count, s'il n'a rien trouvé, je fais l'insertion en base et j'affiche la frame, sinon je lui dis qu'il est déjà venu :)


Sinon quelques p'tites remarques en passant :
- quand tu définies une nouvelle constante, il faut mettre des apostrophes (ou des guillemets) autour du nom de la constante. Tant qu'elle n'est pas définie, ca reste une chaine de caractère normale :)
define( '_TABLE' , 'Ip_Unique' ); 
- Ce n'est pas utile, lorsque tu concatène une variable à la fin d'une chaine, de rajouter une chaine vide après :
mysql_query("TRUNCATE TABLE " . _TABLE ); // pas besoin du: . ""
- Ton contrôle sur l'ip devrait également (surtout d'ailleurs) être effectué sur la page PTP2.php si ce n'est pas déjà le cas, dans la mesure ou l'on peut l'appeller directement via son url. C'est d'avantage elle qu'il faut protéger que l'iframe qui l'affiche :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 1961 Messages

10 déc. 2006, 17:16

Je ne suis par ailleurs pas certain que l'on puisse utiliser la condition WHERE dans un INSERT.
Je te confirme que la syntaxe SQL ne permet pas de clause "WHERE" dans une instruction "INSET".

Celà me semble logique, un "INSERT" correspond à une "création" donc aucun critère de sélection ne peut être appliqué.

Si ce que tu cherches c'est de faire une insertion s'il n'exite pas et une mise à jour s'il existe, regarde du coté de "INSERT INTO .... ON DUPLICATE KEY UPDATE"
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein