Sélection dans une base de donnée

Résolu/Fermé
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 - 2 mai 2020 à 02:05
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 - 3 mai 2020 à 17:19
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

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 mai 2020 à 09:05
bonjour,
as-tu essayé la solution décrite ici: https://forums.commentcamarche.net/forum/affich-35722340-taux-en-php
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
2 mai 2020 à 13:35
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
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 mai 2020 à 14:02
moi je ferais des tirages indépendants pour chaque type d'objet: tirer 15 A, 6 B, ...
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
Modifié le 2 mai 2020 à 20:46
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
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
2 mai 2020 à 20:53
Je ne peux plus éditer alors je poste ce commentaire :

Voici la table ou je selectionne les pokemon :
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
2 mai 2020 à 21:34
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
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
2 mai 2020 à 22:11
la première chose à faire et de sortir du if tout ce qui est identique dans les différents cas.
0
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1 > yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
2 mai 2020 à 22:54
e 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
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022
3 mai 2020 à 09:58
ce 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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
Modifié le 3 mai 2020 à 16:50
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
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
3 mai 2020 à 17:13
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
David987 Messages postés 121 Date d'inscription samedi 19 décembre 2015 Statut Membre Dernière intervention 16 octobre 2022 1
3 mai 2020 à 17:19
D'accord, merci beaucoup pour ton aide.
0