8711 sujets

Développement web côté serveur, CMS

Pages :
Hello! J'ai un petit souci de répétition...

Dans le nouveau site, j'ai fait une page qui affiche un certain nombre de produits, différent selon la sélection.

Donc à l'aide d'un $_GET je récupère le nom de la catégorie sélectionné et pis j'affiche le produits qui correspondent. Ça fonctionne bien pour 2 catégories sur 4, Pour celles qui ne fonctionne pas bien, les produits s'affichent mais multiplié par 6... Là je sèche pourquoi ça fonctionne bien une fois sur deux alors que c'est le même code?

Je vous mets mon code:
<?php
$categories = $_GET['categories'];
$search = array('alimentation','memoire','support-fixation','protection-accessoire');
$replace = array('Alimentation','Mémoire','Support et fixation','Protection et accessoire');
$categorie = str_replace($search, $replace, $categories);


$preprocess['title'] = " - ".$categorie."";
if($categorie == 'Alimentation'){
$preprocess['meta']['description'] = "Accessoires d'alimentation disponible pour la caméra vidéo XCEL HD, télécommande, adaptateurs, câbles et piles.";
}
if($categorie == 'Mémoire'){
$preprocess['meta']['description'] = "Accessoires disponible pour la caméra vidéo XCEL HD, cartes micro-SD et lecteur de cartes.";
}
if($categorie == 'Support et fixation'){
$preprocess['meta']['description'] = "Supports et fixations disponible pour la caméra vidéo XCEL HD";
}
if($categorie == 'Protection et accessoire'){
$preprocess['meta']['description'] = "Accessoires de protection disponible pour la caméra vidéo XCEL HD, boîtiers étanche et protecteur de lentille.";
}
$preprocess['mainid'] = "accessoires";

require_once($_SERVER['DOCUMENT_ROOT'] . "/includes/topFr3.inc.php");
?>
	<h1><?php echo $categorie; ?></h1>
	<section class="select">
<?php
$r = mysql_query("SELECT fr,lienFR FROM categories")or die("24 - ".mysql_error());
while($c = mysql_fetch_assoc($r)) {
	$search = $c['lienFR'];
	$replace = $c['fr'];
	$categorie = str_replace($search, $replace, $categories);
?>
	<?php
	$req = mysql_query( 
					"SELECT 
						P.`produits`, 
						P.`nom`,
						I.`lien`,
						I.`photo`,
						I.`installation1`,
						I.`installation2`,
						I.`complementaire1`,
						I.`complementaire2`,
						D.`caracteristiqueFR`,
						D.`installationFR`,
						D.`noteFR`
					FROM `produits` P,
						`photos_produits` I,
						`descriptions` D,
						`categories` C
					WHERE I.`id_produits` = P.`id`
						AND D.`id_produits` = P.`id`
						AND P.`id_categories` = C.`id`
						AND P.`etat` = 'actif' 
						AND C.`fr` = '".$categorie."' 
					ORDER BY P.`nom`") or die("44 - ".mysql_error());
	while ($info = mysql_fetch_assoc($req)){
		?>
		<article id="<?php echo $info['produits'];?>" class="popup">
			<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="100" alt="" />
            <h1><?php echo $info['nom'];?></h1>
		<?php
		$am = explode("\n", $info['caracteristiqueFR']);
		$bm = explode("\n", $info['installationFR']);
		if(!empty($info['caracteristiqueFR'])){
            foreach($am as $a) {
            	echo ('<p>'.stripslashes($a).'</p>');
            }
		}
		?>
			<div class="descr">
            	<a class="right close ico_close" title="fermer" aria-hidden="true"><span class="visuallyhidden">fermer</span></a>
				<h2><?php echo $info['nom'];?></h2>
                <div class="left">
				<?php
                if(!empty($info['installation1'])){
                    ?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$info['installation1']?>.png" width="150" alt="" />
					<?php
                    if(!empty($info['installation2'])){
						?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$info['installation2']?>.png" width="150" alt="" />
                    <?php
					}
				}
				else{
					?>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="150" alt="" />
                    <?php
				}
				?>
				</div>
                <div class="left texte">
                <?php
                if(!empty($info['caracteristiqueFR'])){
                	foreach($am as $a) {
                    	echo ('<p>'.stripslashes($a).'</p>');
                    }
                }
                if(!empty($info['installationFR'])){
                	echo ('<h3>Installation:</h3>');
					echo('<ol>');
					foreach($bm as $b) {
                    	echo '<li>'.(stripslashes($b).'</li>');
					}
					echo('</ol>');
				}
					
				if(!empty($info['complementaire1'])){
					?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$info['complementaire1']?>.png" width="150" alt="" />
					<?php
                    if(!empty($info['complementaire2'])){
                    	?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$info['complementaire2']?>.png" width="150" alt="" />
						<?php
                    }
				}
                if(!empty($info['noteFR'])){
                	echo '<p class="clear">* '.$info['noteFR'].'</p>';
                }
                ?>
                	<p><?php echo '(#'.$info['produits'].')';?></p>
				</div>
			</div>
		</article>
			<?php
		}
}
?>
	</section>    
<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/includes/bottomFr2.inc.php"); ?>

Modifié par juliesunset (18 Jun 2013 - 20:17)
Non, du tout, c'est vraiment au niveau de la sélection de le catégorie...
par exemple, si je sélectionne "fixation" ou "protection" tous les produits associé s'affichent une fois. Mais si je sélectionne "alimentation" ou "mémoire" les produits s'affichent mais 6 fois chacun! de cette façon:
ex:
MICRO-SD-16GB, MICRO-SD-32GB, RD25-1, MICRO-SD-16GB, MICRO-SD-32GB, RD25-1, MICRO-SD-16GB, MICRO-SD-32GB, RD25-1, MICRO-SD-16GB, MICRO-SD-32GB, RD25-1, MICRO-SD-16GB, MICRO-SD-32GB, RD25-1, MICRO-SD-16GB, MICRO-SD-32GB, RD25-1
Je pensais que c'était pour faire des calcules... Entouka j'ai essayé d'en ajouté un et ça ne change rien. J'ai enlevé.
le group by ne sert pas à faire que des calculs mais c'est plus ou moins sa principale utilité Smiley smile

peux tu nous montrer la structure de tes trois tables ? je pense que çà nous aiderai beaucoup

En tout cas moi je pense avant tous à une erreur de requête.
Super le schéma ! Finalement les conseils portent ses fruits Smiley cligne
Par contre il faut que tu vérifie bien les relations que tu as faites. Il est par exemple étonnant d'avoir 2 relations entre categories et produits. De plus vérifie bien aussi les cardinalités.

Un produit peut il avoir plusieurs descriptions ? plusieurs photos ? Et dans l'autre sens...

Pour info, avec mysql Workbench, il y a plusieurs conventions pour l'affichage des cardinalités. Perso, je préfère la notation uml. (menu > Model > relationship notation > uml)

Pour confirmer à coup sur que ton problème vient de ta requête (ce que je penses et que mini-truc aussi), il suffit de tester tes requête dans phpMyadmin et voir si tu as toujours le même résultat.

C'est toujours pareil, quand tu as un problème, essaye d'abord de l'isoler.
Modifié par benj (13 Jun 2013 - 20:03)
benj a écrit :
Super le schéma ! Finalement les conseils portent ses fruits Smiley cligne
Smiley cligne t'inquiète je prend toujours bonne note de vos conseil, j'ai juste pas toujours le temps de tout faire dans l'instant! Dans ce cas précis, le site est tout nouveau tout beau! une belle occasion d'appliquer vos conseils!

benj a écrit :
Par contre il faut que tu vérifie bien les relations que tu as faites. Il est par exemple étonnant d'avoir 2 relations entre categories et produits.
Ah ouais, ça je ne sais pas d'où ça vient, c'est la première fois que j'utilise le logiciel, j'ai encore du mal avec! En réalité, il n'y a qu'une relation, je n'arrivais pas à enlevé la 2e...

benj a écrit :
De plus vérifie bien aussi les cardinalités.
Euh... là tu me perd! Cardinalité???

benj a écrit :
Un produit peut il avoir plusieurs descriptions ? plusieurs photos ? Et dans l'autre sens...
Un produits peu avoir plusieurs photos. Mais un même photo ne peux être assigné à plusieurs produits, sauf une exception.

benj a écrit :
Pour info, avec mysql Workbench, il y a plusieurs conventions pour l'affichage des cardinalités. Perso, je préfère la notation uml. (menu &gt; Model &gt; relationship notation &gt; uml)
Je vais essayer.

benj a écrit :
Pour confirmer à coup sur que ton problème vient de ta requête (ce que je penses et que mini-truc aussi), il suffit de tester tes requête dans phpMyadmin et voir si tu as toujours le même résultat.

C'est toujours pareil, quand tu as un problème, essaye d'abord de l'isoler.
Testé, tout est beau. Chaque catégorie m'affiche les bons produits, le bon nombre de fois... C'est pourtant pas le cas dans ma page pour 2 des catégories...
a écrit :
Ah ouais, ça je ne sais pas d'où ça vient, c'est la première fois que j'utilise le logiciel, j'ai encore du mal avec! En réalité, il n'y a qu'une relation, je n'arrivais pas à enlevé la 2e...

http://www.grafikart.fr/tutoriels/mysql/modeliser-base-de-donnee-75

a écrit :
Euh... là tu me perd! Cardinalité???

http://fr.wikipedia.org/wiki/Mod%C3%A8le_relationnel#Cardinalit.C3.A9_de_relation

a écrit :
Un produits peu avoir plusieurs photos. Mais un même photo ne peux être assigné à plusieurs produits, sauf une exception.

Attention, à l'exception ! Si tu as une relation m:n (Un produits peu avoir plusieurs photos et une photo peut être assigné à plusieurs produits) il te faut une table supplémentaire de liaison.
Fait en sorte donc que cette photo soit avec un id différent.

Pour en revenir à ton problème, si tu as un produit qui peut avoir plusieurs photos, il est normal d'avoir autant de ligne pour un même produit que tu as de photos pour ce produit.

D’où le group by produits.id qui te permet de récupérer qu'une seul ligne par produit. (mais aussi qu'une seul photo)
Merci pour les liens, je regarde ça!

benj a écrit :
Attention, à l'exception ! Si tu as une relation m:n (Un produits peu avoir plusieurs photos et une photo peut être assigné à plusieurs produits) il te faut une table supplémentaire de liaison.
Fait en sorte donc que cette photo soit avec un id différent.
J'ai mis en stand by pour l'instant, disons que la façon que j'appelle mes photos complique les chose.

benj a écrit :
Pour en revenir à ton problème, si tu as un produit qui peut avoir plusieurs photos, il est normal d'avoir autant de ligne pour un même produit que tu as de photos pour ce produit.

D’où le group by produits.id qui te permet de récupérer qu'une seul ligne par produit. (mais aussi qu'une seul photo)
Pourtant ça fonctionne bien pour 2 des 4 catégories...

sinon j'ai ajouté un group by à ma requête et ça ne change rien...:
$req = mysql_query( 
		"SELECT 
			P.`produits`, 
			P.`nom`,
			I.`lien`,
			I.`photo`,
			I.`installation1`,
			I.`installation2`,
			I.`complementaire1`,
			I.`complementaire2`,
			D.`caracteristiqueFR`,
			D.`installationFR`,
			D.`noteFR`
		FROM `produits` P,
			`photos_produits` I,
			`descriptions` D,
			`categories` C
		WHERE I.`id_produits` = P.`id`
			AND D.`id_produits` = P.`id`
			AND P.`id_categories` = C.`id`
			AND P.`etat` = 'actif' 
			AND C.`fr` = '".$categorie."' 
		GROUP BY P.`id`
		ORDER BY P.`nom`") or die("44 - ".mysql_error());
Ok, donc maintenant que c'est un peut plus clair au niveau de tes tables et de ta requête, on va se pencher un peu sur ton code php. Qui mériterait quelques commentaires.

Cette partie là est pour moi plus que bizarre.
<?php
$r = mysql_query("SELECT fr,lienFR FROM categories")or die("24 - ".mysql_error());
while($c = mysql_fetch_assoc($r)) {
    $search = $c['lienFR'];
    $replace = $c['fr'];
    $categorie = str_replace($search, $replace, $categories);
?>

Tu cherche qu'une seul catégorie sur cette page ? Alors pourquoi tu boucle sur toutes les catégorie ?
Modérateur
Bonsoir,

Ça ne serait pas mieux avec ce genre de model (je n'ai pas typé les champs) ?

upload/12813-modelbased.png

model de base de données

Dans installations et complémentaires, il n'y a pas de relation de n * n ?
Modifié par 6l20 (14 Jun 2013 - 08:09)
benj a écrit :
Ok, donc maintenant que c'est un peut plus clair au niveau de tes tables et de ta requête, on va se pencher un peu sur ton code php. Qui mériterait quelques commentaires.

Cette partie là est pour moi plus que bizarre.
&lt;?php
$r = mysql_query(&quot;SELECT fr,lienFR FROM categories&quot;)or die(&quot;24 - &quot;.mysql_error());
while($c = mysql_fetch_assoc($r)) {
    $search = $c['lienFR'];
    $replace = $c['fr'];
    $categorie = str_replace($search, $replace, $categories);
?&gt;

Tu cherche qu'une seul catégorie sur cette page ? Alors pourquoi tu boucle sur toutes les catégorie ?

Ah ouais.... alors j'ai fermé la boucle à cet endroit au lieu d'à la fin... Et la ça marche! Smiley biggol pfff... faut que je perde mes vieux réflexes...


Merci Niuxe pour ton commentaire. Tu marque un point quand à séparer la table photo en 3, ça pourrait être plus pratique effectivement. Par contre j'ai du mal avec la table langue, je vois mal comment l'utiliser.
Bon j'ai fait les modif au niveau de ma bdd en séparant la table photos_produits en 3 comme suggéré par niuxe...

Mais du coup j'ai encore des problèmes d'affichage... Pour l'une de mes catégories, rien ne s'affiche. J'ai vérifié ma requête dans phpmyadmin et elle est bonne.

Aussi je ne peux plus mettre ma requête comme suis, car s'il n'y a pas de correspondance pour les table photos_installations ou photos_complementaires, le produit ne s'affiche pas...
$req = mysql_query( 
			"SELECT 
				P.`produits`, 
				P.`nom`,
				IP.`lien`,
				IP.`photo`,
				II.`installation`,
				IC.`complementaire`,
				D.`caracteristiqueFR`,
				D.`installationFR`,
				D.`noteFR`
			FROM `produits` P,
				`descriptions` D,
				`categories` C,
				`photos_produits` IP,
				`photos_installations` II,
				`photos_complementaires` IC
			WHERE D.`id_produits` = P.`id`
				AND P.`id_categories` = C.`id`
				AND P.`etat` = 'actif' 
				AND C.`fr` = '".$categorie."'
				AND IP.`id_produits` = P.`id`
				AND II.`id_photo` = IP.`id`
				AND IC.`id_photo` = IP.`id`
			ORDER BY P.`nom`") or die("45 - ".mysql_error());


Je doit donc remettre des LEFT JOIN:
$req = mysql_query( 
			"SELECT 
				P.`produits`, 
				P.`nom`,
				D.`caracteristiqueFR`,
				D.`installationFR`,
				D.`noteFR`,
				IP.`lien`,
				IP.`photo`,
				II.`installation`,
				IC.`complementaire`
			FROM `produits` P
			LEFT JOIN `categories` C
				ON P.`id_categories` = C.`id`
			LEFT JOIN `descriptions` D
				ON D.`id_produits` = P.`id`
			LEFT JOIN `photos_produits` IP
				ON IP.`id_produits` = P.`id`
			LEFT JOIN `photos_installations` II
				ON II.`id_photo` = IP.`id`
			LEFT JOIN `photos_complementaires` IC
				ON IC.`id_photo` = IP.`id`
			WHERE P.`etat` = 'actif' 
				AND C.`fr` = '".$categorie."'
			ORDER BY P.`nom`") or die("45 - ".mysql_error());

Modifié par juliesunset (14 Jun 2013 - 15:47)
Modérateur
Lothindil a écrit :
*question hors sujet, mais pas tout à fait. Vous utilisez quel programme pour vos schémas de bdd ?*

White board, c'est super efficace, collaboratif, toussa, par contre la version qui génère les tables automatiquement est un peu chère…

upload/32231-whiteboard.jpg
Pages :