Page 1 sur 1

derniere requete sur tableau

Posté : 23 oct. 2007, 08:25
par choubix
hello,

dans le script ci dessous je voudrais que pour les utilisateurs ayant 1 numero juste sur la grille recoivent 100 points, 2 numeros: 200 pts etcetc.

tout marche au poil jusqu'a la requete d'insertion qui plante :(

normalement apres celle ci: j'ai fini! :)

merci

qq un pourrait me dire ce que je fais mal?? (a mon avis c'est la boucle que je place au mauvaus endroit (entre autre...)
$query = ("SELECT * FROM grids_clients WHERE timeplayed BETWEEN $dateprevious AND $datecurrent");
$run_query = mysql_query($query) or die('Invalid query: ' . mysql_error());

//initialize counter: used to extract grids played by clients depending on the date 
$counter = mysql_num_rows($run_query);
print "$counter<br><br><br>";


//loop starts
$i = 0;
while ($i < $counter)
{
$id_clients = mysql_result($run_query,$i,"id_clients");
$temp_grids = mysql_result($run_query,$i,"grids_1");
$client_grids = strtoArray($temp_grids);


//returns the difference between the lucky draw and the grids played by the client. returns a string
$diff = count(array_diff($client_grids, $draw));
$win = 6 - $diff;

//add data to recursive array
$array[$i]=array("win"=>$win,"id_clients"=>$id_clients);

list($key, $val) = each($array[$i]);

//inserer une loop avec pour parametre $key
$j = 0;
while($j < $counter)
{
$points = $key*100;


$query= ("INSERT INTO winners (id_winner, winning_numbers, date) VALUES ('$val', '$key', '$datecurrent')");
mysql_query($query) or die('Invalid query: ' . mysql_error()); 

$query= ("UPDATE clients SET points WHERE id_clients = $val");
mysql_query($query) or die('Invalid query: ' . mysql_error()); 

}

print "<br>";
$i++;
}


mysql_close();
?> 

Posté : 23 oct. 2007, 08:38
par d0m
Effectivement tu as des problèmes de boucles.
D'après ton code tu veux d'abord calculer tes valeurs et ensuite insérer en base.

D'où 2 boucles :
la boucle
while ($i < $counter){
  ....
}
te permet de calculer tes valeurs.

Ensuite, une autre boucle doit te permettre d'insérer les données de ton tableau en base.
Tu utilises each et list mais mal. En regardant la doc, tu aurais vu dans les exemples que le parcours d'un tableau de cette manière sert surtout en boucle de comme ceci :
while (list($key, $val) = each($array)) {
   $query= ("INSERT INTO winners (id_winner, winning_numbers, date) VALUES ('$val', '$key', '$datecurrent')");
mysql_query($query) or die('Invalid query: ' . mysql_error());
}
Sinon un bon conseil, sort tes variables php des chaines :
$query= ("INSERT INTO winners (id_winner, winning_numbers, date)
          VALUES ('".$val."', '".$key."', '".$datecurrent."')");

Posté : 23 oct. 2007, 08:56
par choubix
salut d0m,

ta requete marche super si je mets les bonne valeurs a recuperer dans l'array comme ceci:
while (list($key, $val) = each($array)) {
$query= ("INSERT INTO winners (id_winner, winning_numbers, date)
          VALUES ('".$id_clients."', '".$win."', '".$datecurrent."')"); 
mysql_query($query) or die('Invalid query: ' . mysql_error());
}
c'est ma faute: je debute avec la gestion des tableaux. je prends bien note de ta remarque sur list() aussi :)

2 petites questions:
- pour ma requete d'update tu y vois un soucis??
- quand tu dis de separer les chaines dans la requetes = un retour a la ligne dans la requete SQL? (l'utilite etant pour la lisibilite je suppose non?)

en attendant: un grand merci!!!!!! :)

j'ai jamais autant progresse que ces jours ci grace au forum et a ses participants (et a la doc php qui est pas mal fichue :) )

Posté : 23 oct. 2007, 09:15
par d0m
- pour ma requete d'update tu y vois un soucis??
oui tu oublies de préciser la valeur pour la modification :
"UPDATE clients
 SET points=".?????????."
 WHERE id_clients = ".$val;
- quand tu dis de separer les chaines dans la requetes = un retour a la ligne dans la requete SQL? (l'utilite etant pour la lisibilite je suppose non?)
Non seulement un retour à la ligne pour plus de lisibilité mais surtout séparer chaines de caractères et variables PHP, et pas seulement pour les requêtes sql. Cela permet d'éviter à php de devoir interpreter les variables php contenues dans les chaines de caractères comme des variables, et c'est plus lisible également.
//à
echo "vitesse : $valeur km/h";

//préferer
echo 'vitesse : ' . $valeur . ' km/h';

Posté : 23 oct. 2007, 09:25
par choubix
le soucis etant que mon UPDATE ecrase la valeur stockee precedemment alors qu'elle doit s'additionner... :(
		$points = $winning_numbers * 200;
		$query = ("UPDATE clients SET points=".$points." WHERE id_clients = ".$id_clients." ");
		mysql_query($query) or die('Invalid query: ' . mysql_error());

Posté : 23 oct. 2007, 09:33
par d0m
Je n'y connais pas grand chose en requêtes SQL, par contre regarde dans la doc SQL si il y a une manière de le faire en une seule requête, quelque chose du genre
"UPDATE clients SET points=".$points."+ancienne_valeur
 WHERE id_clients = ".$id_clients."
 AND ancienne_valeur = (SELECT points
                        FROM clients
                        WHERE id_clients = ".$id_clients.")";

Posté : 23 oct. 2007, 11:08
par Ryle
le soucis etant que mon UPDATE ecrase la valeur stockee precedemment alors qu'elle doit s'additionner... :(
C'est normal, dans ta requête tu demandes de stocker la valeur de $points dans le champ "points" alors bête et discipliné, mysql il stocke et il écrase :) Si tu veux ajouter et pas juste écraser, suffit de le lui spécifier :
$query = "UPDATE clients 
  SET points = points + ".$points." 
  WHERE id_clients = ".$id_clients;
Nota : je t'ai viré les parenthèses et chaines vides inutiles qui alourdissent ton code pour rien :)