8791 sujets

Développement web côté serveur, CMS

Bonsoir à tous, Smiley lol

Je créer actuellement mon premier site en php et j'aurais besoin de votre aide. Mon site est une sorte de concours où une personne s'inscrit, un id lui est attribué donc elle reçoit une page du genre : http://monsite.com/pts.php?id=10 et elle doit ramené un maximum de personnes sur son lien.

J'ai rajouté un compteur sur la page pts.php mais je n'arrive pas a le rendre différement pour chaque membre (id). Smiley biggol

Voici mon compteur :



<?php

// Récupération de la date actuelle \\

$date=date("d-m-Y");

// Connexion à la base mySQL \\

mysql_connect("localhost", "xxx", "xxx");
mysql_select_db("xxx");

// Requête qui compte le nombre d'enregistrements dont la date est différente de la date actuelle \\

$cpt="SELECT * FROM pts WHERE date!='$date'";
$req=mysql_query($cpt);
$res=mysql_num_rows($req);
$res2=($res-1);

$sql_req="UPDATE pts SET ip=($res2) WHERE date='cpt'";
$upd=mysql_query($sql_req);


// On récupère l'adresse IP du visiteur \\

$ip="$_SERVER[REMOTE_ADDR]";

// On vérifie que cette adresse IP n'est pas déjà présente dans la table \\

$requete="SELECT * FROM pts WHERE ip='$ip'";
$res=mysql_query($requete);
$num=mysql_num_rows($res);


// Si un enregistrement contient déjà cette IP alors il ne se passe rien \\

if($num!=0)
{
}

// Sinon on insère l'IP et la date \\

else
{
$insert="INSERT INTO pts (ip,date) VALUES('$ip','$date')";
$query=mysql_query($insert);
}


// On récupère la valeur du compteur unique \\

$select = mysql_query("SELECT ip FROM pts WHERE date='cpt'") or die('recuperation impossible');
$compteur = mysql_fetch_array ($select);

$select2 = mysql_query("SELECT ip FROM pts WHERE date='$date'");
$compteur2 = mysql_num_rows($select2);

$tot = ($compteur['ip']+$compteur2);

if($tot>1) {$s="s";} else {$s="";}

echo $tot." visiteur$s unique$s";


// On ferme la connexion à la base mySQL \\

mysql_close();

?>


Je n'attends pas forcément que la personne me modifie le code (je dois avouer que j'aimerais bien) mais si on pouvait m'indiquer ce que je dois modifier dans les requêtes ou autres. Smiley confused

Merci d'avance Smiley biggrin
Modifié par k4rnage (24 Jun 2007 - 01:44)
Salut Smiley cligne ,

alors j'essaye de résumer ce que j'ai compris Smiley murf :

1) un visiteur s'inscrit sur ton site pour participer à un concours.

2) tu lui attribues un id (par exemple id=10).

3) tu lui fournis un lien correspondant http://monsite.com/pts.php?id=10 (qu'il doit placer sur une des pages de son site ???).

4) à chaque fois que quelqu'un cliquera sur ce lien il arrivera sur ta page (dont le code est au dessus) et si le couple ip / date du jour n'existe pas déjà, tu ajouteras un enregistrement ip / date du jour dans ta table "pts".

5) à la fin du concours (à une certaine date...) tu calculeras le nombre total d'enregistrements pour désigner le vainqueur.

6) ta question est : lorsque quelqu'un arrive sur ma page, à qui faut-il ajouter un enregistrement et comment ?

---------------------------------------------------------

Alors en supposant que j'aie bien compris Smiley biggol , il suffit au moment de l'inscription de créer (INSERT...) un enregistrement dans une table "participants" qui indiquera le nom et l'identifiant (ex : John Doe | 10).

Quand quelqu'un arrive sur ta page par le lien http://monsite.com/pts.php?id=10 , il faut récupérer l'id avec le code :
if (isset($_GET['id'])) {
   $id = $_GET['id'];
}
else 
{
   $id = 0;
}

[b]ou avec l'opérateur ternaire :[/b]

$id  = (isset($_GET['id'])) ? $_GET['id'] : 0;

Puis vérifier que cet id existe bien dans la table participants.... (ne pas avoir d'id = 0 !) :
$sql="SELECT nom_participant FROM participants where id = $id";
$req=mysql_query($sql);
$res=mysql_num_rows($req);
if ($res != 0) {
Si c'est bien le cas, récupérer l'ip du visiteur :
$ip="$_SERVER[REMOTE_ADDR]";

Vérifier que pour cet id et la date du jour tu n'as pas déjà un enregistrement avec la même ip (donc rajouter le champ 'id' à ta table 'pts') :
$sql="SELECT * FROM pts WHERE id = '$id' AND ip = '$ip' AND date='$date'";
$req=mysql_query($sql);
$res=mysql_num_rows($req);
if ($res == 0) {
Si c'est le cas ajouter l'enregistrement :
$sql="INSERT INTO pts (id, date, ip) VALUES ($id, $date, $ip);
$req=mysql_query($sql);
}
Et si tu veux afficher combien d'enregistrements existent pour ce participant :
$sql = "SELECT count(*) FROM pts WHERE id = $id";
$req=mysql_query($sql);
$res=mysql_num_rows($req);
$message = ( $res == 1) ? "1er" : $res."ème";
$message .= " vote pour ".$nom_paricipant;
echo $message;
}


A noter qu'il est assez facile de tricher puisque le test sur l'ip n'est pas fiable (utilisation d'un proxy ou déconnexion à son FAI puis reconnexion Smiley ohwell )

A+ Smiley smile
Merci beaucoup pour cette explication, je viens de tester mais j'ai un petit soucis (surement une fausse manip venant de moi).
J'ai mis dans ma table pts id,pseudo,ip,date.

J'ai donc repris le code et modifier légèrement :


<?php

// Récupération de l'id

if (isset($_GET['id'])) {
$id = $_GET['id'];
}
else 
{
   $id = 0;
}

// Vérification de l'id

$sql="SELECT id FROM pts where id = $id";
$req=mysql_query($sql);
$res=mysql_num_rows($req);
if ($res != 0) {

// Récupération de l'ip du visiteur

$ip="$_SERVER[REMOTE_ADDR]";

// Vérification de l'ip

$sql="SELECT * FROM pts WHERE id = '$id' AND ip = '$ip' AND date='$date'";
$req=mysql_query($sql);
$res=mysql_num_rows($req);
if ($res == 0) {

// Si ok on ajoute

$sql="INSERT INTO pts (id, date, ip) VALUES ($id, $date, $ip)";
$req=mysql_query($sql);
}
// Calcul du nombre de points

$sql = "SELECT count(*) FROM pts WHERE id = $id";
$req=mysql_query($sql);
$res=mysql_num_rows($req);
$message = ( $res == 1) ? "1er" : $res."ème";
$message .= " vote pour ".$id;
echo $message;
}

mysql_close();

?>


Je n'ai aucun message d'erreur mais quand un visiteur différent arrive sur la page, le compteur reste toujours sur 1er vote. Hors le compteur devrait augmenter. Smiley biggol

PS : petite infos : a l'inscription je prends aussi l'ip de la personne qui s'inscrit. Je sais pas si sa change quelque chose mais bon ... Smiley confused
Modifié par k4rnage (24 Jun 2007 - 13:06)
re-Salut !
k4rnage a écrit :
J'ai mis dans ma table pts id,pseudo,ip,date.
C'est vrai que tu as très peu de données mais il est inutile de reprendre le pseudo sur chaque ligne : d'une part ce n'est pas normalisé Smiley murf et d'autre part le fait d'avoir une table des participants te permettra lors d'une inscription de vérifier directement si ce nom n'existe pas déjà avant de lui créer un id...

Voilà ce que le code pourrait être (après quelques modifs) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ajout Vote</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<?php
// Récupération de l'id passé en GET
$id  = (isset($_GET['id'])) ? $_GET['id'] : 0;

// on transforme un éventuel id non numérique (par exemple 'a') en 0
$id = intval($id);

// Déclaration des paramètres de connexion
$NomServeur = $_SERVER['SERVER_NAME'] ; 
$local=((substr($NomServeur,0,7)=="192.168") || ($NomServeur=="localhost") || ($NomServeur=="127.0.0.1"));
$host = ($local) ? "localhost" : "xxxxxx"; 
$user = ($local) ? "root" : "xxxxxx"; 
$passwd = ($local) ? "" : "xxxxxx"; 
$database = ($local) ? "test" : "xxxxxx"; 

// Connexion au serveur
mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
mysql_select_db($database) or die("erreur de connexion a la base de donnees");

// Vérification de l'id dans la table participants
$sql="SELECT nom_participant FROM participants where id = $id";
$req = mysql_query($sql) or die("Exécution de la requête 1 impossible.");
$res = mysql_num_rows($req);
if ($res > 0) { // Si OK on continue
$ligne = mysql_fetch_array($req);
extract($ligne);

// Récupération de l'ip du visiteur
$ip="$_SERVER[REMOTE_ADDR]";

// Date du jour sous la forme AAAA-MM-JJ (ce qui permettra un éventuel tri)
$date = date('Y-m-d');

// Vérification de l'ip et de la date du jour
$sql="SELECT * FROM pts WHERE id = '$id' AND ip = '$ip' AND date='$date'";
$req = mysql_query($sql) or die("Exécution de la requête 2 impossible.");
$res = mysql_num_rows($req);
if ($res == 0) { // Si ok on ajoute
$sql="INSERT INTO pts (id, date, ip) VALUES ($id, '$date', '$ip')";
$req = mysql_query($sql) or die("Exécution de la requête 3 impossible.");
echo "Votre vote a bien été pris en compte !<br />";
} else { // sinon message...
echo "Aujourd'hui, vous avez déjà voté pour $nom_participant !<br />";
} 

// Calcul du nombre de votes
$sql = "SELECT count(*) as cpt FROM pts WHERE id = $id";
$req = mysql_query($sql) or die("Exécution de la requête 4 impossible.");
$ligne = mysql_fetch_array($req);
extract($ligne);
$message = "Nombre total de votes pour $nom_participant : $cpt";
echo $message;

} else { // sinon (si id inconnu dans la table)
echo "Ce participant est inconnu !";
} 

// On ferme la connexion
mysql_close();
?>
</body>
</html>

Et voici comment j'ai créé les tables pour mes tests :
[b]Table participants : [/b]
CREATE TABLE `participants` (
`id` TINYINT NOT NULL AUTO_INCREMENT ,
`nom_participant` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `nom_participant` ) 
);

[b]Quelques données :[/b]
INSERT INTO `participants` ( `id` , `nom_participant` ) 
VALUES (
'', 'John Doe'
);

INSERT INTO `participants` ( `id` , `nom_participant` ) 
VALUES (
'', 'Anne Onyme'
);


[b]Table pts : [/b]
CREATE TABLE `pts` (
`id` TINYINT NOT NULL ,
`date` DATE NOT NULL ,
`ip` VARCHAR( 15 ) NOT NULL ,
PRIMARY KEY ( `id` , `date` , `ip` ) 
);

[b]Quelques données :[/b]
INSERT INTO `pts` ( `id` , `date` , `ip` ) 
VALUES (
'1', '2007-06-22', '123.456.789.012'
), (
'1', '2007-06-23', '127.0.0.1'
);


A+
Décidément je n'ai pas de chance, les requêtes se déroulent tranquillement mais lorsqu'on visite la page d'un membre le message est toujours: Ce participant est inconnu !.

Si possible j'aimerais jongler avec une seul table qui serait :
pts contenant : id, pseudo, ip, mail, date.

$nom_participants deviendrait $pseudo
J'ai fais quelques test et je bloque tjrs à la requête 3.


<?php

// Récupération de l'id passé en GET

$id  = (isset($_GET['id'])) ? $_GET['id'] : 0;



// on transforme un éventuel id non numérique (par exemple 'a') en 0

$id = intval($id);



// Connection a la BDD
mysql_connect("localhost", "xxx", "xxx");
mysql_select_db("xxx");


// Vérification de l'id dans la table participants

$sql="SELECT pseudo FROM pts where id = $id";

$req = mysql_query($sql) or die("Exécution de la requête 1 impossible.");

$res = mysql_num_rows($req);

if ($res > 0) { // Si OK on continue

$ligne = mysql_fetch_array($req);

extract($ligne);



// Récupération de l'ip du visiteur

$ip="$_SERVER[REMOTE_ADDR]";



// Date du jour sous la forme AAAA-MM-JJ (ce qui permettra un éventuel tri)

$date = date('Y-m-d');



// Vérification de l'ip et de la date du jour

$sql="SELECT * FROM pts WHERE id = '$id' AND ip = '$ip' AND date='$date'";

$req = mysql_query($sql) or die("Exécution de la requête 2 impossible.");

$res = mysql_num_rows($req);

if ($res == 0) { // Si ok on ajoute

$sql="INSERT INTO pts (id, date, ip) VALUES ($id, '$date', '$ip')";

$req = mysql_query($sql) or die("Exécution de la requête 3 impossible.");

echo "Votre vote a bien été pris en compte !<br />";

} else { // sinon message...

echo "Aujourd'hui, vous avez déjà voté pour $pseudo !<br />";

} 



// Calcul du nombre de votes

$sql = "SELECT count(*) as cpt FROM pts WHERE id = $id";

$req = mysql_query($sql) or die("Exécution de la requête 4 impossible.");

$ligne = mysql_fetch_array($req);

extract($ligne);

$message = "Nombre total de votes pour $pseudo : $cpt";

echo $message;



} else { // sinon (si id inconnu dans la table)

echo "Ce participant est inconnu !";

} 



// On ferme la connexion

mysql_close();

?>


Encore une fois merci pour ton aide précieuse Heyoan Smiley biggrin
Modifié par k4rnage (24 Jun 2007 - 17:07)
Voilà j'ai modifié la requête 3 :


$sql="INSERT INTO pts VALUES ('', '', '$ip', '', '$date')";


Le problème c'est que un id est réattribué a chaque visite de la page d'un membre. Si je met $id (en premier vu qu'il est en premier dans la bdd) j'ai une erreur ...
Modifié par k4rnage (25 Jun 2007 - 14:36)
Salut,

Excuses-moi d'insister mais tu te compliques la vie inutiliement Smiley cligne : dans la méthode avec 2 tables que je t'ai proposée la première contient un champ id généré automatiquement (avec l'option AUTO_INCREMENT). En mettant toutes les infos dans la même table tu ne dois pas utiliser cette option... mais le problème est que tu n'as plus de lien avec l'id et le pseudo Smiley confus : ou alors le lien que tu mets à disposition ne doit pas être sous la forme http://monsite.com/pts.php?id=10 mais sous la forme http://monsite.com/pts.php?id=10&pseudo=John+Doe ce qui, encore une fois, complique les choses Smiley smile
Hum, si tu fais une insertion dans ta base avec un ID qui se trouve être la clé primaire et qui existe déjà j'ai envie de dire que c'est normal, puisqu'elle est censée être unique si je me souviens bien.

J'ai peut-être mal compris, mais dans ta table Pts, tu ajoutes à la suite l'ID du personnage, son nom, l'adresse IP du votant et la date.

Donc pour ton candidat 10, tu devrais avoir si ça fonctionnait quelque chose comme ca

10 | Robert | @IP | Date
10 | Robert | @IP2 | Date

Or si c'est comme c'est je pense normal que ça ne fonctionne pas. Il manque une clé primaire unique. (enfin je crois que ca s'appelle comme ça, j'avoue ne plus etre trop sur des termes exact)

Tu devrais avoir plutot

12456 | 10 | Robert | @IP | Date
12455 | 10 | Robert | @IP2 | Date
12454 | 10 | Robert | @IP | Date2
12453 | 9 | Henri | @IP3 | Date2

etc.

non ?

Par contre si c'est le cas, ta table est de toute façon bancale puisque le pseudo devrait se trouver à part, parce que là t'as des infos redondante en grosse quantité qui s'annoncent !
Modifié par Ondskapt (25 Jun 2007 - 15:05)
Merci de votre aide, je crois qu'en effet je me complique un peu trop la vie ... je vais créer 2 tables comme tu me l'as indiqué précédemment car ma BDD va être aussi mal rangé que ma chambre après Smiley lol Smiley biggol
Je viens vous embêter une dernière fois, j'ai enfin réussi a établir le compteur en réalisant 2 tables :

participants avec : id, pseudo, mail (j'ai remplacé nom_participants par pseudo dans tout le code et la BDD)
pts avec : id, date, ip

Les visites sont bien comptabilisés et tout (HOURAAAAAAA !!). Par contre, lorsque qu'une ip a déjà visité la page d'un membre, au lieu d'avoir le message :

echo "Aujourd'hui, vous avez déjà voté pour $nom_participant !<br />";


Le message est : Exécution de la requête 3 impossible.

Pourtant elle marche au premier affichage, et au deuxième (si l'ip a déjà visité la page) l'erreur apparait. Smiley biggol

Des suggestions ? (promis je vous embête plus avec sa après Smiley murf )
Modifié par k4rnage (25 Jun 2007 - 18:35)
Si la requête 3 est exécutée c'est normal que ça plante puisque la clef id, date, ip est unique et existe déjà dans la table...

Le problème est que la requête 2 qui doit vérifier cette existence ne fonctionne pas et que la variable $res est égale à 0 Smiley rolleyes

Regardes comment est codée ta requête et si tu ne vois rien qui cloche fais un echo de ta variable et lances la directement dans phpmyadmin :
// Vérification de l'ip et de la date du jour
$sql="SELECT * FROM pts WHERE id = '$id' AND ip = '$ip' AND date='$date'";
echo $sql."<br />\n";


A+
Je viens de voir ce qui cloché ... j'ai un peu honte Smiley confused . Mais merci beaucoup de votre aide et de la patience que vous m'avez accordé.

@ la prochaine peut être Smiley cligne
Modifié par k4rnage (25 Jun 2007 - 19:14)