Forums d'entraide informatique - Les forums de PCW

Version complète : Avis de script
Vous consultez actuellement la version basse qualité d'un document. Voir la version complète avec le bon formatage.
Suite au poste de Troll, je vous demande votre avis sur mon script de sondage.

http://familyk29.free.fr/script_sondage

Ne vous en faite pas pour le design, c'est mon prof de techno qui m'a demandé ce script, on l'adaptera ensuite avec son site.

Comment l'ameliorer techniquement parlant?

Sans oublier (l'incredimentation n'est pas mon truc, faudrait que notepad intègre cette fonction Smile ) :

index.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
<head>
<title>Sondage</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<?php
include("choix.php");
echo $titre; //Affichage du titre
?>
<br/><br/>
<!-- Affichage du sondage-->
<form method="post" action="form.php" enctype="multipart/form-data" name="choix" id="choix">
<select name="choix" id="choix">
<!-- Choix à définir dans choix.php -->
<!-- Ne pas toucher au formulaire, sauf pour rajouter une ligne de choix dans le même exemple-->
<option value=""></option>
<option value="<?php echo "$choix1"?>"><?php echo "$choix1"?></option>
<option value="<?php echo "$choix2"?>"><?php echo "$choix2"?></option>
<option value="<?php echo "$choix3"?>"><?php echo "$choix3"?></option>
</select>
<p><input type="submit" value="Voter!" /></p>
</form>
</body>
</html>



form.php


<?php
include("infoscnx.php");
$retour = mysql_query('SELECT COUNT(*) AS nbre_entrees FROM controle_ip WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
$donnees = mysql_fetch_array($retour);

if ($donnees['nbre_entrees'] == 0) // L'ip ne se trouve pas dans la table, on permet le vote, et on ajoute l'ip dans la table
{
if (empty($_POST['choix']))
{
echo 'Vous n\'avez pas sélectionné de choix. Cliquez <a href="javascript:window.history.go(-1)">ici</a> pour revenir a la page précédente';
}
else
{
include("choix.php");
include("infoscnx.php");
mysql_query('INSERT INTO controle_ip VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\')');
if ($_POST['choix'] == "$choix1")
{
mysql_query("INSERT INTO nomdelatable VALUES ('".$_POST['choix']."', '', '', '', '', '', '', '', '')");
}
elseif ($_POST['choix'] == "$choix2")
{
mysql_query("INSERT INTO nomdelatable VALUES ('', '".$_POST['choix']."', '', '', '', '', '', '', '')");
}
elseif ($_POST['choix'] == "$choix3")
{
mysql_query("INSERT INTO nomdelatable VALUES ('', '', '".$_POST['choix']."', '', '', '', '', '', '')");
mysql_close();
}
echo 'Votre vote a bien été enregistré! Cliquez <a href="lire.php">ici</a> pour voir les résultats!';
}

}
else // L'ip se trouve déjà dans la table, on interdit le vote
{
echo 'Vous avez déjà voté. Cliquez <a href="javascript:window.history.go(-1)">ici</a> pour revenir a la page précédente';
}
?>



lire.php


<?php
include("choix.php");
include("infoscnx.php");
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE choix1='$choix1'");
$donnees = mysql_fetch_array($retour);

?>
<hr><br/>
Nombre de réponses pour <?php echo "$choix1"?>: <?php echo $donnees['reponse'];?>
<br/><br/>
<?php
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE choix2='$choix2'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$choix2"?>: <?php echo $donnees['reponse'];?>
<br/><br/>
<?php
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE choix3='$choix3'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$choix3"?>: <?php echo $donnees['reponse'];
mysql_close();
?>
<br/><br/>
<hr>
<br/>

<?php

if ("$titre_archive1" == Aucun)
{

}
else
{
?><u>Archives:</u> <br/><br/>
<?php echo '- <i>'.$titre_archive1.'</i>'; ?><br/>
<br/>
<?php
include("choix.php");
include("infoscnx.php");
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE archive_choix1='$archive1'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$archive1"?>: <?php echo $donnees['reponse'];?>
<br/><br/>
<?php
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE archive_choix2='$archive2'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$archive2"?>: <?php echo $donnees['reponse'];?>
<br/><br/>
<?php
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE archive_choix3='$archive3'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$archive3"?>: <?php echo $donnees['reponse'];
mysql_close();
}
if ("$titre_archive2" == Aucun)
{

}
else
{
?><br/><br/>
<?php echo '- <i>'.$titre_archive2.'</i>'; ?><br/>
<br/>
<?php
include("choix.php");
include("infoscnx.php");
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE archive_choix_2_1='$archive_2_1'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$archive_2_1"?>: <?php echo $donnees['reponse'];?>
<br/><br/>
<?php
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE archive_choix_2_2='$archive_2_2'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$archive_2_2"?>: <?php echo $donnees['reponse'];?>
<br/><br/>
<?php
$retour = mysql_query("SELECT COUNT(*) AS reponse FROM nomdelatable WHERE archive_choix_2_3='$archive_2_3'");
$donnees = mysql_fetch_array($retour);
?>
Nombre de réponses pour <?php echo "$archive_2_3"?>: <?php echo $donnees['reponse'];
mysql_close();
}
?>



choix.php


<?php
$titre = "Selection du titre"; //Titre du sondage
$choix1 = "Choix1"; //Selection du premier choix
$choix2 = "Choix2"; //Selection du second choix
$choix3 = "Choix3"; //Selection du troisième choix
//Si choix supplémentaires, rajouter une ligne en respectant l'ordre des chiffres, et en pensant a rajouter une ligne aussi dans index.php
////////////////
$titre_archive1 = "Aucun"; //Nom du 1er sondage archivé, mettre "Aucun", si aucun sondage a archiver
$archive1 = "Archive_Choix1"; //Premier choix du 1er sondage archivé
$archive2 = "Archive_Choix2"; //...
$archive3 = "Archive_Choix3"; //...
////////////////
$titre_archive2 = "Aucun"; //Nom du 2nd sondage archivé, mettre "Aucun", si aucun sondage a archiver
$archive_2_1 = "Archive_Choix_2_1"; //Premier choix du 2eme sondage archivé
$archive_2_2 = "Archive_Choix_2_2"; //...
$archive_2_3 = "Archive_Choix_2_3"; //...
?>



@Troll: J'ai suivi ton conseil pour la connexion a la bdd Smile

Qu'en pensez-vous?

Alors évidemment comme même un expert aura toujours un code critiquable (je suis pas expert hein Smile ), il y a des choses critiquables :
  • Tout d'abord, j'ai incrémenté ton fichier form.php correctement, l'autre est long donc je ne le ferai pas par contre.
  • Ensuite, je t'avais dit qu'il fallait mettre des guillemets pr les conditions, mais c'est dans le cas d'une chaine decaractères ! Si c'est une variable tu peux les supprimer (si tu compares les chaines de deux variables).
  • Ensuite encore, j'ai rajouté un "else" après les "elseif" en effet... si quelqu'un envoit un autre choix ?
  • Ta fonction "mysql_close()" n'est pas vraiment appelée au bon moment, à moins que tu n'arrêtes le script avant sa fin naturelle (au dernier ?> rencontré), mais ton mysql_close(); à la fin.
  • Dans le où un choix est bien présent, tu rappelles "infocnx.php" et donc tu as deux connexions à ta base... inutile.
  • Je te conseille d'éviter la méthode du ?>codehtml<?php on retourne à php. En effet ainsi ton serveur se dit "Hop php, hop pas php, hop php, hop pas php... et change de "cerveau" de lecture très souvent (puisqu'il ne lit pas de la même manière le PHP et le HTML). Cependant une liste de "echo '';" n'est pas non plus terrible. La meilleur méthode est la suivante :

    
    &amp;#60;?php
    $display = "";
    if&amp;#40;&amp;#41; &amp;#123;
    ...
    $display .= "Réponse a cette condition";
    &amp;#125;
    else &amp;#123;
    ...
    $display.= "Réponse à cette condition 2";
    &amp;#125;
    echo $display;
    mysq_close&amp;#40;&amp;#41;;
    ?&amp;#62;


Ainsi tu ne fais qu'un seul affichage (économie de ressources), et j'utilise ".=" plutot que "=" comme ça si tu veux rajouter quelque-chose au début de $display, ce qui y est inscrit plus tard ne l'écrase pas, ça s'y ajoute.

Voilà après modifications :



&amp;#60;?php
include&amp;#40;"infoscnx.php"&amp;#41;;
$retour = mysql_query&amp;#40;'SELECT COUNT&amp;#40;*&amp;#41; AS nbre_entrees FROM controle_ip WHERE ip=\'' . $_SERVER&amp;#91;'REMOTE_ADDR'&amp;#93; . '\''&amp;#41;;
$donnees = mysql_fetch_array&amp;#40;$retour&amp;#41;;

if &amp;#40;$donnees&amp;#91;'nbre_entrees'&amp;#93; == 0&amp;#41; // L'ip ne se trouve pas dans la table, on permet le vote, et on ajoute l'ip dans la table
&amp;#123;
if &amp;#40;empty&amp;#40;$_POST&amp;#91;'choix'&amp;#93;&amp;#41;&amp;#41;
&amp;#123;
echo 'Vous n\'avez pas sélectionné de choix. Cliquez &amp;#60;a href="javascript&amp;#58;window.history.go&amp;#40;-1&amp;#41;"&amp;#62;ici&amp;#60;/a&amp;#62; pour revenir a la page précédente';
&amp;#125;
else
&amp;#123;
include&amp;#40;"choix.php"&amp;#41;;
mysql_query&amp;#40;'INSERT INTO controle_ip VALUES&amp;#40;\'' . $_SERVER&amp;#91;'REMOTE_ADDR'&amp;#93; . '\'&amp;#41;'&amp;#41;;
if &amp;#40;$_POST&amp;#91;'choix'&amp;#93; == $choix1&amp;#41;
&amp;#123;
mysql_query&amp;#40;"INSERT INTO nomdelatable VALUES &amp;#40;'".$_POST&amp;#91;'choix'&amp;#93;."', '', '', '', '', '', '', '', ''&amp;#41;"&amp;#41;;
&amp;#125;
elseif &amp;#40;$_POST&amp;#91;'choix'&amp;#93; == $choix2&amp;#41;
&amp;#123;
mysql_query&amp;#40;"INSERT INTO nomdelatable VALUES &amp;#40;'', '".$_POST&amp;#91;'choix'&amp;#93;."', '', '', '', '', '', '', ''&amp;#41;"&amp;#41;;
&amp;#125;
elseif &amp;#40;$_POST&amp;#91;'choix'&amp;#93; == $choix3&amp;#41;
&amp;#123;
mysql_query&amp;#40;"INSERT INTO nomdelatable VALUES &amp;#40;'', '', '".$_POST&amp;#91;'choix'&amp;#93;."', '', '', '', '', '', ''&amp;#41;"&amp;#41;;
&amp;#125;
else &amp;#123;
mysql_close&amp;#40;&amp;#41;;
die&amp;#40;"Ce choix n'existe pas, ne trichez pas !"&amp;#41;;
&amp;#125;
echo 'Votre vote a bien été enregistré! Cliquez &amp;#60;a href="lire.php"&amp;#62;ici&amp;#60;/a&amp;#62; pour voir les résultats!';
&amp;#125;

&amp;#125;
else // L'ip se trouve déjà dans la table, on interdit le vote
&amp;#123;
echo 'Vous avez déjà voté. Cliquez &amp;#60;a href="javascript&amp;#58;window.history.go&amp;#40;-1&amp;#41;"&amp;#62;ici&amp;#60;/a&amp;#62; pour revenir a la page précédente';
&amp;#125;
mysql_close&amp;#40;&amp;#41;;
?&amp;#62;





Pour les archives je ne pige pas bien alors je dis rien.

Pour l'affichage il y a ce que j'ai dit au-dessus qui s'applique, mais aussi :



if &amp;#40;"$titre_archive2" == Aucun&amp;#41;



En correcte ça donne :



if&amp;#40;$titre_archive2 == "Aucun"&amp;#41;


Car les strings doivent être entre "", PHP les reconnait quand meme des fois sans les "" mais ca risque de foirer car il peut prendre ca pour une constante.

Enfin, je te conseillerai de réduire le nombre de requetes.

Tu fais 3 requetes pour la même table !

Pourquoi ne pas faire :



$ressource = mysql_query&amp;#40;"SELECT choix FROM tatable ORDER BY choix"&amp;#41;or die&amp;#40;mysql_error&amp;#40;&amp;#41;&amp;#41;;
$compteurs = array&amp;#40;&amp;#41;;
while&amp;#40;list&amp;#40;$choix&amp;#41; = mysql_fetch_row&amp;#40;$ressource&amp;#41;&amp;#41; &amp;#123;
if&amp;#40;$choix == 1&amp;#41; &amp;#123;
$compteurs&amp;#91;1&amp;#93;++;
&amp;#125;
elseif&amp;#40;$choix == 2&amp;#41; &amp;#123;
$compteurs&amp;#91;2&amp;#93;++;
&amp;#125;
elseif&amp;#40;$choix == 3&amp;#41; &amp;#123;
$compteurs&amp;#91;3&amp;#93;++;
&amp;#125;
&amp;#125;




Après bien sûr, à toi de voir, et de remplacer les valeurs.

Une chose encore, penses à mettre des "or die(mysql_error());" derrière tes mysql_query(), sinon quand tu auras une erreur SQL tu auras plus de mal pour le débuggage.

Sinon, dernière chose, ton module de sondage ne pourra gérer qu'un seul sondage par IP, car tu gère les IP dans une table sans dire pour quel sondage c'est, donc si avec mon IP je vote au sondage 1, je pourrai pas voter au sondage 2.



Je crois que c'est tout. :mrgreen:

Alors merci pour ta réponse détaillée, mais j'avoue que j('ai pas trop compris avec les $display et tout ces machins.. Bref je retiendrait pour les " et pour le else si qqun choisi un autre choix.

Il n'y aura qu'un seul sondage a la fois, donc pas de soucis à ce niveau.

Ah et dernière question, existe t-il un programme/logiciel qui incredimenterai le script automatiquement?
Citation :Ah et dernière question, existe t-il un programme/logiciel qui incredimenterai le script automatiquement?

Je me permets d'intervenir d'un point de vue vocabulaire : incrédimenter n'existe pas, tu veux sûrement parler de incrémenter (comment le dit Troll), qui signifie "augmenter une valeur", par exemple (en C/C++):

variable = variable++;


Mais pour le décalage des paragraphes, on appelle plutôt cela indenter, soit faire une indentation.

Voilà, simple mise au point de relou du français Tongue
Cela dit ça peut toujours servir...

Pour tenter de répondre à la question, Eclipse gère l'indentation, si ça n'y est pas par défaut tu peux faire CTRL+SHIFT+F.

Ouais, moi et ma fâcheuse technique de lire en diagonale, je crois comprendre des mots, qui ne veulent rien dire ^^ Merci de m'avoir repris Wink

Je vais regarder ce que propose Eclipse Smile
Oui d'ailleurs la proemière fois j'avais dit (dans l'autre sujet) indentation, et là je crois qu'en lisant ton "incrédimenter" du coup j'ai dû écrire "incrémenter"... :roll:

Je ne connais pas Eclipse mais Notepad++ gère en partie l'indentation, je ne crois pas qu'il aille jusqu'à la faire automatiquement mais si tu regarde sur le site officiel de notepad++ je pense que tu devrais bien trouver un plugin (car ils sont nombreux) qui le fera.

Sinon il y a Quanta+ pour Linux, ou BlueFish (linux également) qui le font. Mais je ne crois pas qu'ils soient disponibles pour Windows.

Remarque, si tu utilises Virtual Desktop tu pourras sûrement utiliser Quanta Plus sous Windows.
Ouais, je vais me pencher sur les plugins, car Eclipse c'est surtout pour programmer le java..
URLs de référence