comment optimiser mon code

WRInaute impliqué
Bonjour, je souhaiterais optimiser mon code php, et éviter si possible d'exécuter une requête sql à chaque boucle.

Pouvez-vous me dire comment je peux faire ?

Merci

Code:
function bag($i1, $i2, $type) {// Affichage du sac.
	
	switch ($type) {
	case 1: $type_text ='à équipements'; break;
	case 2: $type_text ='à objets'; break;
	case 3: $type_text ='à matériaux'; break;
	case 4: $type_text ='à potions'; break;
	}

	$page = '<select name="slot"><option value="0">Vos poches '.$type_text.'</option>';

	for ($i=$i1; $i<=$i2; $i++)
	{
		
		if (is_numeric($userrow['bag'.$i.'id']) AND $userrow['bag'.$i.'id'] !=0) {
			
			$item = $mysql->query("SELECT name FROM ".$mysql->pref."_items WHERE id='".$userrow['bag'.$i.'id']."' LIMIT 1");
			$item = mysql_fetch_assoc($item);	
			
			$page .='<option value="'.$i.'">Poche '.$i.' du sac à dos : '.$item['name'].'</option>';

		}elseif(!is_numeric($userrow['bag'.$i.'id'])) {
			
			$id_equip = explode(',',$userrow['bag'.$i.'id']);	
			
			$equip = $mysql->query("SELECT name FROM ".$mysql->pref."_equips WHERE id='".$id_equip[0]."' LIMIT 1");
			$equip = mysql_fetch_assoc($equip);
			
			$page .='<option value="'.$i.'">Poche '.$i.' du sac à dos : '.$equip['name'].'</option>';
			
		}else{ $page .='<option value="'.$i.'">Poche '.$i.' du sac à dos : Vide</option>'; }	
		
	}

	$page .='</select>';
	
	return $page;
}
 
WRInaute discret
Tu peux mettre un IN ou un between $i1 $i2 et sortir tes requetes de ta boucle ... je suis pas sur que ça optimise mais au moins ça fait 3 requetes vs ($i2 - $i1) ;)
 
WRInaute impliqué
Je comprends pas trop ce que tu veux dire.

Il y a pas moyen d'éviter de tester pour chaque boucle ?
 
WRInaute discret
ben en faite en relisant ton code vite fait je vois pas d'ou vient la variable userrow mais bon le principe du in/between c'est plutôt que de de faire ta boucle sur tes requêtes tu fais un (ou plusieurs select) en dehors du genre :
Code:
SELECT CHAMPS ... FROM TABLE WHERE ID IN (1,2,3,4,5,6)

Ou ALORS
Code:
SELECT CHAMPS ... FROM TABLE WHERE ID BETWEEN 1 AND 6

En une fois que tu as toutes tes données tu fais ta boucle avec tous tes tests en php ce qui évite d'avoir 50000 requetes ... mais qui peut poser des problème si il y a trop de données a traiter (depassement de mémoire).

C'est plus clair ? (Attention ça va pas dire que ma prochaine réponse sera un bout de code avec la solution)
 
WRInaute impliqué
Non moi je demande pas qu'on me ponde la solution, mais juste une explication comme tu l'a très bien fait et je t'en remercie.

Je viens d'essayer ta solution, mais dès le début, je vois que c'est pas possible sachant que $userrow['bag'.$i.'id'] peux très bien etre un chiffre sans virgule ou avec virgule.
 
WRInaute occasionnel
Explique moi ton modèle de données et ce que tu veux faire précisément : parce que là t'es en train de nous dire que tes id peuvent être alphanumérique??
 
Discussions similaires
Haut