Je bloque sur un système de vote !

Eléphant du PHP | 113 Messages

24 sept. 2006, 10:14

Bonjour,
Sur mon site, le visiteur a la possibilité de noter les citations. N'étant pas expert ( je serais plus à l'opposé :wink: ), j'ai utilisé le script pré établi Easy-votes et qui fonctionne très bien.

Ce script n'utilise pas de bdd mais crée un fichier texte pour chaque citation votée, il le nomme avec l'id de la citation. Dans ce fichier, il écrit le total des notes cumulées et le total des votants. Ensuite, il fait le ratio et le retranscris sur ma page en étoile de 1 à 5.

Désolé, j'ai besoin d'expliquer tout ça pour bien comprendre mon problème.
Et le problème, c'est que les visiteurs mettent facilement la note de 5 et je me retrouve avec plein (ou trop) de 5 étoiles. Du coup, le système perd un peu de son intérêt.
L'idée est que de temps en temps, en un clic, je diminue toutes les notes de 10 % par ex.

J'ai alors commencé à modifier le script et en même temps qu'il crée le fichier texte, j'incrémente ma base d'un nouveau champs "score" correspondant au total des notes et d'un autre nouveau champ "votes" pour les votants. j'ai aussi créé le script qui me descend le champs score de 10%.

Ce que je n'arrive pas à faire, c'est dire au script Easy-votes d'aller chercher les valeurs dans la bdd et non plus dans les fichiers texte.
Et ensuite, je pourrais supprimé la création de ces fichiers.

Je suis contient de vous demander beaucoup et aussi que j'essaie des trucs qui ne sont pas trop à ma portée et c'est pourquoi je voudrais savoir si quelqu'un est intérressé pour m'aider avant de surcharger le forum avec les scripts à modifier.

:?

Merci.

Mammouth du PHP | 19672 Messages

24 sept. 2006, 10:28

Salut,
de toutes façons, on ne modifiera pas tes scripts, c'est toi qui va le faire, ici, on t'apportera les indicaions et/ou les explications nécessaires.

J'ai pas trop compris l'histoire des tes votes ne correspondant pas à ce que tu attends ni l'intérêt que tu as de les bidouiller pour fausser les résultats : cette manipuation rend le vote tout court complètement sans intérêt si tu adaptes les résultats à ce que toi tu espères.

Ceci dit, pour transposer vers un enregistrement des résultats en base de données, il faut identifier chaque donnée pour concevoir la base en question et ensuite transformer les scripts d'écriture de fichier en requêtes SQL.

Dis-nous sur quel point tu bloques et illustre ton propos avec les portions pertinentes du code utilisé.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 113 Messages

24 sept. 2006, 10:52

Bien entendu, j'ai jamais dit de m'apporter le code tout fait sur un plateau. :wink:

Et pour le résultat, le verbe "fausser" est un peu fort puisqu'il s'agit de diminuer tout les résultats de 10% sans favoriser plus une citation que l'autre.
Simplement, moi je vois, en 5 étoiles, l'excellent ou le grandiose et certains visiteurs y voient un "très bien". C'est une question de point de vue. Je veux juste ré-étalonner tout ça car n'avoir que des 5 nuit justement à l'intérêt du vote.

Donc pour le code, c'est ici qu'il crée et récupère les données des fichiers texte:
<?
if (isset($submit))
{
$fp = fopen("votes/$idcom.txt", "r");
$ligne = fgets($fp,4096);

// Acquisition des variables

$tt_votes = strrchr($ligne, "|");
$tt_votes = str_replace("|", "", $tt_votes);
$tt_votes = trim($tt_votes);
$ligne = strrev($ligne);
$nb_votes = strrchr($ligne, "|");
$nb_votes = strrev($nb_votes);
$nb_votes = str_replace("|", "", $nb_votes);
$nb_votes = trim($nb_votes);
fclose($fp);

// Calculs

$nb_votes++;
$tt_votes = $tt_votes + $note;

// Création du fichier s'il n'existe pas

if (!file_exists("votes/$idcom.txt"))
{ touch("votes/$idcom.txt"); }

// Ajout des données

$fp = fopen("votes/$idcom.txt","w");
fputs($fp, "$nb_votes|$tt_votes");
fclose($fp);
echo("<script language=\"javascript\">alert('Votre vote a été pris en compte!'); window.close();</script>");

?>
et
<script language="JavaScript" src="vote/easy-votes-light.php?idcom=
<?php echo"$row[id]"; ?>&rep=vote" type="text/javascript"

></script>

Mammouth du PHP | 19672 Messages

24 sept. 2006, 10:58

Bon ok, on a le code mode fichier texte : et...:?: là, il manque la question, tu ne crois pas ? Où est ton problème spécifique ? J'avais cru comprendre que tu voulais passer à un système avec base de données : où est le code pour ça ? Même faux, il servira de point de départ pour peu que tu nous indiques sur quel point tu cales.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 113 Messages

24 sept. 2006, 11:22

Oups !

Mais l'insertion dans la base des notes et des votants fonctionne.
Là ou je sèche, c'est comment récupérer mes champs "score" et "votes" se trouvant dans la table "citations_celebres" à la place du fichier texte ?
<? 
if (!isset($idcom))
$idcom = $idcit;
// Voir si répertoire est le même

if (isset($rep)) { $cherchoui = "$rep/votes"; }
else		 { $cherchoui = "votes"; } 

if (file_exists("votes/$idcom.txt")) {

$fp = fopen("votes/$idcom.txt", "r");
$ligne = fgets($fp,4096);

// Acquisition des variables

$tt_votes = strrchr($ligne, "|");
$tt_votes = str_replace("|", "", $tt_votes);
$tt_votes = trim($tt_votes);

$ligne = strrev($ligne);
$nb_votes = strrchr($ligne, "|");
$nb_votes = strrev($nb_votes);
$nb_votes = str_replace("|", "", $nb_votes);
$nb_votes = trim($nb_votes);

fclose($fp);

// Calculs :

if (($tt_votes == 0) AND ($nb_votes == 0))
{
// Si fichier vide
$etoiles_oui = 0;
$etoiles_non = 0;
$note = "0.00";
}
else
{
$moy_en = $tt_votes/$nb_votes;
$etoiles_oui = round($moy_en);
$etoiles_non = 5-$etoiles_oui;
$etoiles_non = round($etoiles_non);
$note = round($moy_en, 2);
}

?>

document.write("<a title=\"<? echo("Notez cette citation!"); ?>\" href=\"#\" OnClick=\"window.open('<? if (isset($rep)){echo("$rep/");} ?>easy-votes-vote.php?idcom=<? echo("$idcom"); ?>','','toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,copyhistory=0,menuBar=0,width=300,height=130');return(false)\">");

<?

for($x = 0; $x < $etoiles_oui; $x++) { echo("document.write(\"<img align='absmiddle' border='0' src='$cherchoui/oui-light.gif'>\");"); }

for($x = 0; $x < $etoiles_non; $x++) { echo("document.write(\"<img align='absmiddle' border='0' src='$cherchoui/non-light.gif'>\");"); }

echo("document.write(\" \");");

?>
document.write("</a>");
<?
}
else
{
// Si le fichier n'existe pas
?>
document.write("<a title=\"<? echo("Notez cette citation"); ?>\" href=\"#\" OnClick=\"window.open('<? if (isset($rep)){echo("$rep/");} ?>easy-votes-vote.php?idcom=<? echo("$idcom"); ?>','','toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0,copyhistory=0,menuBar=0,width=220,height=112');return(false)\"><img align=\"absmiddle\" border=\"0\" src=\"<? echo("$cherchoui"); ?>/voter.gif\" width=\"11\" height=\"11\"> Voter!</a>");
<?

Mammouth du PHP | 19672 Messages

24 sept. 2006, 12:30

Le code que tu montres n'a qu'un rapport relativement lointain avec ta question : tu demandes comment récupérer des informations dans la base et le code génère du code JavaScript...

C'est la structure des tables correspondantes et ta requête SQL qu'il serait approprié d'indiquer, tu ne crois pas ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 113 Messages

24 sept. 2006, 13:38

Quelle requete ?
J'ai du mal à suivre :!:

Je voudrais simplement savoir si c'est possible d'utiliser dans ce script mes champs votes et score à la place de ces mêmes données du fichier texte.
Et si ça l'est... comment ?

Si la requete que tu me demandes c'est d'aller chercher mes 2 champs dans la bdd, ce n'est pas encore fait et je ne pense pas que ça posera problème.
C'est plutôt de les utiliser dans ce script.

Et ma table, et ben, elle s'appelle "citations_celebres" et contient les champs id, citation, votes, score et un dernier, numcitateur relatif à l'auteur de la citation mais qui ne m'est utile ici.

Mammouth du PHP | 19672 Messages

24 sept. 2006, 13:57

Quelle requete ?
J'ai du mal à suivre :!:
:shock: On est mal barrés là... est-ce que ce serait trop demander que de t'inviter à faire preuve d'un tout petit minimum de logique. Où sont récupérées tes informations dans la base depuis ce code ? Pour ma part, je ne les vois nulle part : comment donc voudrais-tu pouvoir leur appliquer un quelconque traitement ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 113 Messages

24 sept. 2006, 18:26

Pour info, c'est un peu pour ça que je poste dans "Débuter en PHP" :!: :!: :!:

Mammouth du PHP | 19672 Messages

24 sept. 2006, 20:36

Débuter n'implique pas obligatoirement un manque de logique. Tu dois décomposer ton problème général en éléments plus petits à traiter les uns après les autres.

Par exemple, tu dois traiter des données en provenance d'une base de données : il y a d'une part la récupération de ces données et ensuite le traitement à y appliquer.

La récupération des données implique une connexion au serveur de base de données, l'exécution d'une recquête et la récupération du retour.

Vas-y étape par étape. Considère aussi que je ne vois pas ta machine, je ne vois pas ton code et je n'ai aucune vision générale de ton application. Si tu donnes des éléments fragmentaires, il sera difficile de te donner une réponse précise.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: