8710 sujets

Développement web côté serveur, CMS

Pages :
Bonjour

Sur mon site je doit faire un tableau comparatif. Il s'agit d'afficher toutes les caméras avec la liste des caractéristiques sous forme d'un tableau. Je classe les caméras selon leur sous-catégories.

Voilà où j'en suis -http://www.spypoint.com/FR/cameras/comparaison-2013.php-
Jusqu'à maintenant j'affiche une seule caméras avec ses caractéristiques.

Comment fait-on pour faire afficher toutes les caméras chacune sur une colonne?

Il doit y avoir une count à quelques part ou un truc du genre mais j'ignore comment m'y prendre...

mon code:
<table>
	<thead>
        <?php
		$requete = mysql_query(
						"SELECT
							C.`fr` as `categorie`,
							SC.`fr` as `sousCat`,
							P.`produits`,
							P.`thumbnail` 
						FROM produits P,
							categories C,
							sousCategories SC
						WHERE C.`id` = SC.`categorie_id`
							AND P.`id_categories` = C.`id`
							AND P.`id_sousCategories` = SC.`id`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY SC.`fr`,P.`produits`
						LIMIT 6")or die("21 - ".mysql_error());
		while($info = mysql_fetch_assoc($requete)) {
			$produits = $info['produits'];
		?>
    	<tr>
        	<td rowspan="2">&nbsp;</td>
        	<th><?php echo $info['sousCat']; ?></th>
            
        </tr>
    	<tr>
        	<th><?php echo $produits; ?><br>
				<img alt="" src="../../Images/photosProduits/<?php echo $info['thumbnail']?>" height="80" />
            </th>
        </tr>
    </thead>
    <tbody>
        <?php
		$requete = mysql_query(
					"SELECT 
						S.`fr` as `spec`,
						PS.`fr` as `pspec`
					FROM spec S,
						produits_spec PS
					WHERE S.`fr` = PS.`spec`
						AND PS.`produits` LIKE '%".$produits.",%'
					ORDER BY S.`ordre`")or die("52 - ".mysql_error());
		while($info = mysql_fetch_assoc($requete)){
		?>
    	<tr>
        	<th><?php echo addslashes($info['spec']); ?></th>
            <td><?php echo $info['pspec']; ?></td>
		<?php
		}
        ?>
        </tr>
		<?php
        }
        ?>
    </tbody>
</table>

Modifié par juliesunset (28 May 2013 - 19:30)
Salut,

Le mieux est de récupérer dans des tableaux les informations de tes produits et les libellés de tes colonnes.
Et cela avant d'attaquer ton code html du tableau.

Donc un tableau avec tes produits et leurs caractéristiques et ensuite un autre avec les libellés.

Pour les boucles, voici un code fait à l'arrache, a modifier selon ton besoin :


$nb_lignes = count($libelles) + 1
$nb_colonnes = count($produits);
for ($l = 0; $l <= $nb_lignes ; $l++) {
<tr>
<td>
echo $key == 0 ? '' : array_shift($libelles);
</td>
for ($c = 0; $c <= $nb_colonnes ; $c++) {
<td>
echo $produits[$c][$l];
</td>
}
<tr>
}


Par contre j'ai un peu de mal avec cette partie du code :
PS.`produits` LIKE '%".$produits.",%'

Tu utilise le nom du produit comme clé étrangère ? Cela risque de te jouer des tours.
Modifié par benj (26 May 2013 - 00:46)
Merci pour ta réponse et la piste, je savais qu'il y avait un truc du genre à faire, je vais regarder ça.


Concernant ceci
PS.`produits` LIKE '%".$produits.",%'
$produits fait référence à la table "produits" qui liste tous nos produits, PS.produits, correspond à une colonne dans la table "produits_spec" qui liste toutes les caractéristiques des produits.
Les champs de cette colonne contient un liste de produits assigné à une caractéristique. Donc, une caractéristique peu correspondre à plusieurs produits, par exemple, la caractéristique 8mp sera assigné aux caméras BF-8,FL-8,LIVE-3G,M8,S-BF-8,etc.

Si je fais pas ça l'association ne se fait pas... à moins qu'il n'y est une autre façon de faire? J'ai tenté de mettre cette requête tout en haut en même temps que la première, mais je n'obtient aucun résultat.
Ce n'est pas du tous une bonne solution.
Prends par exemple ton produit BF-8. J'imagine qu'il n'a pas les même caractéristiques que ton produit S-BF-8. Pourtant ta requête te donnera pour BF-8, les caractéristique de BF-8 et de S-BF-8.

Il faut absolument que tu ajoute une table listant tous les produits associés à une ligne de produits_spec.

Table : produits_spec_produits
Champs : id_produits, id_produits_spec

Bon courage
ouf! Tu m'as perdu l'espace d'une minute, mais je pense que je comprend ce que tu essaie de me dire. BF-8 et S-BF-8, sont très semblable en fait, la seule différence est la couleur du boitier. Normalement les 2 ne sont pas affiché dans la même section du site. Mais il est vrai que j'ai eu quelque difficulté à certains endroit avec ce fameux "S-"...
Le hic, est qu'en faisant cela je devrai modifier mon formulaire et tableau d'affichage dans ma gestion, en plus de modifier une bon nombre de page à travers le site... Je commence tout juste à faire des jointures, là ça me fait peur un peu je doit avouer...

Et si je changeai simplement, dans ma table produits_spec, la colonne "produits" par "id_produits"?
Et pour en revenir au sujet principal, j'ai tenté d'utilisé ton code, mais j'ai du mal à tout comprendre...

Voici ce que j'ai fait:
<table>
        <?php
		$requete = mysql_query(
						"SELECT
							C.`fr` as `categorie`,
							SC.`fr` as `sousCat`,
							P.`produits`,
							P.`thumbnail`, 
							S.`fr` as `spec`,
							PS.`fr` as `pspec`
						FROM produits P,
							spec S,
							produits_spec PS,
							categories C,
							sousCategories SC
						WHERE C.`id` = SC.`categorie_id`
							AND P.`id_categories` = C.`id`
							AND P.`id_sousCategories` = SC.`id`
							AND S.`fr` = PS.`spec`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY SC.`fr`,P.`produits`,S.`ordre`
						")or die("21 - ".mysql_error());
		while($info = mysql_fetch_array($requete)) {
			$produits = $info['produits'];
			$spec = $info['spec'];
			
			$nb_colonnes = count($produits);
			$nb_lignes = count($spec) + 1;
			
			for ($l = 0; $l <= $nb_lignes; $l++){
				?>
                <tr>
					<th><?php echo $key == 0 ? '' : array_shift($spec); ?></th>
                    <?php
				for ($c = 0; $c <= $nb_colonnes; $c++){
					?>
                    <td><?php echo $produits[$c][$l]; ?></td>
                    <?php
				}
					?>
				</tr>
				<?php
			}
        }
        ?>
</table>


et voici ce que ça me donne:
a écrit :
Fatal error: Cannot use string offset as an array in /home/ggteleco/public_html/FR/cameras/comparaison-2013.php on line 57
Ligne 57
<?php echo $produits[$c][$l]; ?>


Mais je pense qu'il me manque un truc je doit récupérer les info de ma requête dans un tableau si je comprend bien?

J'ai du mal à comprendre cette ligne?
<?php echo $key == 0 ? '' : array_shift($spec); ?>
Récupère tes infos comme cela :
        
		$requete = mysql_query(
						"SELECT
							C.`fr` as `categorie`,
							SC.`fr` as `sousCat`,
							P.`produits`,
							P.`thumbnail`, 
							S.`fr` as `spec`,
							PS.`fr` as `pspec`
						FROM produits P,
							spec S,
							produits_spec PS,
							categories C,
							sousCategories SC
						WHERE C.`id` = SC.`categorie_id`
							AND P.`id_categories` = C.`id`
							AND P.`id_sousCategories` = SC.`id`
							AND S.`fr` = PS.`spec`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY SC.`fr`,P.`produits`,S.`ordre`
						")or die("21 - ".mysql_error());
		while($info = mysql_fetch_array($requete)) {
                    $produits[] = $info;
               }


<?php echo $key == 0 ? '' : array_shift($spec); ?>

Si la variable $key = 0 alors on écrit rien, sinon on affiche le prochain libellé.
Il faut faire un truc comme ça à cause de ta première ligne qui n'a pas de première colonne.
juliesunset a écrit :
Le hic, est qu'en faisant cela je devrai modifier mon formulaire et tableau d'affichage dans ma gestion, en plus de modifier une bon nombre de page à travers le site... Je commence tout juste à faire des jointures, là ça me fait peur un peu je doit avouer...

Et si je changeai simplement, dans ma table produits_spec, la colonne &quot;produits&quot; par &quot;id_produits&quot;?

C'est pour cela qu'une analyse doit être fait en amont du développement. Elle permet de bien structurer le données dès le début. Je t'invite à utiliser des outils de modélisation de donnée : http://www.mysql.fr/products/workbench/ c'est un logiciel gratuit.

Concernant ton idée de modification de ta table produits_spec.
Tu veut mettre dans ce champ une liste d'id ? Tu auras exactement le même problème qu'avec les intitulés.
Ouf! ça ne fonctionne pas du tout, j'ai un boucle à l'infini!
upload/22504-Untitled-1.png




benj a écrit :

C'est pour cela qu'une analyse doit être fait en amont du développement. Elle permet de bien structurer le données dès le début. Je t'invite à utiliser des outils de modélisation de donnée : http://www.mysql.fr/products/workbench/ c'est un logiciel gratuit.
Merci je regarde ça.

benj a écrit :
Concernant ton idée de modification de ta table produits_spec.
Tu veut mettre dans ce champ une liste d'id ? Tu auras exactement le même problème qu'avec les intitulés.
Je ne voit pas pourquoi?
Aucune idée pour ton problème de boucle. Essaie de regarder si tu n'écrase pas une variable.
Que vaut la variable $nb_colonnes ? ...

a écrit :
Je ne voit pas pourquoi?

PS.`id_produits` LIKE '%".$produits.",%'


si tu as un identifiant 1 et un autre 11
benj a écrit :
Aucune idée pour ton problème de boucle. Essaie de regarder si tu n'écrase pas une variable.
Que vaut la variable $nb_colonnes ? ...
1 2 3 4 5 6 7 8... indéfiniment...


benj a écrit :
si tu as un identifiant 1 et un autre 11

Ah bon, d'accord... sauf que ça implique des changement majeur à travers tout le site... Pour tout de suite je ne suis pas en mesure des les faire... ça sera à faire, peut-être pour la prochaine mouture du site. En attendant je vais tenir compte de ton conseil pour le 2e site sur lequel je suis en-train de travailler en parallèle.
J'ai essayé comme ceci:
<?php
		$requete = mysql_query(
						"SELECT
							C.`fr` as `categorie`,
							SC.`fr` as `sousCat`,
							P.`produits`,
							P.`thumbnail`, 
							S.`fr` as `spec`,
							PS.`fr` as `pspec`
						FROM produits P,
							spec S,
							produits_spec PS,
							categories C,
							sousCategories SC
						WHERE C.`id` = SC.`categorie_id`
							AND P.`id_categories` = C.`id`
							AND P.`id_sousCategories` = SC.`id`
							AND S.`fr` = PS.`spec`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY SC.`fr`,P.`produits`,S.`ordre`
						")or die("21 - ".mysql_error());
		while($info = mysql_fetch_array($requete)) {
			$produits[] = $info;
			$spec = $info['spec'];
			
			$nb_colonnes = count($info['produits']);
			$nb_lignes = count($spec) + 1;
			
			for ($l = 0; $l <= $nb_lignes; $l++){
				?>
                <tr>
					<th><?php echo $key == 0 ? '' : array_shift($spec); ?></th>
                    <?php
				for ($c = 0; $c <= $nb_colonnes; $c++){
					?>
                    <td><?php echo $produits[$c][$l]; ?></td>
                    <?php
				}
					?>
				</tr>
				<?php
			}
		?>
    	
		<?php
        }
        ?>


et j'obtiens ceci: upload/22504-Untitled-2.png Ce sont toujours les 3 même lignes ...
$nb_colonnes vaut 1 je ne sais combien de fois, mais pas à l'infini...
<?php
		$requete = mysql_query(
						"SELECT
							C.`fr` as `categorie`,
							SC.`fr` as `sousCat`,
							P.`produits`,
							P.`thumbnail`, 
							S.`fr` as `spec`,
							PS.`fr` as `pspec`
						FROM produits P,
							spec S,
							produits_spec PS,
							categories C,
							sousCategories SC
						WHERE C.`id` = SC.`categorie_id`
							AND P.`id_categories` = C.`id`
							AND P.`id_sousCategories` = SC.`id`
							AND S.`fr` = PS.`spec`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY SC.`fr`,P.`produits`,S.`ordre`
						")or die("21 - ".mysql_error());
		while($info = mysql_fetch_array($requete)) {
			$produits[] = $info;
		}

                $spec = $info['spec'];
			
			$nb_colonnes = count($info['produits']);
			$nb_lignes = count($spec) + 1;
			
			for ($l = 0; $l <= $nb_lignes; $l++){
				?>
                <tr>
					<th><?php echo $key == 0 ? '' : array_shift($spec); ?></th>
                    <?php
				for ($c = 0; $c <= $nb_colonnes; $c++){
					?>
                    <td><?php echo $produits[$c][$l]; ?></td>
                    <?php
				}
					?>
				</tr>
				<?php
			}
		?>
    	

Voici plutôt le code donné en exemple plus haut. Attention, je n'ai pas testé...
Voici un code qui fonctionne :

<?php
$produits = array(
	array(
		'produit1',
		'carcatèristique1',
		'carcatèristique2',
		'...',
	),
	array(
		'produit2',
		'carcatèristique1',
		'carcatèristique2',
		'...',
	),
	array(
		'produit2',
		'carcatèristique1',
		'carcatèristique2',
		'...',
	),	
);
$spec = array('spec1', 'spec2', 'spec3');

$nb_colonnes = count($produits);
$nb_lignes = count($spec);
?>
<table>
	<?php for ($l = 0; $l <= $nb_lignes; $l++): ?>
	<tr>
		<th><?php echo $l == 0 ? '' : array_shift($spec); ?></th>
		<?php for ($c = 0; $c < $nb_colonnes; $c++): ?>
			<td><?php echo $produits[$c][$l]; ?></td>
		<?php endfor ?>
	</tr>
	<?php endfor ?>
</table>
sauf que je ne peux pas faire comme ça puisque j'ignore le nombre de produits ainsi que le nombre de spec... néanmoins je me suis inspiré de ton code et j'ai réalisé un truc
P.`id_sousCategories` = SC.`id`
ne fonctionne pas, puisque qu'un produits peu être assigné à plusieurs sous-catégorie. Je laisse donc de côté cette partie de ma requête.

Après correction:
<?php
		$requete = mysql_query(
						"SELECT
							P.`produits`,
							P.`thumbnail`, 
							S.`fr` as `spec`,
							PS.`fr` as `pspec`
						FROM produits P,
							spec S,
							produits_spec PS,
							categories C,
							sousCategories SC
						WHERE P.`id_categories` = C.`id`
							AND PS.`id_spec` = S.`id`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY P.`produits`,S.`ordre`
						")or die("20 - ".mysql_error());
		while($info = mysql_fetch_array($requete)) {
			$produits[] = $info;
			$spec = $info['spec'];
			
			$nb_colonnes = count($info['produits']);
			$nb_lignes = count($spec) + 1;
			
			$nb_pspec = count($info['pspec']);
		}
			
			//echo $nb_pspec;
			//echo $nb_lignes;
			//echo $nb_colonnes;
?>
<table>
<?php			
		for ($l = 0; $l <= $nb_lignes; $l++){
			?>
        <tr>
			<th><?php echo $l == 0 ? '' : $spec; ?></th>
                <?php
			for ($c = 0; $c <= $nb_colonnes; $c++){
				?>
            <td><?php echo $produits[$c][$l]; ?></td>
                <?php
			}
				?>
		</tr>
			<?php
		}
	?>
</table>


Ce qui me donne: upload/22504-Untitled-5.png

Pfff... je suis encore loin...
Les tableaux que j'ai mis en début de code sont là pour simuler ta requête sql.

A toi de le remplacer par un while($info = mysql_fetch_array($requete)). Mais au final quand tu fait un print_r du tableau tu dois avoir le même résultat.
ok, si je fais "print_r($produits);" tout ce que j'obtiens c'est une nombre phénoménale d'info.... et aucune association correct "produits/spec"... en clair comme le "PS.`produits` LIKE '%".$produits.",%'" permettait l'association d'info dans mon code d'origine...
Ok donc pour le moment ton problème vient de ta requête.
Test la directement dans phpMyAdmin. Tu y verras plus clair.

Moi de mon côté, j'ai vraiment du mal avec tes tables et tes requêtes.

par exemple :
WHERE S.`fr` = PS.`spec`

Tu utilise encore un intitulé comme clé étrangère. Tu n'as pas un identifiants unique ?

Peut tu expliquer clairement tes tables spec et produits_spec avec toutes tes colonnes. Et faire une capture d'écran des données dans phpMyAdmin.
Pages :