Liaisons php / mysql
Bonjour à tous, j'ai besoin de votre aide :)
J'ai d'un côté un script qui permet de voter pour un site et de l'autre mon espace membres et je n'arrive pas à lier les deux.
Je voudrais "simplement" que le membre ne puisse voter qu'une seule fois par site...
Voici le code qui permet de voter :
<?php include("config.php");
function getAllVotes($id)
{
$votes = array();
$q = "SELECT * FROM dir_pages WHERE id='$id'";
$r = mysql_query($q);
if(mysql_num_rows($r)==1)
{
$row = mysql_fetch_assoc($r);
$votes[0] = $row['votes_up'];
$votes[1] = $row['votes_down'];
}
return $votes;
}
function getEffectiveVotes($id)
{
$votes = getAllVotes($id);
$effectiveVote = $votes[0] - $votes[1];
return $effectiveVote;
}
$id = $_POST['id'];
$action = $_POST['action'];
$cur_votes = getAllVotes($id);
if($action=='vote_up')
{
$votes_up = $cur_votes[0]+1;
$q = "UPDATE dir_pages SET votes_up = $votes_up WHERE id = $id";
}
elseif($action=='vote_down')
{
$votes_down = $cur_votes[1]+1;
$q = "UPDATE dir_pages SET votes_down = $votes_down WHERE id = $id";
}
$r = mysql_query($q);
if($r)
{
$effectiveVote = getEffectiveVotes($id);
echo "A voté !";
}
elseif(!$r)
{
echo " <b>Erreur...</b>";
}
?>
Celui qui me permet de récupérer les votes :
<?php
include("config.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>...</title>
<meta name="description" content="..." />
<meta name="keywords" content="..." />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8851-1" />
<meta name="robots" content="noindex, nofollow">
<meta name="Copyright" content="..." />
<meta name="Author" content="..." />
<link href="styles.css" media="screen" rel="stylesheet" type="text/css" />
<!--[if IE 7]> <link href="ie7.css" media="screen" rel="stylesheet" type="text/css" /> <![endif]-->
<!--[if IE]> <link href="ie.css" media="screen" rel="stylesheet" type="text/css" /> <![endif]-->
<link rel="icon" href="favicon.ico" />
<link rel="shortcut icon" href="favicon.ico" />
<!--[if IE]> <link rel="shortcut icon" type="image/x-icon" href="favicon.ico"> <![endif]-->
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function()
{
$(".account").click(function()
{
var X=$(this).attr('id');
if(X==1)
{
$(".submenu").hide();
$(this).attr('id', '0');
}
else
{
$(".submenu").show();
$(this).attr('id', '1');
}
});
$(".submenu").mouseup(function()
{
return false
});
$(".account").mouseup(function()
{
return false
});
$(document).mouseup(function()
{
$(".submenu").hide();
$(".account").attr('id', '');
});
});
</script>
<script type='text/javascript' src='jquery.pack.js'></script>
<script type='text/javascript'>
$(function(){
$("a.vote_up").click(function(){
//get the id
the_id = $(this).attr('id');
// show the spinner
$(this).parent().html("<img src='images/spinner.gif'/>");
//fadeout the vote-count
$("span#votes_count"+the_id).fadeOut("fast");
//the main ajax request
$.ajax({
type: "POST",
data: "action=vote_up&id="+$(this).attr("id"),
url: "votes.php",
success: function(msg)
{
$("span#votes_count"+the_id).html(msg);
//fadein the vote count
$("span#votes_count"+the_id).fadeIn();
//remove the spinner
$("span#vote_buttons"+the_id).remove();
}
});
});
$("a.vote_down").click(function(){
//get the id
the_id = $(this).attr('id');
// show the spinner
$(this).parent().html("<img src='images/spinner.gif'/>");
//the main ajax request
$.ajax({
type: "POST",
data: "action=vote_down&id="+$(this).attr("id"),
url: "votes.php",
success: function(msg)
{
$("span#votes_count"+the_id).fadeOut();
$("span#votes_count"+the_id).html(msg);
$("span#votes_count"+the_id).fadeIn();
$("span#vote_buttons"+the_id).remove();
}
});
});
});
</script>
</head>
<body class=" hasJs" style="overflow: hidden;">
<script type="text/javascript">document.getElementsByTagName('body')[0].className += ' hasJs';</script>
<script type="text/javascript">$j('#css-header').remove();</script>
<div id="wrapper">
<div id="toper_frame">
<div id="logo">
<a href="/">LOGO</a>
</div>
<div class="search">
<form action="search.php">
<div id="integrated_search_field-frame">
<input type="text" class="text-frame" autocomplete="off" name="q" size="50" /><input type="submit" class="button_frame" value="Rechercher" Title="Rechercher" />
</div>
</form>
</div>
<?php
$id = $_GET["id"];
$ip = $_SERVER["REMOTE_ADDR"];
$c = mysql_connect("...", "...", "...");
$db = mysql_select_db("...", $c);
$q = "SELECT * FROM dir_pages WHERE id='$id'";
$r = mysql_query($q);
if(mysql_num_rows($r)>0):
while($row = mysql_fetch_assoc($r)):
$effective_vote = $row['votes_up'] - $row['votes_down'];
$result = mysql_query("
SELECT ID_Utilisateur,
Nom_Utilisateur
FROM Comptes_Utilisateurs
WHERE ID_Utilisateur = '" . $_GET["id"] . "'
");
?>
<div id="top-button-piix">
<div class='entry'>
<?php if(isset($_COOKIE["ID_UTILISATEUR"])) { ?>
<span class='votes_count' id='votes_count<?php echo $row['id']; ?>' style='margin-right:15px; font-weight: bold; font-size: 14px; color:#2B60A5;'><?php echo $effective_vote." votes"; ?></span>
<span class='vote_buttons' id='vote_buttons<?php echo $row['id']; ?>'> <a href='javascript:;' class='vote_up' id='<?php echo $row['id']; ?>'>Voter</a> <b><?php echo $_COOKIE["NOM_UTILISATEUR"]; ?> <a href="deconnexion.php" title="Déconnexion">Me déconnecter</a></b> </span>
<?php } else { ?>
<span class='votes_count' id='votes_count<?php echo $row['id']; ?>' style='margin-right:15px;'> <?php echo $effective_vote." votes"; ?>
<a class="account" Title="Connectez-vous pour voter"><span>Connectez-vous pour voter <img src="icons/arrow.png" class="img_arrow" border="0" alt="Select" /></span></a> </span>
<div class="dropdown" style="top: 20px;">
<div class="submenu" style="display: none; width: 195px;">
<ul class="root" style="padding: 15px;">
<li>
<form action="login" method="post">
<font style="font-size: 12px;">Identifiant</font> <input type="text" class="mini-text" name="TB_Nom_Utilisateur" />
<br />
<font style="font-size: 12px;">Mot de passe</font> <input type="password" class="mini-text" name="TB_Mot_de_Passe" />
<br />
<input type="submit" class="mini-button" name="BT_Envoyer" value="Connexion" />
<br />
<br />
<input type="checkbox" name="CB_Connexion_Automatique" style="cursor: pointer;" /> Rester connecté(e)
<br />
<br />
<a href="register">Pas encore inscrit(e) ?!</a>
</form>
</li>
</ul>
</div>
</div>
<?php } ?>
</div>
</div>
</div>
<?php echo $row['url']; ?>
<?php
endwhile;
endif;
?>
</div>
<?php include ("footer.php"); ?>
Et mes tables (avec se dont on a besoin) :
**Comptes_Utilisateurs **
ID_UTILISATEUR bigint (20)
Nom_Utilisateur vachar (20)
dir_pages
id mediumint (8)
ip vachar (15)
url vachar (100)
slogan vachar (100)
votes_up int (11)
votes_down int (11)
Merci pour votre aide ! :)
Réponses apportées à cette discussion
Salut,
là ce n'est pas un problème de code mais de modèle de données et de méthodologie.
Ce qu'il faut en comprendre, c'est qu'on doit pouvoir dfinir qui a voté pour quoi, nous sommes bien d'accord ? Ça implique donc que l'information est stockée quelque part, à priori dans la base de données. Or si on regarde les tables, on ne peut que constater une erreur d'analyse, voici comment modifier ça.
Une règle importante dans la conception des tables d'une base de données, c'est qu'on évitera de stocker des valeurs calculées : donc la table dir_pages ne devrait pas comporter les colonnes votes_up ni votes_down. C'est d'autant plus vrai que dans le cas présent, on a un nombre de vote mais aucune manière d'identifier qui a voté ou non. Il faut donc pouvoir lier les deux tables avec une table relationnelle en partant de principe qu'un utilisateur peut voter pour 0 à n pages et qu'une page peut être soumise à 0 à n utilisateurs, (0 si la page n'est pas accessible et n étant un nombre d'utilisateur ne pouvant excéder le nombre d'inscrits). La table relationnelle comportera donc une clé primaire composite constituée de deux clés étrangères correspondant d'une part à id_utilisateur et d'autre part à id (page).
Le résultat sera alors fort simple : une clé primaire est unique et on pourra définir si l'utilisateur en cours a voté ou non pour la page en cours simplement en vérifiant s'il existe dans cette table relationnelle une ligne comportant à la fois l'identifiant de l'utilisateur et celui de la page. Selon le cas, on affiche ou non le bouton permettant de voter.
Et pour les statistiques, on effectue un simple comptage dans une requête SQL avec la fonction SUM() et éventuellement une clause WHERE pour avoir les informations plus précises sur une page donnée par exemple. Le modèle de données ressemblerait alors à ceci :
+------------------------------------+ +--------------------------------------------+ +-----------------------------+
| comptes_utilisateurs | | utl_votepour_page | | dir_pages |
+-----------------+-------------+----+ +----------------+-------------------+-------+ +---------+--------------+----+
| id_utilisateur | INT(10) | PK | --------- | id_utilisateur | INT(10) | PK/FK | ¸---- | id_page | INT(10) | PK |
| nom_utilisateur | VARCHAR(20) | | | id_page | INT(10) | PK/FK | ----' | url | VARCHAR(100) | |
+-----------------+-------------+----+ | vote | ENUM('up','down') | | | slogan | VARCHAR(100) | |
+----------------+-------------------+-------+ +---------+--------------+----+
Est-ce que cetteapproche est plus claire ?
Je vais tenter ça de suite, c'est en effet beaucoup plus clair, Merciiiiiiiii beaucoup !!!!! :)
J'ai réussi, encore merci à vous ;)