Problème php pour un système de sondage

  • Auteur de la discussion Auteur de la discussion mikaweb
  • Date de début Date de début
WRInaute discret
Bonsoir tout le monde,

Je viens vous demander un coup de main car là je planche sur quelques problèmes dont je n'arrive pas toujours à résoudre leur nature. :(

J'ai créé un système de sondage avec 2 petits fichiers, un nommé sondages_admin.php et l'autre sondage_public.php

J'ai 2 tables MySql qui se nomment sondages et sondages_rep

Pour sondages :
id => int(255) en auto-index et clé index
question => varchar(120)
date => datetime

sondages_rep :
refer => int(255) defaut = 0
reponse => varchar(50)
hits => mediumint(255) defaut = 0

Voici le code de sondage_public
Code:
<?php
//Connexion a la base de donnée
require_once('connect_forum.php');
connexion_portail();

// "Magic Quotes"
set_magic_quotes_runtime(0);

// Ajout d'anti-slashes selon "Magic Quotes"
function AuAddSlashes($chaine) {
        return(get_magic_quotes_gpc() == 1 ? $chaine : AddSlashes($chaine));
}
// Retire les anti-slashes selon "Magic Quotes"
function AuStripSlashes($chaine) {
        return(get_magic_quotes_gpc() == 1 ? StripSlashes($chaine) : $chaine);
}
$site_cookie = "gunners"; // Debut de nom du cookie :?: 
// Affichage des resultats          Problème ici ???? :?: 
$resultats = 0;
if (!empty($HTTP_COOKIE_VARS[$site_cookie."sondage".$id])) {
        $resultats = 1;
}

// Extraction des infos sur le sondage
if (isset($id) && is_numeric($id)) {
        $q = mysql_query("SELECT *, TO_DAYS(NOW()) - TO_DAYS(date) AS depuis FROM sondages WHERE id = $id");
}
else {
        $q = mysql_query("SELECT *, TO_DAYS(NOW()) - TO_DAYS(date) AS depuis FROM sondages ORDER BY date DESC LIMIT 1");
}
$r = mysql_fetch_array($q);
$id = $r["id"];
$son_q = $r["question"];
$son_depuis = $r["depuis"];

// Ajout d'un vote   Problème ici ???? :?: 
if (isset($id) && is_numeric($id) && isset($vote) && empty($HTTP_COOKIE_VARS[$site_cookie."sondage".$id])) {
        mysql_query("UPDATE sondages_rep SET hits = hits + 1 WHERE reponse = '".AuAddSlashes($vote)."' AND refer = $id");
        setCookie($site_cookie."sondage".$id, "1", time() + (3600 * 24));
        header("Location: sondage_public.php?id=".$id);
}

// Total de votes
$q = mysql_query("SELECT SUM(hits) AS num FROM sondages_rep WHERE refer = $id");
$r = mysql_fetch_array($q);
$total = $r["num"];
?>
<?php
include('design/haut_inc.php');
?>
<?php
// Affichage des ses reponses
if ($resultats == 1) {
        echo "<p><b>".htmlentities($son_q)."</b></p>\n";
        echo "<table cellspacing=\"0\" cellpadding=\"0\">\n";
        $q1 = mysql_query("SELECT *, TRUNCATE((CEILING(hits / ".$total." * 1000) / 10), 1) AS pourcent FROM sondages_rep WHERE refer = $id");
        echo mysql_error();
        while ($r1 = mysql_fetch_array($q1)) {
                echo "<tr><td><p>".htmlentities($r1["reponse"])."</p></td><td><p><img src=\"themes/".$theme."/barre.gif\" border=\"0\" height=\"10\" width=\"".ceil($r1["pourcent"] * 1.5)."\"></p></td><td><p>".$r1["pourcent"]."%</p></td></tr>\n";}
        echo "<tr><td><p><b>Total :</b></p></td><td><p><img src=\"themes/".$theme."/barre.gif\" border=\"0\" height=\"10\" width=\"150\"></p></td><td><p>100%</p></td></tr>\n";
        echo "</table>\n";
}
// Affichage du formulaire
else {
        echo "<p><b>".htmlentities($son_q)."</b></p>\n";
        echo "<form action=\"sondage_public.php\" method=\"post\">\n";
        echo "<p><input type=\"hidden\" name=\"id\" value=\"".$id."\"/></p>";
        echo "<table cellspacing=\"0\" cellpadding=\"0\">\n";
        $q1 = mysql_query("SELECT reponse FROM sondages_rep WHERE refer = $id");
        echo mysql_error();
        while ($r1 = mysql_fetch_array($q1)) {
                echo "<tr><td><input type=\"radio\" name=\"vote\" value=\"".htmlentities($r1["reponse"])."\"/></td>
                <td><p>".htmlentities($r1["reponse"])."</p></td></tr>\n";
        }
        echo "<tr><td colspan=\"2\"><input type=\"submit\" value=\"Voter\"/></td></tr>";
        echo "</table>\n";
        echo "</form>\n";
        echo "<p>Voter afin de voir les résultats.</p>\n";
}
echo "<p>Il y a eu ".$total." vote(s) depuis ";
$son_depuis > 1 ? print($son_depuis." jours") : print($son_depuis." jour");
echo ".</p>\n\n";

// Tous les sondages
$q1 = mysql_query("SELECT *, DATE_FORMAT(date, '$site_date_j') AS dateh FROM sondages ORDER BY date DESC");
while ($r1 = mysql_fetch_array($q1)) {
        echo "<p> - <b><a href=\"sondage_public.php?id=".$r1["id"]."\">".htmlentities($r1["question"])."</a></b> (créé ".$r1["dateh"].")</p>\n";
}
?>
</div><div id="footer"></div>
</body>
</html>

Niveau design tout s'affiche comme je le souhaite en partie publique, j'ai ma question qui s'affiche et mes réponses en type radiobox qui s'affichent aussi. Le souci est que lorsque je clique sur l'une des réponses et que j'envoie ben sa me ramène sur la même page sans avoir traité la demande, les votes ne changent pas. Peux etre un problème de cookies ? Je ne suis pas trop callé la-dedans...


Maintenant mon second souci touche le fichier sondages_admin.php dont voici le code.

Code:
<?php
//Connexion a la base de donnée
require_once('connect_forum.php');
connexion_portail();

// "Magic Quotes"
set_magic_quotes_runtime(0);

// Ajout d'anti-slashes selon "Magic Quotes"
function AuAddSlashes($chaine) {
        return(get_magic_quotes_gpc() == 1 ? $chaine : AddSlashes($chaine));
}
// Retire les anti-slashes selon "Magic Quotes"
function AuStripSlashes($chaine) {
        return(get_magic_quotes_gpc() == 1 ? StripSlashes($chaine) : $chaine);
}
// Creation de l'index
function creerIndex($requete, $maximum) {
        global $deb, $total, $max, $commence;
        if ($deb <= 0 || !is_numeric($deb) || !isset($deb)) {
        $deb = 0;}
        $max = $maximum;
        $q = mysql_query($requete);
        $r = mysql_fetch_array($q);
        $total = $r["num"];
        $commence = $deb * $max;
}
// Convertisseur texte en HTML compatible
function conv($chaine, $nobr = 0) {
        $chaine = htmlentities($chaine);
        if ($nobr != 1) {
        $chaine = nl2br($chaine);}
        $chaine = str_replace("&lt;", "<", $chaine);
        $chaine = str_replace("&gt;", ">", $chaine);
        $chaine = str_replace("&quot;", "\"", $chaine);
        $chaine = str_replace("[<]", "&lt;", $chaine);
        $chaine = str_replace("[>]", "&gt;", $chaine);
        return $chaine;
}
// Navigateur de pages
function navBarre2($plus) {
        global $total, $deb, $max, $PHP_SELF;
        if ($total > $max) {
                echo "<p>";
                if ($deb > 0) {
                        echo "<a href=\"".basename($PHP_SELF)."?deb=".($deb - 1).$plus."\">&lt; ".$max." précédentes &gt;</a>&nbsp;";}
                if ($total > ($deb + 1) * $max) {
                        echo "&nbsp;<a href=\"".basename($PHP_SELF)."?deb=".($deb + 1).$plus."\">&lt; ".$max." suivantes &gt;</a>";}
                echo "<br />\n";
                for ($i = 0; $i < ceil($total / $max); $i++) {
                        if ($i == $deb) {
                                echo "(<b>".($i + 1)."</b>) ";}
                        else {
                                echo "(<a href=\"".basename($PHP_SELF)."?deb=".$i.$plus."\">".($i + 1)."</a>) ";}
                }
                echo "</p>\n\n";
        }
}
// Ajouter une ligne
function ligne($id, $titre, $modifier, $supprimer, $activer, $imgnum, $plus = "") {
        global $PHP_SELF;
        $fichier = basename($PHP_SELF);
        echo "<b>".conv($titre)."</b>";
        if ($activer == 1) {
                echo "(<a href=\"$fichier?action=activer&amp;id=".$id.$plus."\">Activer</a>)";}
        if ($modifier == 1) {
                echo "(<a href=\"$fichier?action=modifier&amp;id=".$id.$plus."\">Modifier</a>)";}
        if ($supprimer == 1) {
                echo "(<a href=\"$fichier?action=supprimer&amp;id=".$id.$plus."\">Supprimer</a>)";}
        echo "\n";
}

// Ajouter un sondage
if ($poster == 1) {
        mysql_query("INSERT INTO sondages (question, date) VALUES('".AuAddSlashes($question)."', NOW())");
        $q = mysql_query("SELECT id FROM sondages ORDER BY date DESC LIMIT 1");
        $r = mysql_fetch_array($q);
        for ($i = 0; $i < 15; $i++) {
                if (!empty($rep[$i])) {
                        mysql_query("INSERT INTO sondages_rep (refer, reponse, hits) VALUES (".$r["id"].", '".AuAddSlashes($rep[$i])."', '".AuAddSlashes($vote[$i])."')");}
        }
}
// Modifier un sondage
elseif (isset($modifier) && is_numeric($modifier)) {
        $action = "modifier";
        $id = $modifier;
        mysql_query("UPDATE sondages SET question = '".AuAddSlashes($question)."' WHERE id = $modifier");
        mysql_query("DELETE FROM sondages_rep WHERE refer = $modifier");
        for ($i = 0; $i < 15; $i++) {
                if (!empty($rep[$i])) {
                        mysql_query("INSERT INTO sondages_rep (refer, reponse, hits) VALUES (".$modifier.", '".AuAddSlashes($rep[$i])."', '".AuAddSlashes($vote[$i])."')");}
        }
}
// Supprimer un sondage
elseif ($action == "supprimer" && isset($id) && is_numeric($id)) 
{
        mysql_query("DELETE FROM sondages WHERE id = $id");
        mysql_query("DELETE FROM sondages_rep WHERE refer = $id");
}
?>

<?php
include('design/haut_inc.php');
?>
<p><a href="sondage_public.php">Liste des sondages</a> - <a href="sondages_admin.php?action=ajouter">Ajouter un sondage</a></p>
<?php
// Ajouter un sondage
if ($action == "ajouter") {
        echo "<p>Ajouter un sondage</p>\n";
        echo "<form action=\"sondages_admin.php\" method=\"post\">\n";
        echo "<input type=\"hidden\" name=\"poster\" value=\"1\"/>\n";
        echo "<table cellspacing=\"0\" cellpadding=\"5\" border=\"0\">\n";
        echo "<tr><td><b>Question :</b></td><td><input type=\"text\" name=\"question\"/></td><td>&nbsp;</td><td>&nbsp;</td></tr>\n";
        for ($i = 0; $i < 15; $i++) {
                echo "<tr><td>Réponse ".($i + 1)." :</td><td><input type=\"text\" name=\"rep[".$i."]\"></td><td>Votes :</td>
                <td><input type=\"text\" name=\"vote[".$i."]\" value=\"0\"/></td></tr>\n";}
        echo "<tr><td colspan=\"4\"><input type=\"submit\" value=\"Ajouter le sondage\"/></td></tr>\n";
        echo "</table>\n";
        echo "</form>\n";
}

// Modifier un sondage
elseif ($action == "modifier" && isset($id) && is_numeric($id)) {
        $q = mysql_query("SELECT * FROM sondages WHERE id = $id");
        $r = mysql_fetch_array($q);
        echo "<p>Modifier un sondage</p>\n";
        echo "<form action=\"sondages_admin.php\" method=\"post\">\n";
        echo "<input type=\"hidden\" name=\"modifier\" value=\"".$r["id"]."\"/>\n";
        echo "<table cellspacing=\"0\" cellpadding=\"5\" border=\"0\" align=\"center\">\n";
        echo "<tr><td><b>Question :</b></td><td><input type=\"text\" name=\"question\" value=\"".$r["question"]."\"/></td><td>&nbsp;</td><td>&nbsp;</td></tr>\n";
        $q1 = mysql_query("SELECT * FROM sondages_rep WHERE refer = ".$r["id"]." ORDER BY reponse");
        $i = 0;
        while ($r1 = mysql_fetch_array($q1)) {
                echo "<tr><td>Réponse ".($i + 1)." :</td><td><input type=\"text\" name=\"rep[".$i."]\" value=\"".$r1["reponse"]."\" /></td><td>Votes :</td>
                <td><input type=\"text\" name=\"vote[".$i."]\" value=\"".$r1["hits"]."\"/></td></tr>\n";
                $i++;}
        while ($i < 15) {
                echo "<tr><td>Réponse ".($i + 1)." :</td><td><input type=\"text\" name=\"rep[".$i."]\" /></td><td>Votes :</td>
                <td><input type=\"text\" name=\"vote[".$i."]\" value=\"0\"/></td></tr>\n";
                $i++;}
        echo "<tr><td colspan=\"4\" align=\"center\"><input type=\"submit\" value=\"Modifier le sondage\"/></td></tr>\n";
        echo "</table>\n";
        echo "</form>\n";
}

// Liste des sondages
else {
        // Creation de l'index
        creerIndex("SELECT COUNT(*) AS num FROM sondages", 20);
        // Affichage des news sur le site
        echo "<p>Liste des sondages :</p>\n";
        $q = mysql_query("SELECT id, CONCAT(question, ' / Date : ', DATE_FORMAT(date, '%d/%m/%Y')) AS titre2 FROM sondages ORDER BY date DESC LIMIT $commence, $max");
        $i = 0;
        while ($r = mysql_fetch_array($q)) {
                $i ++;
                ligne($r["id"], $r["titre2"], 1, 1, 0, $i);}
}
?>
</div><div id="footer"></div>
</body>
</html>
Là le(s) soucis sont différents, je n'arrive même pas à créer un sondage lorsque je clique sur ajouter un sondage.
Souci identique sur modifier ou tout simplement sur supprimer, rien ne se passe alors que visuellement c'est ce que je désire.
Je vous remercierais de prêter un peu attention à mes petits soucis ce serait vraiment sympa ^^

Cordialement,

Mikaweb

Si vous avez des questions, je restent à disposition. ;)

ps: me conceriez vous d'utiliser simplement un système d'ip que je stocke en bdd ou bien le système de cookies ?
Est ce que mes tables sont bien choisies ? Pas trop gros, de trucs superflus ?

Un gros merci d'avance car là je sèche. :(
 
Nouveau WRInaute
Bonjour, ou plutôt bonsoir :D

je n'arrive pas a dormir, je m'ennuie alors, je lit les forum ^^

pour ton problème, c'est que ton script est prévu pour fonctionner avec register global à on et que maintenant, il est sur off partout ou presque.

pour régler ton problème, ne surtout pas le passer à on, mais modifier ton script ;)

voila un exemple de modification à faire :
dans ton code, tu as :
Code:
// Extraction des infos sur le sondage 
if (isset($id) && is_numeric($id) && isset($vote)
qui devrait être écrit comme cela :
Code:
// Extraction des infos sur le sondage 
if (isset($_POST['id']) && is_numeric($_POST['id']) && isset($_POST['vote'])

en fait, toutes les valeurs passée par ton formulaire, doivent être récupérée par $_POST['nomdelavaleur'] et non pas par $nomdelavaleur

Bonne continuation :wink:
 
WRInaute occasionnel
Je t'aurais bien répondu, mais y'a trop de code et pas assez d'explications.... Donc je te donne ma vision des choses pour la réalisation d'un sondage

Les tables:
( PK ) = primary key, clé primaire
( FK -> table.champ ) = foreign key, clé étrangère sur le champ "champ" de la table "table"

s_sondage
----------
id_sondage ( PK ) INT(4)
question_sondage VARCHAR(255)
etat_sondage TINYINT(1)

s_option
--------
id_option ( PK ) INT(5)
id_sondage ( FK -> s_sondage.id_sondage ) INT(4)
libelle_option VARCHAR(255)

s_vote
------
id_vote ( PK ) INT(7)
id_sondage ( FK -> s_sondage.id_sondage ) INT(4)
id_option ( FK -> s_option.id_option ) INT(5)
date_vote INT(11)
ip_vote VARCHAR(20)

Un vote s'applique à une option.
Une option appartient à un sondage.

Avec une structure comme celle-ci, il sera pas très compliqué de coder une classe Sondage, qui pourrait ressembler à ca ( uml simplifié ):

sondage.jpg


Une remarque générale sur ton code... essaye de bien séparer tes traitements de ton affichage. Une requete sql suivie d'un "echo", c'est un enfer à maintenir si tu veux revoir ton code dans 6 mois :s
 
WRInaute discret
Désolé pour les commentaires de mon code et sa longueur ;)

Je vais voir ce que je peux faire pour améliorer la chose, vous tient au courant et merci de votre aide.
 
WRInaute discret
NextGeneration, pourrait tu m'expliquer l'utilité de la seconde table car là sa m'échappe :D
Est-ce les options possibles dans le vote ? Ou bien autre chose, je ne veux pas paraitre stupdide mais j'ai décidé de tout reprendre à zéro comme toi tu voie la chose, sa me semble un peu plus correct ;)

Merci.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut