8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je travail en ce moment sur la réalisation d'un site en support d'un jeu de rôle que j'organise régulièrement avec des amis et je rencontre un problème dans une fonction destinée a trier une liste d'armes disponible dans le jeu.

La fonction récupère un critère de tri, disons par exemple les constructeurs d'armes, on selectionne en sql la liste des contructeurs que l'on affiche sous forme de titre. Sous ce titre est sensé s'afficher la liste des armes correspondant a ce constructeur dans un tableau. Et ainsi de suite jusqu'a que tout les constructeurs soient affichés.

Voici le code réalisé jusqu'ici :

if(isset($_POST['tri']) && !empty($_POST['tri']) && $_POST['tri'] !== 'aucun'){
    $tri = $_POST['tri'];
    echo('<p>'.$tri.'</p>');

    $select_trier = $pdo->query('SELECT * FROM '.$tri.';');
					
    while($trier = $select_trier->fetch(PDO::FETCH_ASSOC)){
        echo('<h3>'.$trier[''.$tri.'_nom'].'</h3>');
						
	$select_par_tri = $pdo->query('SELECT * FROM armes WHERE '.$tri.'='.$trier['nom'].';');
						
	echo('<table>
			<tr>
				<th>Nom</th>
				<th>Type</th>
				<th>Constructeur</th>
				<th>Technologie</th>
				<th>Rareté</th>
				<th>Portée</th>
				<th>Précision</th>
				<th>Dégats</th>
				<th>Prix</th>
				</tr>');
						
	while($par_tri = $select_par_tri->fetch(PDO::FETCH_ASSOC)){
		echo('<tr>
				<td>'.$par_tri['arme_nom'].'</td>
				<td>'.$par_tri['arme_type'].'</td>
				<td>'.$par_tri['arme_constructeur'].'</td>
				<td>'.$par_tri['arme_technologie'].'</td>
				<td>'.$par_tri['arme_rarete'].'</td>
				<td>'.$par_tri['arme_portee'].'</td>
				<td>'.$par_tri['arme_precision'].'</td>
				<td>'.$par_tri['arme_degat'].'</td>
				<td>'.$par_tri['arme_prix'].'</td>
			</tr>');
		}
		echo('</table>');
	}
			
}else{
	weapons_list();
}


Problème, seul la première boucle est réalisé et une fois le premier tableau affiché la fonction s'arrête.
D'après mes recherches réalisés il n'est pas possible d'utiliser un while dans un while, je n'ai cependant trouvé aucunes solutions alternatives.

Si vous avez des idées ou des solutions a me proposer pour surmonter ce problème je suis preneur.

Merci d'avance,
Cordialement,
Le_Nouvo
Modifié par Le_Nouvo (17 Jan 2018 - 17:25)
Salut et bienvenue Smiley smile

Je vois pas où est le problème un while dans un while ça n'a rien d'extraordinaire...
Ce n'est pas simple à mettre en oeuvre mais c'est pas impossible normalement

tu peux fournir des extarcts de tes tables sql pour comprendre plus ce que tu veux faire ?
sans avoir tout à réécrire.. pas le temps pour ça Smiley cligne
En commençant je ne pensais pas non plus que cela serait difficile mais je dois dire que je ne vois pas d'où vient le problème.
Voilà ce que j'obtiens avec le code affiché ci-dessus :
upload/1516208363-69349-croquis.png
Le premier constructeurs de la base de donnée s'affiche et le début du tableau, mais une fois que la fonction entre dans la deuxième boucle while tout s'arrête, le contenu du tableau ne s'affiche pas ni le reste de la liste des constructeurs.

Si je place en commentaire la deuxième boucle while voici ce que j'obtiens.
upload/1516208949-69349-croquis2.png
Tout les constructeurs s'affiche comme il le faudrait mais pas le contenu des tableaux, logique vu que la boucle sensé le généré est en commentaire.
Ok vite fait.. la site demain ou par d'autre.. moi je vais couper Smiley cligne

essayes fetch_assoc() plutot que fetch(PDO::FETCH_ASSOC)

pour voir Smiley cligne

++ bonne soirée
Modérateur
Hello,
Je pense qu'en complément de la réponse de pchlj, ce lien et document devrait être utile : order by.
Modifié par niuxe (17 Jan 2018 - 18:44)
Merci pour ta réponse niuxe mais le Order By ne m'aide pas dans ce cas là car mon objectif est justement de créer plusieurs tableaux différents en fonction du critère de tri et non pas de trier dans un ordre particulier les résultats.

pchlj : J'ai tenté avec cette syntaxe pour le fetch mais cela ne change rien au résultat.
Modifié par Le_Nouvo (17 Jan 2018 - 21:08)
Hello,
J'ai testé ton script chez moi en créant une base de données à partir des indices de ton code et ça fonctionne mais je pense que tu fais quelques erreurs dans ta base de données.
Première erreur : tu n'affiches pas les erreurs PHP, c'est comme si tu codais les yeux bandés...
En début de fichier :
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Ensuite, vérifie bien le nom des colonnes de tes 2 tables 'constructeurs' et 'armes', l'erreur doit être par là.
Dans ta table 'constructeurs', tu as bien 2 colonnes 'nom' et 'constructeurs_nom' ?
Dans ta table 'armes', tu as bien une colonne 'constructeurs' ?
Car ce sont les champs sur lesquels tes requêtes SQL sont basées...
Bonjour,

Je remarque, aujourd'hui seulement que tes clauses where sont sur des valeurs text...
N'aurais tu pas une erreur avec ta requête ?? le texte n'étant pas entre quote ou double quote...