Page 1 sur 1

Boucle while et foreach

Posté : 17 déc. 2016, 00:10
par squallblanc
Bonjour,
pour obtenir le résultat que je souhaitai j'ai utilisé le code suivant mais je trouve que ce n'est pas propre...
$result = mysqli_query($link, "SELECT intervenants FROM events WHERE id_inter='".$id_inter."'");
while($affiche = mysqli_fetch_array($result, MYSQLI_ASSOC))
	 {	
		$qui = explode(':', $affiche['intervenants']);
		foreach($qui as $value){
		$u = mysqli_query($link, "SELECT nom, prenom FROM users WHERE id='".$value."'");								
		while($affiche = mysqli_fetch_array($u, MYSQLI_ASSOC))
			 {								
			  echo '<span class="label label-default">'.$affiche['prenom'].' '.$affiche['nom']."</span> ";						 
			 }
		}
	 }
Comment je pourrai améliorer mon code pour qu'il sous plus propre?
merci pour vos réponses

Re: Boucle while et foreach

Posté : 17 déc. 2016, 00:37
par @rthur
Bonjour,

Ton code est propre, après c'est ton schéma de BDD qui ne l'est pas j'ai l'impression.
Le explode pour récupérer le nom des intervenants concaténé dans un unique champ texte c'est pas top.

Pour faire propre, tu devrai avoir une 3ème table intervenants_events avec juste 2 champ :
- id_event
- id_intervenant

Dans laquelle tu stockerais le lien pour chaque évènement un enregistrement pour chaque intervenant.

Et ensuite en une seule requête SQL avec une jointure tu pourras récupérer les infos de ton event et les noms/prénoms de chaque participant

Re: Boucle while et foreach

Posté : 19 déc. 2016, 12:11
par moogli
salut,

pour ajouter un peu d'info à ce que qu'indique @rthur, tu es dans le cas n*x + 1 requête, car tu va faire autant de requête que de ligne résultat de la première requêtes (n +1 qui est la requête d'origine) mais tu vas faire autant de requête que d'info dans le champs de la base de données PAR ligne de résultat.
imagine que tu ais 5 infos dans ta colonne intervenants pour toute lignes et que tu retournes 100 lignes tu va faire 501 requêtes sur la base de données alors que tu peux en faire une seule !!!!!

avec la structure d'@rthur :
table event_intervenants
- id_event
- id_intervenant
les deux colonnes formes la clef primaire pour éviter les doublons
la requête, certes plus complexe, est au final plus rapide, simple à comprendre et exploitable.
-- le select * c'est pas bien, remplace par les colonnes que tu as besoin
select nom, prenom from event_intervenants 
join users u on id_intervenant = u.id
-- ajoute un prédicat au besoin si tu veux sélectionner qu'un seul event
Si tu veux les données de l'event tu fais une autre requête.
Si tu souhaites les données de plusieurs event il faut ajouter une jointure sur la table event.

La règle à suivre c'est de ne pas avoir à faire de requête SQL dans une boucle ;)

et au passage tu découvres que tu as ajouter simplement une fonctionnalité : trouver tous les event auxquels un intervenant à participé (même requête en ajoutant une condition where id_entervenant = ).

bref un bon modèle c'est toujours gagnant ;)

@+