Page 1 sur 1

distribué les lots au premier de mon classement

Posté : 28 sept. 2011, 20:15
par publieur
Bonjour j'ai une table qui contient les utilisateurs avec leur nombre de points et une autre table qui contient les sommes gagné par chacun et je rencontre un problème avec mon script qui distribue les sommes
<?php
$a = 1;
                // je recupère la valeur de chaque gains
		$req_gains = $this->bdd->query('SELECT * FROM gains ORDER BY places');
		while($res_req = $req_gains->fetch())
		{
		    $gains[$a] = $res_req['gains'];
		    $a++;
		}
		$req_gains->closeCursor();
		
		$i = 1;
                // je recupere les 30 premiers de mon classement
		$req = $this->bdd->query('SELECT * FROM users ORDER BY points DESC LIMIT 0, 30');
		while($result = $req->fetch()) // j'ai un General error à cette ligne mais tout marche comme même
		{
		    if($i == 1)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['1'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
			
		    }
		    elseif($i == 2)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['2'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		    elseif($i ==3)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['3'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		    elseif($i > 3 AND $i <= 5)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['4'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		     elseif($i >= 6 AND $i <= 10)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['5'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		     elseif($i >= 11 AND $i <= 18)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['6'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		     elseif($i >= 19 AND $i <= 24)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['7'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		     elseif($i >= 25 AND $i <= 30)
		    {
			$req1 = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
			$req1->execute(array('id'=>$result['id']));
			$argent_base = $req1->fetch();
			$req1->closeCursor();
			$nouveau_argent = $argent_base['argent'] + $gains['8'];
			$req = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
			$req->execute(array(
			  'argent'=>$nouveau_argent,
			  'id'=>$result['id']
			));
		    }
		    $i++;
		}
?>

Enfaite j'ai testé le code et tout marche (à par quand il me met General error à la ligne que j'ai commenté je ne sais pas pour quoi mais en remplacent l’intérieur des conditions par des echo quand j'ai testé le code sa me le faisais pas) le problème c'est que il me met la même somme d'argent à tous les membres de ma table et je ne sais pas vraiment d'ou sa viens.
Et je pense que ma methode n'est pas la meilleur personne n'aurais une methode plus propre à proposé pour distribué les lots qui sont dans une table gains vers le champ "argent" de ma table d'utilisateur qui ont fini dans les 30 premier du classement ?

Re: distribué les lots au premier de mon classement

Posté : 28 sept. 2011, 21:29
par moogli
salut,

L’intérêt de la requête préparée est justement de ne pas la refaire plusieurs fois donc tu peux déplacer les prepare en dehors de la boucle.

Tu peux de plus factoriser ton code au maximum car tu n'a pas besoin d'écrire 10 fois la même chose :)

par exemple
<?php
$a = 1;
// je recupère la valeur de chaque gains
$req_gains = $this->bdd->query('SELECT * FROM gains ORDER BY places');
while($res_req = $req_gains->fetch())
{
    $gains[$a] = $res_req['gains'];
    $a++;
}
$req_gains->closeCursor();

$i = 1;
// je recupere les 30 premiers de mon classement
$req = $this->bdd->query('SELECT * FROM users ORDER BY points DESC LIMIT 0, 30');
$req_GetArgent = $this->bdd->prepare('SELECT argent FROM users WHERE id=:id');
$req_Update = $this->bdd->prepare('UPDATE users SET argent=:argent WHERE id=:id');
while($result = $req->fetch()) // j'ai un General error à cette ligne mais tout marche comme même
{
    $req_GetArgent->execute(array('id'=>$result['id']));
    $argent_base = $req1->fetch();
    $req1->closeCursor();
    if($i == 1)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[1];
    }
    elseif($i == 2)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[2];
    }
    elseif($i ==3)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[3];
    }
    elseif($i > 3 AND $i <= 5)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[4];
    }
     elseif($i >= 6 AND $i <= 10)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[5];
    }
     elseif($i >= 11 AND $i <= 18)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[6];
    }
     elseif($i >= 19 AND $i <= 24)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[7];
    }
     elseif($i >= 25 AND $i <= 30)
    {
        $nouveau_argent = $argent_base['argent'] + $gains[8];
    }
    $req_Update->bindValue(':argent', $nouveau_argent, PDO::PARAM_INT);
    //voir si pas float ou autre chiffre !
    $req_Update->bindValue(':id', $result['id'], PDO::PARAM_INT);
    $req_Update->execute();
    $i++;
}
?>
pour ce qui est du message donne le en entier que l'on puisse y voir clair ;)


@+