modification d'un script: trop dur pour moi...

Mammouth du PHP | 790 Messages

26 oct. 2011, 19:53

salut a tous...
je travail avec un script de vote: http://www.masugadesign.com/the-lab/scr ... omment-121
il y a un script qui enregistre le vote des que l'on clic sur une étoile... le script recalcule la moyenne suivant la note et il modifie la ligne concernant l'id de la question...
moi je voudrais l'utiliser comme il fonctionne et en plus j'ai créer un autre table ou je voudrais enregistrer les résultat sous une autre forme.
je voudrais doubler l'enregistrement mais apres une semaine de recherche je n'arrive a rien, voici le script en question:
<?php
header("Cache-Control: no-cache");
header("Pragma: nocache");

require('_config-rating.php'); 

//création des valeur
$vote_sent = preg_replace("/[^0-9]/","",$_REQUEST['j']);
$id_sent = preg_replace("/[^0-9a-zA-Z-]/","",$_REQUEST['q']);
$ip_num = preg_replace("/[^0-9\.]/","",$_REQUEST['t']);
$units = preg_replace("/[^0-9]/","",$_REQUEST['c']);
$ip = $_SERVER['REMOTE_ADDR'];

// suprimer le script parce que les utilisateurs normaux ne le verront jamais.
if ($vote_sent > $units) die("Désolé, le vote a l'air d'être sans fondement."); 


//connexion
$query = mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
$numbers = mysql_fetch_assoc($query);
$checkIP = unserialize($numbers['used_ips']);
$count = $numbers['total_votes']; //votes total
$current_rating = $numbers['total_value']; //valeur calculées
$sum = $vote_sent+$current_rating; // ajoure la nouvelle valeur
$tense = ($count==1) ? "vote" : "votes"; //plural form votes/vote

// contrôle pour voir si le premier vote a été compté 
// ou augmentation du nombre actuel de votes
($sum==0 ? $added=0 : $added=$count+1);

// si c'est la table existe deja a déjà on ajoute les valeurs valeur
((is_array($checkIP)) ? array_push($checkIP,$ip_num) : $checkIP=array($ip_num));
$insertip=serialize($checkIP);

//recherche ip sur les votes
$voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id_sent."' "));
if(!$voted) {     //if the user hasn't yet voted, then vote normally...

	if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // verification adresse ip
		$update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
		$result = mysql_query($update);		
	} 
}
// mise a jour de l'affichage des valeurs
$newtotals = mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id_sent' ")or die(" Error: ".mysql_error());
$numbers = mysql_fetch_assoc($newtotals);
$count = $numbers['total_votes'];//total des votes
$current_rating = $numbers['total_value'];//valeur calculées
$tense = ($count==1) ? "vote" : "votes"; 

// $new_back est ce qui est affiché sur la page après un vote de 'AJAX/Javascript' réussi

$new_back = array();

$new_back[] .= '<ul class="unit-rating" style="width:'.$units*$rating_unitwidth.'px;">';
$new_back[] .= '<li class="current-rating" style="width:'.@number_format($current_rating/$count,2)*$rating_unitwidth.'px;">Current rating.</li>';
$new_back[] .= '<li class="r1-unit">1</li>';
$new_back[] .= '<li class="r2-unit">2</li>';
$new_back[] .= '<li class="r3-unit">3</li>';
$new_back[] .= '<li class="r4-unit">4</li>';
$new_back[] .= '<li class="r5-unit">5</li>';
$new_back[] .= '<li class="r6-unit">6</li>';
$new_back[] .= '<li class="r7-unit">7</li>';
$new_back[] .= '<li class="r8-unit">8</li>';
$new_back[] .= '<li class="r9-unit">9</li>';
$new_back[] .= '<li class="r10-unit">10</li>';
$new_back[] .= '</ul>';
$new_back[] .= '<p class="voted">'.$id_sent.'. Moyenne: <strong><font color="red">'.@number_format($sum/$added,1).'</font></strong>/'.$units.' ('.$count.' '.$tense.') ';
$new_back[] .= '<span class="thanks"><strong>Merci !</strong</span></p>';

$allnewback = join("\n", $new_back);

// ========================

//name of the div id to be updated | the html that needs to be changed
$output = "unit_long$id_sent|$allnewback";
echo $output;
?>
j'ai une session que je doit récupérer mais je doit aussi récupérer l'id du chien pour qui le vote est effectuer, si quelqu'un pouvait m'aiguiller, ce serait super cool...

merci d'avance...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

26 oct. 2011, 20:01

Tu n'as dans ce script qu'une seule requête modifiant des données (une requête UPDATE en l’occurrence).
Donc ta seconde requête doit se faire au même endroit. ;)
if(!$voted) {     //if the user hasn't yet voted, then vote normally...

        if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // verification adresse ip
                $update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
                $result = mysql_query($update);     
                // Ici tu places ton nouveau traitement   
        }
}

Mammouth du PHP | 790 Messages

26 oct. 2011, 20:09

ok , ça j'ai compris, pour le deuxième traitement: c'est bien un INSERT puisque c'est une table ou j'ajoute une nouvelle ligne a chaque vote ? contrairement a ce UPDATE qui lui met a jour une ligne de l'autre table ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

ViPHP
xTG
ViPHP | 7331 Messages

26 oct. 2011, 20:29

En effet, si tu souhaites ajouter une ligne pour chaque vote c'est bien un insert qu'il te faut.

Mammouth du PHP | 790 Messages

26 oct. 2011, 20:50

est ce que ca devrait donner un truc comme ca ?
	if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // verification adresse ip
		$update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
		$result = mysql_query($update);	

		$sql = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note)
		VALUES ('$sum', '$sum', '$sum','$sum')";		
		mysql_query($sql); 
	
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

26 oct. 2011, 22:34

finalement, avec ton aide et un peut de recherche, j'ai trouver:
	if (($vote_sent >= 1 && $vote_sent <= $units) && ($ip == $ip_num)) { // verification adresse ip
		$update = "UPDATE $rating_dbname.$rating_tableName SET total_votes='".$added."', total_value='".$sum."', used_ips='".$insertip."' WHERE id='$id_sent'";
		$result = mysql_query($update);	

		$req = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note) VALUES ('".$question."','1','3','".$vote_sent."')";
		$result = mysql_query($req);	
maintenant, vu que ce script n'a rien a voir avec mon site, je voudrais bien savoir comment faire passe l'id de la page chien qui est affiché et aussi l'id de session en cours, je doit savoir le faire mais je voudrais bien que quelqu'un me donné le principe, svp...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

26 oct. 2011, 22:38

salut,

presque la requete est surement bonne mais les données non !

la tu insère 4 fois la même chose ce n'est pas logique ;)

de plus je pense qu'ici id représente la clef primaire et que donc il est préférable de ne pas l'indiquer, mysql fera le boulot pour toi ;)

$sql = 'INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id_chien, note) VALUES (\''.$id_question.'\', \''.$id_chien.'\', \''.$note.'\')";

par exemple, a toi de voir où tu récupère id_question, id_chien et la note dans le reste du code.

edit : trop tard :/ sauf pour l'id !

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 790 Messages

26 oct. 2011, 22:41

non, regarde j'ai re poster juste avant toi, j'ai réussi et maintenant je cherche a récupérer l'id du chien affiché et l'id de session mais ???
qui eux ne sont pas dans ce script
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

26 oct. 2011, 22:46

l'id c'est l'id de session et id_chien c'est l'id du chien qui est affiché sur la page après une recherche dans la bdd
regarde, ya pas d'auto increment:
  `id_question` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `id_chien` int(11) NOT NULL,
  `note` int(11) NOT NULL,
  `signup_date` date NOT NULL,
  PRIMARY KEY (`id_question`,`id`,`id_chien`),
  KEY `fk_questionnaire1` (`id_question`),
  KEY `fk_user2` (`id`),
  KEY `fk_chien3` (`id_chien`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
j'ai besoin de connaitre tout les champs
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

26 oct. 2011, 23:12

bon, j'ai réussi aussi pour l'id_chien mais pour l'id de session, je pèche.
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 oct. 2011, 07:28

hum ok un clef primaire multiple.

pour l'id de session, si c'est la session php session_id(); sinon c'est une info que tu doit passer de page en page s'il s'agit d'une sélection faite avant par le "client".

dans ton script de vote l'identification se fait sur l'ip du votant, et il semble que cela soit la seul info le concernant. info peux fiable mais c'est une première info (après faut un "espace membre").

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 790 Messages

27 oct. 2011, 09:29

oui, c'est ok, j'ai une session et un espace membre, ya même un mini forum et en fait je voudrais bien changer l'adresse ip du visiteur par son id...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 oct. 2011, 10:15

dans ce cas si le visiteur est connecté, via la session tu a son id (en régle général cet id est dans la variable $_SESSION).

ce qui fait que dans ce cas il 'suffit' de remplacer $ip_visit pas $_SESSION['id'] et dans la requete insert c'est le 1 par cette variable
<?php
 $req = "INSERT INTO ${rating_dbname}.${rating_tableName_2} (id_question, id, id_chien, note) VALUES (".$question.", {$_SESSION['id']},3,".$vote_sent.")";
?>
Attention c'est une très mauvaise idée d'utiliser des nombres comme des chaines de caractère. seules les chaines de caractère et les dates doivent être "encapsulées" par des ' (simple quote).
bon ok ça fonction mysql est sympa et fait un "auto cast" en entier.

mais avec cette logique tu va finir par sortir un limit "1" et la c'est foutu erreur de syntaxe :)

donc autant prendre de bonne habitude ;)

je ne sais pas si cela est fait avant mais je te conseil d'utiliser mysql_real_escape_string pour protéger tes données ;)

ps : pour la clef multiple, perso je préfère une clef auto incrémenté c'est plus simple a gérer ;) (enfin c'est mon avis a moi perso, mais vu que d'autre le pense pour d'autre raison certainement plus valable j'me dit que j'ai pas forcément tort :) )

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 790 Messages

27 oct. 2011, 10:31

si je comprend bien, ca donne ca:
		$req = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note, signup_date) VALUES (".$question.","$_SESSION['id']",".$chien.",".$vote_sent.",".time().")";
		$result = mysql_query($req);
mais la plus rien ne s'enregistre. amon avis, la session n'est pas prise en compte, le script fonctionne hors de mon site...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 oct. 2011, 10:54

oula, manque deux points dans la concaténation de la requête (tu devrais avoir une belle erreur, si ce n'est pas cas il faudrait mettre le niveau d'erreur à E_ALL|E_STRICT, si php5 lorsque tu developpe).
$req = "INSERT INTO $rating_dbname.$rating_tableName_2 (id_question, id, id_chien, note, signup_date) VALUES (".$question.",".$_SESSION['id'].",".$chien.",".$vote_sent.",".time().")";

qu'entend tu par en dehors du site ?
si tu n'est pas obligé d'être "connecté" pour utiliser ce fichier il faut prévoir les deux cas.
si une connexion existe tu insère l'id sinon l'adresse ip.

il te faut un session_start() enhaut de la page et ensuite un isset sur $_SESSION['id'] pour savoir si la personne est connectée ou non.
en fonction du isset tu créer une variable (genre $id_client) quivaut ou $_SESSION['id'] ou l'ip (le else).

après tu insère le tout ;)

@+
Il en faut peu pour être heureux ......