Sélection dans une base de donnée

Résolu
Bonjour,

J'aimerai votre aide afin de m'aider à réaliser une sélection dans ma bdd en fonction de certains paramètres.

Je vais nommer 5 Objets : A, B, C, D et E.
- Je souhaiterai que ces 5 Objets soit entrés en bdd (je sais faire, aucun souci).
- Je souhaiterai qu'une fonction php sélectionne, disons, 30 Objets en tous en prenant en compte ce quota : 50% de A, 20% de B, 15% de C, 10% de D et 5% de E.
- Insérer le résultat de sélection des 30 Objets dans une autre table (je sais faire avec une boucle while).

pouvez-vous m'aiguiller sur la marche à suivre s'ils vous plait ?

Merci par avance.

6 réponses

  1. Oui mais ce n'est pas bon.
    et j'ai perdu mon fichier.

    En faite je souhaite que le tirage se fasse en fonction du taux de chaque objet.
    0
    1. Contributeur
      moi je ferais des tirages indépendants pour chaque type d'objet: tirer 15 A, 6 B, ...
      0
  2. J'ai ça pour le moment :

    //Enregistrement de 30 pokemon dans une table pour affichage au joueur
    		$nbr_poke = 0 ;
    		while( $nbr_poke < 30)
    				{ 
    					$poke_affich_joueur = $bdd->query("SELECT * FROM selec_poke ORDER BY RAND()LIMIT 30");
    					$poke_entrer = $poke_affich_joueur->fetch();
    					$randChromatique = rand(1,50);
    					$niveau = rand(13,17);
    					$sexe = rand(1,2);
    					if ($sexe == 1)
    					{ 
    						$sexe2 = 'Male';
    					}elseif ($sexe == 2) 
    					{
    						$sexe2 = 'Femelle';
    					}
    					else 
    					{
    						$sexe = 'Inconnu';
    					}
    					if($randChromatique == 1)
    					{
    						$Chromatique = "chromatique";
    					}
    					else
    					{
    						$Chromatique = "";
    					}
    					$insert_poke_capture = $bdd->exec("INSERT INTO herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."')");
    					$nbr_poke++; 
    				}
    		header('location:test_affiche.php');
    


    Comment adapter ce code pour sélectionner en fonction du taux que je souhaite ?
    0
    1. Je ne peux plus éditer alors je poste ce commentaire :

      Voici la table ou je selectionne les pokemon :
      0
  3. Alors voila, en suivant tes conseils je suis parvenu à faire ça :

    //Enregistrement de 30 pokemon dans une table pour affichage au joueur
    		$nbr_poke = 0 ;
    		while( $nbr_poke < 30)
    				{ 
    					$taux_poke = rand(1,100);
    					if ($taux_poke <= 50)
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "1"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(12,18);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					elseif (($taux_poke >= 51) && ($taux_poke <=70))
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "2"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(9,14);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					elseif (($taux_poke >= 71) && ($taux_poke <=85))
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "3"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(5,11);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					elseif (($taux_poke >= 86) && ($taux_poke <=95))
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "4"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(3,8);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					else
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "5"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(1,5);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					
    					$insert_poke_capture = $bdd->exec("INSERT INTO herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."')");
    					$nbr_poke++; 
    				}
    		header('location:test_affiche.php');


    Cela fonctionne parfaitement avec ce que je cherche par contre j'aimerais savoir si vous pouviez m'aiguillez sur le fait de simplifier ce code ?

    Merci par avance.
    0
    1. Contributeur
      la première chose à faire et de sortir du if tout ce qui est identique dans les différents cas.
      0
    2. @yg_bee suis d'accord avec toi mais par exemple le niveau ou le sexe doit être calculer à chaque tours du while par exemple tous comme la caractéristique chromatique.
      0
    3. Contributeur
      @David987ce qui ne nécessite pas de l'avoir dans chaque condition du if. tu peux le mettre entre la fin du if et la fin du while.
      0
  4. Ah oui je comprend je vais faire ça.
    Tu vois autre chose pour améliorer et réduire le code ?

    Voici ce que j'ai fais pour le moment :

    $select_time_actu = $bdd->query("SELECT * FROM temps_actu WHERE time")->fetch();
    		$time_derniere_actu = $select_time_actu['time'];
    		if(time() - $time_derniere_actu < 10)
    			{}
    		else
    		{
    				//Enregistrement de 30 pokemon dans une table pour affichage au joueur + update du temps de l'actu
    				$update_time_actu = $bdd-> exec("UPDATE temps_actu SET time = '".time()."'");
    				$vider_table = $bdd->exec("TRUNCATE herbe");
    				$map = "Nazaris";
    				$nbr_poke = 0 ;
    				while( $nbr_poke < 30)
    						{ 
    							$taux_poke = rand(1,100);
    							$sexe = rand(1,2);
    									if ($sexe == 1)
    									{ 
    										$sexe2 = 'Male';
    									}elseif ($sexe == 2) 
    									{
    										$sexe2 = 'Femelle';
    									}
    									else 
    									{
    										$sexe = 'Inconnu';
    									}
    									if($randChromatique == 1)
    									{
    										$Chromatique = "chromatique";
    									}
    									else
    									{
    										$Chromatique = "";
    									}
    							$randChromatique = $chance_chroma;
    							if ($taux_poke <= 50)
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "1" && map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(12,18);
    								}
    							elseif (($taux_poke >= 51) && ($taux_poke <=70))
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "2" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(9,14);
    								}
    							elseif (($taux_poke >= 71) && ($taux_poke <=85))
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "3" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(5,11);
    								}
    							elseif (($taux_poke >= 86) && ($taux_poke <=95))
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "4" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(3,8);
    								}
    							else
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "5" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(1,5);
    								}
    							
    							$insert_poke_capture = $bdd->exec("INSERT INTO herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`, `map`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."', '".$map."')");
    							$insert_poke_capture_archive = $bdd->exec("INSERT INTO archive_herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`, `map`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."', '".$map."')");
    							$nbr_poke++; 
    						}
    				
    		}
    			header('location:test_affiche.php');
    0
    1. Contributeur
      il serait plus clair d'inverser le test des lignes 3 à 5, pour éviter le else.
      l'instruction fetch peut sortir du if.
      l'instruction query peux aussi sortir du if, il suffit de mémoriser le taux.
      0
  5. D'accord, merci beaucoup pour ton aide.
    0