8726 sujets

Développement web côté serveur, CMS

Pages :
(reprise du message précédent)

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.
benj a écrit :
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.
un petit exemple en ligne: -http://www.spypoint.com/FR/cameras/chasse/camera.php?produits=BF-10HD
un peu plus bas tu voit un tableau de caractéristique.
la Table spec contient les info de la colonne de gauche. la table produits_spec les info de colonne de droite avec les assignations aux différente caméras. Donc le tableaux n'affiche pas la même chose d'une caméras à l'autre.

benj a écrit :
par exemple :
WHERE S.`fr` = PS.`spec`

Tu utilise encore un intitulé comme clé étrangère. Tu n'as pas un identifiants unique ?
Je suis en-train de faire quelque ajustement à ce niveau. Cette partie là de la requête n'existe plus c'est maintenant
 PS.`id_spec` = S.`id`
comme tu peux le voir un peu plus haut.

J'ai aussi créée une nouvelle table contenant les id des produits_spec et les id des produits pour faire les assignation comme tu me l'a conseillé. Mais pour l'instant il semble y avoir une erreur... J'ai ceci comme message "20 - Unknown column 'PSP.id_produits' in 'where clause'" et pourtant ça correspond...

ma nouvelle requête pour le moment:
$requete = mysql_query(
		"SELECT
			P.`produits`,
			P.`thumbnail`, 
			S.`fr` as `spec`,
			PS.`fr` as `pspec`
		FROM produits P,
			spec S,
			produits_spec PS,
			produits_spec_produits PSP,
			categories C,
			sousCategories SC
		WHERE P.`id_categories` = C.`id`
			AND PS.`id_spec` = S.`id`
			AND PSP.`id_produits` = P.`id`
			AND PSP.`id_produits_spec` = PS.`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());
juliesunset a écrit :
un petit exemple en ligne: -http://www.spypoint.com/FR/cameras/chasse/camera.php?produits=BF-10HD
un peu plus bas tu voit un tableau de caractéristique.
la Table spec contient les info de la colonne de gauche. la table produits_spec les info de colonne de droite avec les assignations aux différente caméras. Donc le tableaux n'affiche pas la même chose d'une caméras à l'autre.
Des captures d'écran des données via phpMyAdmin ? Envoi des liens en message privé si tu préfère.
table spec:
upload/22504-spec.png

table produits_spec:
upload/22504-produitssp.png

et j'ai créée cette table comme tu me la conseillé:
table produits_spec_produits:
upload/22504-specprodui.png
Modifié par juliesunset (28 May 2013 - 15:29)
J'ai fait exécuter ma requête dans phpMyAdmin, il y avait clairement une erreur.
J'ai retiré l'appel à la table sousCatégorie et maintenant sa fonctionne dans phpMyAdmin, mais la requête s'arrête à 17 lignes...

nouvelle requête:
$requete = mysql_query(
		"SELECT
			P.`produits`,
			P.`thumbnail`, 
			S.`fr` as `spec`,
			PS.`fr` as `pspec`
		FROM produits P,
			spec S,
			produits_spec PS,
			produits_spec_produits PSP,
			categories C
		WHERE PSP.`id_produits` = P.`id`
			AND PS.`id_spec` = S.`id`
			AND PSP.`id_produits_spec` = PS.`id`
			AND P.`id_categories` = C.`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());


ce que ça me donne dans phpMyAdmin:
upload/22504-Untitled-6.png

ce que ça donne dans ma page web:
upload/22504-Untitled-7.png
Je te conseil de faire 2 requêtes, une pour la liste des produits et une autre pour la liste des specs associé à 1 produit.


SELECT
			P.`produits`,
			P.`thumbnail`, 
		FROM produits P,
			categories C,
			sousCategories SC
		WHERE P.`id_categories` = C.`id`
			AND C.`fr` = 'Caméras'
			AND P.`etat` = 'yes' 
			AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
		ORDER BY P.`produits`



SELECT
			S.`fr` as `spec`,
			PS.`fr` as `pspec`
		FROM produits_spec PS,
			spec S,
			produits_spec_produits PSP,
		WHERE PS.`id_spec` = S.`id`
			AND PSP.`id_produits` = P.`id`
			AND PSP.`id_produits_spec` = PS.`id`
                        AND PSP.`id_produits` = `14`
		ORDER BY S.`ordre`


14 étant un exemple de produit.

Test les 2 requêtes dans phpMyadmin et regarde bien si le résultat est bon. Pas d'erreur, pas de doublon...

a écrit :
Donc le tableaux n'affiche pas la même chose d'une caméras à l'autre.

Donc au final tu auras des cellules vide dans ton tableau au niveau des caractéristiques ?
Ok je vais essayer ça

benj a écrit :
Donc au final tu auras des cellules vide dans ton tableau au niveau des caractéristiques ?
Non les spec qui ne correspond pas à la caméras sélectionné ne s'affiche pas.
juliesunset a écrit :
Non les spec qui ne correspond pas à la caméras sélectionné ne s'affiche pas.

Donc pour ton code html, il te faudra autant de tableau que tu as de produit.

Si je comprends bien, c'est ce genre de truc que tu veux ?
-----------------------------------------------
| ------ | produit 1 | -------- | produit 2 |
|spec1 | paramètre | spec2 | paramètres |
|spec3 | paramètre | spec4 | paramètres |
------------------------------------------------
voilà mes 2 requêtes, elles fonctionnent dans phpMyAdmin.
J'ai remplacé "$id_produits" par le id d'une caméra et ça m'affiche les bonnes info
$requete = mysql_query(
						"SELECT
							P.`id`,
							P.`produits`,
							P.`thumbnail`
						FROM produits P,
							categories C
						WHERE P.`id_categories` = C.`id`
							AND C.`fr` = 'Caméras'
							AND P.`etat` = 'yes' 
							AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
						ORDER BY P.`produits`")or die("20 - ".mysql_error());
	while($info = mysql_fetch_array($requete)) {
		$produits[] = $info;
		$id_produits = $info['id'];
		//echo $id_produits;	
	}
	$requete = mysql_query(
						"SELECT
							S.`fr` as `spec`,
							PS.`fr` as `pspec`
						FROM spec S,
							produits_spec PS,
							produits_spec_produits PSP
						WHERE PS.`id_spec` = S.`id`
							AND PSP.`id_produits_spec` = PS.`id`
							AND PSP.`id_produits` = '$id_produits'
						ORDER BY S.`ordre`")or die("38 - ".mysql_error());
	while($info = mysql_fetch_array($requete)) {
		$spec = $info['spec'];
		$nb_pspec = count($info['pspec']);
	}
			
		$nb_colonnes = count($info['produits']);
		$nb_lignes = count($spec) + 1;


mais dans ma page web...
upload/22504-Untitled-8.png
benj a écrit :

Donc pour ton code html, il te faudra autant de tableau que tu as de produit.

Si je comprends bien, c'est ce genre de truc que tu veux ?
-----------------------------------------------
| ------ | produit 1 | -------- | produit 2 |
|spec1 | paramètre | spec2 | paramètres |
|spec3 | paramètre | spec4 | paramètres |
------------------------------------------------

Ah ok, j'ai confondu avec le tableau de la page que je te donnait en exemple plus haut.
Sinon pour ce cas-ci il y aura bien des cellule vide.

Ça sera donc
-----------------------------------------------
| ----- | -produit 1- | -produit 2- |...
|spec1 | paramètre | paramètres |
|spec3 | paramètre | paramètres |
...
------------------------------------------------

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

Modifié par benj (28 May 2013 - 17:01)
On approche du but!
upload/22504-Untitled-9.png


<?php
	$requete = mysql_query(
			"SELECT
				P.`id`,
				P.`produits`,
				P.`thumbnail`
			FROM produits P,
				categories C
			WHERE P.`id_categories` = C.`id`
				AND C.`fr` = 'Caméras'
				AND P.`etat` = 'yes' 
				AND P.`produits` NOT IN ('BLACKBOX-D (TINY-W3)') 
			ORDER BY P.`produits`")or die("20 - ".mysql_error());
	while($info = mysql_fetch_array($requete)) {
		
		$requete = mysql_query(
				"SELECT
					S.`id`,
					S.`fr` as `spec`,
					PS.`fr` as `pspec`
				FROM spec S,
					produits_spec PS,
					produits_spec_produits PSP
				WHERE PS.`id_spec` = S.`id`
					AND PSP.`id_produits_spec` = PS.`id`
					AND PSP.`id_produits` = '".$info['id']."'
				ORDER BY S.`ordre`")or die("36 - ".mysql_error());
		while($info_spec = mysql_fetch_array($requete)) {
			$info['specs'][$info_spec['id']] = $info_spec['pspec'];
			$spec[$info_spec['id']] = $info_spec['spec'];
		}

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

    		<?php for ($c = 0; $c < $nb_colonnes; $c++):?>
        	<td>
		<?php 
			echo $l == 0 ? $produits[$c][$l] : $produits[$c]['specs'][$id_spec]; 
		?>
        	</td>
		<?php endfor ?>
	</tr>
	<?php endfor ?>
</table>
avant $nb_colonnes = count($produits); regarde ce que donne les 2 tableaux.
As tu le résultat escompté ? 1 seul produit ? Si c'est ça, vérifie tes requêtes, essaye de débusquer les bugs...

J'avais enlevé le +1 de $nb_lignes = count($spec) + 1; qui faisait une ligne de trop.
si je fait print_r($produits); j'obtiens ceci
a écrit :
Array (
[0] => Array (
[0] => 163
[id ] => 163
[1] => 2N1
[produits ] => 2N1
[2] => 2N1/2N1_mini.png
[thumbnail ] => 2N1/2N1_mini.png
[specs ] => Array (
[1] => 5 MP
[2] => 35 DEL ou Flash
[3] => Noires
[6] => non
[8] => Non ) ) )


à vue de nez ça semble correct

benj a écrit :
J'avais enlevé le +1 de $nb_lignes = count($spec) + 1; qui faisait une ligne de trop.
A ba ouais!
upload/22504-Untitled-1.png

EDIT: J'ai revérifié les requête, et tout est correct de ce côté. La permière sélectionne bien tous les produits demandé et la seconde affiche les info relatif au id_produits indiqué.
Modifié par juliesunset (28 May 2013 - 18:28)
Bon je crois que maintenant c'est ok. J'ai réécrit la partie du tableau, car la fonction array_shift ne correspondait plus. Je te laisse à tes futurs bugs Smiley cligne

<table>
	<tr>
		<th></th>
		<?php for ($c = 0; $c < $nb_colonnes; $c++): ?>
			<td><?php echo $produits[$c]['produits']; ?></td>
		<?php endfor ?>
	</tr>
	<?php foreach ($spec as $l => $intitule): ?>
	<tr>
		<th><?php echo $intitule; ?></th>
		<?php for ($c = 0; $c < $nb_colonnes; $c++): ?>
			<td><?php echo $produits[$c]['specs'][$l]; ?></td>
		<?php endfor ?>
	</tr>
	<?php endforeach ?>
</table>
Ah ouais! C'est beaucoup mieux! Smiley langue

Est-ce que c'est normal que ça ne m'affiche qu'un produit? parce que normalement ça devrait tous les afficher...
Ah ba ouais, pourquoi j'y est pas pensé ça m'arrive tout le temps en plus!

Ça fonctionne parfaitement maintenant!!!! Plus qu'à faire afficher l'image "thumbnail" pour chaque caméra.

Mer-ci beau-coup pour ton aide!!! J'aurais bidouillé longtemps avant d'y arrivé! Si je peux te rendre la pareil dans un domaine avec lequel j'ai plus d'affinité (graphisme) gène-toi surtout pas!!! Smiley biggrin
Le reste ne devrait pas être trop dur.


Cela serait pas mal que tu fasse ta modélisation de ta base (schéma) avec le logiciel déjà vu plus loin. Il y a moyen de faire de la rétro-ingénierie http://www.mysql.fr/products/workbench/design/
Par contre il faudra que tu rajoute tes liaisons entre les tables.
Tu as pas mal de lacunes la dessus qui mériterait d'être comblées.

Pour info, tu peux supprimer la colonne produits_spec_produits.id qui ne sert à rien. La clé primaire est ici sur les 2 colonnes.

Tu peux aussi normalement supprimer produits_spec.produits
Oui j'ai commencé à regarder le logiciel, mais les modifications au niveau de la bdd de spypoint ne se feront pas tout de suite, elle commence à être grosse pas mal ce qui implique beaucoup de travail. Mais ça sera fait. En attendant je vais appliquer ça pour le 2e site dont la bdd commence tout juste à "naître".

Merci encore pour ton aide!
Modifié par juliesunset (28 May 2013 - 22:12)
Pages :