Afficher le resultat d'une requête dans plusieurs DIV

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Afficher le resultat d'une requête dans plusieurs DIV

par AB » 19 déc. 2008, 02:55

Merci, ça fait plaisir :)

Remarques qu'il ne s'agit pas de code "vraiment" sur mesure puisque j'ai utilisé des techniques déjà existantes. Le sur mesure ici, c'est de savoir comment manipuler et regrouper ces techniques pour faire in fine du sur mesure.

Sinon pour la boucle qui reformate le tableau, elle n'est pas très facile à comprendre à l'écran. Par contre si tu prends le temps de la recopier sur une feuille de papier avec un exemple de ton tableau et que tu regardes les intervals qu'elle génère, c'est beaucoup plus facile. En fait c'est beaucoup plus facile à comprendre qu'à expliquer c'est pourquoi je n'ai pas pris le temps de la documenter.

Tout ça pour dire que pour des choses qui paraissent (ou qui sont) difficiles, le meilleur conseil que je puisse te donner est de lâcher l'écran - je sais c'est pas facile - et de prendre une feuille de papier avec la technique ancestrale - mais irremplaçable - du stylo :wink: J'ai pas d'explication rationnelle pour expliquer ce phénomène mais je ne suis pas le seul à l'avoir observé :)

par Toons43 » 18 déc. 2008, 22:23

Alors comment dire, \:D/

merci, Merci, MERCI :D :D :D :D

C'est génial, ton code fais exactement ce que je souhaitais, je commençais à désespérer et grâce à toi j'ai réussi à faire ce que je voulais. Donc bravo, t'es trop fort =D>

J'avoue que j'ai pas tout compris à ton code c'est un peu compliqué je pense pour moi, mais j'ai réussi à générer les $tab [] grâce au code de Yaug.

Donc pour conclure un grand merci à tous ceux qui se sont penché sur mon cas et surtout à toi AB pour ton code sur mesure. :pouce:

par AB » 18 déc. 2008, 20:40

Avec le post de Yaug et les liens que tu avais trouvé, tu avais presque tout sous la main, il te manquait juste le tuto de Ryle sur l'affichage multi colonne http://www.phpfrance.com/forums/voir_sujet-241626.php

Voilà donc comment je m'y prendrais :

Je reprendrais le code de Yaug mais au lieu d'essayer d'afficher le résultat directement, j'enregistrerais les résultats non formatés dans un tableau. Au final tu devrais donc avoir un tableau $tab comme dans mon exemple.

Ensuite j'utiliserais ma boucle http://www.phpfrance.com/forums/voir_re ... php#272576 pour reconstruire le tableau avec les éléments ordonnés de telle sorte qu'un listage simple avec la technique de Ryle (cf tuto mentionné au début) soit suffisante.

Ce qui donne au total :

<?php
header('Content-Type: text/html; charset=UTF-8'); 

$tab[] = 'A';
$tab[] = 'Alain';
$tab[] = 'Alexandre' ;
$tab[] = 'Arthur';
$tab[] = 'B';
$tab[] = 'Bernard';
$tab[] = 'Bill';
$tab[] = 'Boby' ;
$tab[] = 'C';
$tab[] = 'Catherine';
$tab[] = 'Carinne' ;
$tab[] = 'Caroline';
$tab[] = 'Charles';
$tab[] = 'D';
$tab[] = 'Damien';
$tab[] = 'Didier';
$tab[] = 'Dominique';

$nb_colonne = 3;

$nb_lignes = ceil(count($tab)/$nb_colonne);

for ($i = 0; $i < $nb_lignes ; $i++)
	{
		$incr = $i;
		
		for($j = 0 ; $j < $nb_colonne ; $j++)
		{	
			if (isset($tab[$incr])){$temp[] = $tab[$incr]; $incr += $nb_lignes;} else  $temp[] = null;
		}
	}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Affichage multi-colonnes</title>
</head>

<body>
<table>
<?php 
$cpt = 0;
foreach ($temp as $value)
{
    // début d'une ligne 
    if ($cpt%$nb_colonne==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ... 
        echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne 


    // On place chaque élément dans une cellule du tableau 
    echo '<td style="padding:0 10px 0 10px">';
    echo $value; // affichage de tout ce qu'on veut dans la cellule 
    echo '</td>'; 


    // fin d'une ligne
    if ($cpt%$nb_colonne==($nb_colonne-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ... 
        echo '</tr>'; // ..., on est sur le dernier élément d'une ligne

    $cpt++; // on incrémente le compteur pour savoir où on en est 
}
?>
</table>
</body> 
</html> 
ça peut paraître un peu compliqué mais l'avantage c'est qu'il te suffit de modifier la variable $nb_colonne (ici = 3) pour que l'affichage suive.

Donc il ne te reste plus qu'à utiliser le code de Yaug pour créer un tableau tel que dans mon exemple $tab.
Faut bien que je te laisse bosser un peu :wink:

Note : Ne me parle de tes div en float-left, c'est typiquement l'exemple où l'usage des tableaux est recommandé.

par Toons43 » 18 déc. 2008, 12:53

Exactement :D
Si tu as une idée je suis preneur

par AB » 18 déc. 2008, 12:34

Donc si j'ai bien compris tu voudrais la même chose qu'a fait Yaug mais présenté sur trois colonnes ?

par Toons43 » 18 déc. 2008, 11:26

Bonjour,

Tout d'abord merci d'avoir refléchi à mon problème. De mon côté j'ai trouvé un site qui fait exactement ce que je voudrais, c'est 1001reductions.com, qui proposent des codes de réductions. Sur sa page tous les marchands, il liste des marchands par ordre alphabétique exactement comme j'aimerai faire avec des divs. Comment fait-il?
Enfin voila c'est exactement ce que je souhaite faire, si quelqu'un a une idée

par AB » 18 déc. 2008, 03:08

J'ai regardé un peu mais finalement je ne vois pas ce que tu veux.

Si tu classe les noms en fonction de leur première lettre toutes tes colonnes ne pourront pas être d'une hauteur identique ? Ou alors il te faudra plusieurs colonnes avec la même lettre ...

Plutôt qu'un exemple abstrait pourrais-tu donner un exemple réel de ce que tu veux comme affichage en fonction d'un jeu d'enregistrement concret ?

par Toons43 » 17 déc. 2008, 19:20

Merci de te pancher sur mon problème. :D

par AB » 17 déc. 2008, 18:52

M'oui j'ai répondu en ne regardant que ton dernier post, donc oublies array_chunk qui n'est peut-être pas adapté quoique...

Je regarde plus en détail et te répondrai plus tard si j'ai le temps mais pas certain.

Sinon le lien que tu as trouvé est peut-être une bonne piste.

par Toons43 » 17 déc. 2008, 18:42

Heu, je suis débutant en php et la je vois pas du tout ce que je dois faire. Si tu peux me preciser un peu ta réponse

Au passage j'ai trouvé ça sur le forum mais comment l'adapter à mon cas ?
http://www.phpfrance.com/forums/voir_reponse-272580.php

Merci.

par AB » 17 déc. 2008, 18:35

Tu pourrais peut-être enregistrer le résultat de ta requête dans un tableau et ensuite utiliser les fonctions des tableaux (array_chunk par exemple), ce sera plus facilement manipulable.

par Toons43 » 17 déc. 2008, 16:01

Non je veux juste que la liste ne soit pas trop longue. Un truc du style

Code : Tout sélectionner

A D G Nom1 Nom1 Nom1 Nom2 Nom2 Nom2 Nom3 Nom3 Nom3 B E H Nom1 Nom1 Nom1 Nom2 Nom2 Nom2 Nom3 Nom3 Nom3 C F I Nom1 Nom1 Nom1 Nom2 Nom2 Nom2 Nom3 Nom3 Nom3
Voila, je sais pas si c'est possible

par yaug » 17 déc. 2008, 15:49

Que veux tu afficher dans des colonnes différentes au juste?

Lettre A
Nom 1 Nom2 Nom 3

Un truc dans ce genre ?

par Toons43 » 17 déc. 2008, 15:46

Merci pour ce code, je l'ai mis en place,l'affichage revient au mêm, mais si il est plus propre tant mieux. Maintenant comment afficher la liste de résultat sur plusieurs colonne de même taille?

par yaug » 17 déc. 2008, 15:32

Déjà un premier soucis.

Tu fais une requêtes qui entraine un nombre indéterminé d'autres requêtes via ta boucle while.
Ce genre de chose est à éviter totalement.

Fait plutôt un truc dans le genre
<?php
mysql_connect("serveur", "utilisateur", "mdp"); // Connexion à MySQL
mysql_select_db("bdd"); // Sélection de la base

//On fait la requête
$query = "SELECT 
			SUBSTRING(Nom,1,1) AS Lettre,
			Nom
			FROM matable 
			ORDER BY Lettre, Nom";
$retour = mysql_query($query) or die(mysql_error());//selection de la première lettre des noms

//On construit notre tableau
$string = '<h4 class="title">Tous nos noms</h4>\n';
$string .= '<table id="liste_nom">';
$last_lettre = '';
while ($data = mysql_fetch_assoc($retour)) // On fait une boucle
{
	$tmp_str = "";
	$current_lettre = $data['Lettre'];
	$current_nom = $data['Nom'];
	
	//On entame une nouvelle lettre
	if($last_lettre != $current_lettre)
	{
		$tmp_str .= '<tr><th class="lettre">'.$current_lettre.'</th></tr>';
	}
	
	//On affiche la liste des noms liés à cette lettre
	$tmp_str .= '<tr><td>'.$current_nom.'</td></tr>';
	
	$string.= $tmp_str;
	$last_lettre = $current_lettre;
}
$string .= '</table>';

echo $string;
mysql_close(); 
?>