8722 sujets

Développement web côté serveur, CMS

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

Surtout pour l’interpréteur du schéma qui devra se combiner au dechivrage des hiéroglyphes Smiley langue
Ah bon j'ai réussi à faire afficher les produits dans toutes les page en enlevant ceci en début de page:
$r = mysql_query("SELECT fr,lienFR FROM categories WHERE id NOT IN (1,6)")or die("24 - ".mysql_error());
while($c = mysql_fetch_assoc($r)) {
	$search = $c['lienFR'];
	$replace = $c['fr'];
	$categorie = str_replace($search, $replace, $categories);
}


Donc, là tous les produits s'affichent sur toutes les pages, sauf que...

(ben oui! pour faire changement) Si une photo de produits à 2 photos associé dans photos_installation, ben ça m'affiche 2 fois le produits...
Mais diantre ! A quoi sert ce bout de code ?
Pourquoi tu ne fait pas directement ta requête de lecture des produits sur le champ produits.lienFR ?

Edit : Dans ta nouvelle requête tu as oublié de mettre le group by.
Modifié par benj (15 Jun 2013 - 00:54)
Modérateur
juliesunset a écrit :

...
Par contre j'ai du mal avec la table langue, je vois mal comment l'utiliser.
...


C'est simple. Suivant ce modèle, je t'invite à essayer ce script sql sur sqlite 3 (exemple d'applications parmi tant d'autres : sqlite firefox)


CREATE TABLE langues(
	id INTEGER PRIMARY KEY AUTOINCREMENT,
	nom VARCHAR(45)
);
INSERT INTO "langues" VALUES(1,'une langue');

CREATE TABLE produits(
	id INTEGER PRIMARY KEY AUTOINCREMENT,
	nom VARCHAR(45),
	langues_id INTEGER,
	categories_id INTEGER,
	FOREIGN KEY(langues_id) REFERENCES langues(id) ON UPDATE CASCADE ON DELETE CASCADE,
	FOREIGN KEY(categories_id) REFERENCES categories(id) ON UPDATE CASCADE ON DELETE CASCADE
);
INSERT INTO "produits" VALUES(1,'un produit',1,1);

CREATE TABLE descriptions(
	id INTEGER PRIMARY KEY AUTOINCREMENT,
	nom VARCHAR(45),
	langues_id INTEGER,
	produits_id INTEGER,
	FOREIGN KEY(langues_id) REFERENCES langues(id) ON UPDATE CASCADE ON DELETE CASCADE,
	FOREIGN KEY(produits_id) REFERENCES produits(id) ON UPDATE CASCADE ON DELETE CASCADE
);
INSERT INTO "descriptions" VALUES(1,'une description',1,1);

CREATE TABLE categories(
	id INTEGER PRIMARY KEY AUTOINCREMENT,
	nom VARCHAR(45),
	langues_id INTEGER,
	FOREIGN KEY(langues_id) REFERENCES langues(id) ON UPDATE CASCADE ON DELETE CASCADE
);
INSERT INTO "categories" VALUES(1,'une catégorie',1);

DELETE FROM sqlite_sequence;
INSERT INTO "sqlite_sequence" VALUES('langues',1);
INSERT INTO "sqlite_sequence" VALUES('categories',1);
INSERT INTO "sqlite_sequence" VALUES('produits',1);
INSERT INTO "sqlite_sequence" VALUES('descriptions',1);

Ta requête de base que tu peux transformer en vue par la même occasion :

SELECT 
	l.nom,
	c.nom,
	p.nom,
	d.nom
FROM
	langues l,
	categories c,
	produits p,
	descriptions d 
WHERE 
	l.id = c.langues_id 
AND
	l.id = p.langues_id 
AND
	l.id = d.langues_id ;

Tu veux chercher une langue spécifique ?

SELECT 
	l.nom,
	c.nom,
	p.nom,
	d.nom
FROM
	langues l,
	categories c,
	produits p,
	descriptions d 
WHERE 
	l.id = c.langues_id 
AND
	l.id = p.langues_id 
AND
	l.id = d.langues_id 
AND
	l.nom = 'une langue';

Modifié par niuxe (16 Jun 2013 - 13:26)
benj a écrit :
Mais diantre ! A quoi sert ce bout de code ?
Il servait à changé le nom de catégorie récupéré dans le $_GET en début de page. ex: support-fixation devient Support et fixation. Mais je fait ceci juste après le $_GET
$categories = $_GET['categories'];

$search = array('support-fixation','alimentation','memoire','protection-accessoire');
$replace = array('Support et fixation','Alimentation','Mémoire','Protection et accessoire');
$categorie = str_replace($search, $replace, $categories);
C'est pas l'idéal, mais c'est ce qui fonctionne le mieux.
benj a écrit :
Pourquoi tu ne fait pas directement ta requête de lecture des produits sur le champ produits.lienFR ?
C'est ce que j'ai fait.

benj a écrit :
Edit : Dans ta nouvelle requête tu as oublié de mettre le group by.
Corrigé, je n'est plus de répétition, mais ça ne m'affiche quand même qu'une seule des 2 photos installation...


Merci niuxe pour le complément d'info. Je vais regardé ça un peu plus tard parce que présentement je suis en plein rush pour sortir le site... demain!

Mon nouveau code:
	<h1><?php echo $categorie; ?></h1>
	<section class="select">
<?php
$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.`lienFR` = '".$categories."'
			GROUP BY P.`produits`
			ORDER BY P.`nom`") or die("45 - ".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("\r\n", $info['caracteristiqueFR']);
		$bm = explode("\r\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['installation'])){
                    ?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$info['installation']?>.png" alt="" />
                    <?php
				}
				else{
					?>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" 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['complementaire'])){
					?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$info['complementaire']?>.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>
juliesunset a écrit :
Il servait à changé le nom de catégorie récupéré dans le $_GET en début de page. ex: support-fixation devient Support et fixation. Mais je fait ceci juste après le $_GET
[code=php]$categories = $_GET['categories'];
photos installation...
Ah ok, donc c'est bien ce que je pensais, ça ne servait à rien Smiley biggol Par contre, le nom de ta rubrique, c'est pas un information que tu as dans ta base de donnée ? Pourquoi la mettre en dur dans ton code ? En plus tu as moyen de récupérer le nom via ta requête déjà existante.

juliesunset a écrit :
Corrigé, je n'est plus de répétition, mais ça ne m'affiche quand même qu'une seule des 2 photos installation...
Oui, c'est normal que cela t'affiche qu'une image. Dans un autre sujet, je t'avais indiqué qu'il fallait mieux faire 2 requêtes. Une pour la liste des produits, une autre pour la liste des photos. Si tu n'as pas de problème de performance, c'est sans doute la solution la plus simple.
kustolovic a écrit :

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

Je bosse seule et j'ai pas la place dans mon appart pour un tableau blanc ( Smiley lol ).

Et merci pour l'info ^^


Sinon pour afficher les photos. Pourquoi ne pas garder les doublons, les ordonner par l'id du produit et faire une vérification dans la boucle du fetch_assoc ?

Genre:

$NextID=0;
while($info=mysql_fetch_assoc($ressource))
{
    if($info['id']!=$NextID)
    {
         //on affiche les informations du produits
    }
    //on affiche la photo
    $NextID=$info['id']; //on signale que l'ID "précédent" est celui qu'on vient de finir de traiter
}


Enfin c'est une technique que j'utilise assez fréquemment et ça marche très bien (et ça limite les ressources en évitant de devoir fouiller le mysql à chaque recherche);


Et au passage, il serait grand temps de faire migrer le code de mysql_ vers mysqli_ ou PDO Smiley cligne
benj a écrit :
Ah ok, donc c'est bien ce que je pensais, ça ne servait à rien Smiley biggol Par contre, le nom de ta rubrique, c'est pas un information que tu as dans ta base de donnée ? Pourquoi la mettre en dur dans ton code ? En plus tu as moyen de récupérer le nom via ta requête déjà existante.
Ce qui arrive c'est que le header est appelé via un fichier externe et c'est dans ce fichier que sont appelé les infos pour se connecté à la bdd. Le "hic" est que je dois appelé le fichier après les balises pour les css et script, ainsi que pour le title et meta description... ça donne ceci:
$categories = $_GET['categories'];

$search = array('support-fixation','alimentation','memoire','protection-accessoire');
$replace = array('Support et fixation','Alimentation','Mémoire','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");
la dernière ligne est mon fichier header. Je ne peux donc pas faire de requête avant ce bout de code... J'ai tenté d'appelé un fichier de connection au tout début, sans succès...

benj a écrit :
Oui, c'est normal que cela t'affiche qu'une image. Dans un autre sujet, je t'avais indiqué qu'il fallait mieux faire 2 requêtes. Une pour la liste des produits, une autre pour la liste des photos. Si tu n'as pas de problème de performance, c'est sans doute la solution la plus simple.
C'est bien ce que je pensais
juliesunset a écrit :
la dernière ligne est mon fichier header. Je ne peux donc pas faire de requête avant ce bout de code... J'ai tenté d'appelé un fichier de connection au tout début, sans succès...
Il n'y a pas de raison pour que tu n’arrive pas a te connecter à la bdd au début de fichier. Tu te bloque pour pas grand chose.
Pour ma part je fais tous mes traitements de donnée avant d'afficher du html.

Lothindil a écrit :
Enfin c'est une technique que j'utilise assez fréquemment et ça marche très bien (et ça limite les ressources en évitant de devoir fouiller le mysql à chaque recherche);
En effet la solution est bonne. Par contre, avec ton code dans l'état, il faut que la requête soit trié par id, sinon c'est pas bon.
J'utilise aussi une solution à base de group_concat, suivi suivi d'un implode(). Par contre il faut faire attention les chaines de group_conca sont tronquées par mysql.
Modifié par benj (18 Jun 2013 - 17:26)
Merci pour ta réponse Lothindil, je ne l'avais pas vue! Entouka je retiens ta solution, mais pour l'instant ça va j'ai réussi à faire l'affichage des images et des infos en 3 requêtes...
Lothindil a écrit :
Et au passage, il serait grand temps de faire migrer le code de mysql_ vers mysqli_ ou PDO Smiley cligne
J'ai commencé à regarder ça, mais je ne comprend pas tout pour l'instant. À suivre...

benj a écrit :
Il n'y a pas de raison pour que tu n’arrive pas a te connecter à la bdd au début de fichier. Tu te bloque pour pas grand chose.
J'ai bien dit que j'avais essayé, mais pas réussi... Smiley cligne
juliesunset a écrit :

J'ai commencé à regarder ça, mais je ne comprend pas tout pour l'instant. À suivre...
Suis le lien de ma signature, t'auras une version simplifiée Smiley cligne

a écrit :
En effet la solution est bonne. Par contre, avec ton code dans l'état, il faut que la requête soit trié par id, sinon c'est pas bon.
Je l'ai précisé ^^ on garde les doublons et on trie par l'id ^^

Si on veut trier par un autre champ, c'est cet autre champ qu'il faut comparer. (je le fais quand je trie par ordre alphabétique ^^)
Modifié par Lothindil (18 Jun 2013 - 19:25)
Lothindil a écrit :
Suis le lien de ma signature, t'auras une version simplifiée Smiley cligne

Ah jolie! Je vais regardé ça!

en attendant on peu dire problème résolue, même si le code est encore perfectible. Et le site est maintenant en ligne:
l'une des pages dont il était question ici

Mon code:
<?php
$categories = $_GET['categories'];

$search = array('support-fixation','alimentation','memoire','protection-accessoire');
$replace = array('Support et fixation','Alimentation','Mémoire','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
$req = mysql_query( 
			"SELECT 
				P.`id`, 
				P.`produits`, 
				P.`nom`,
				D.`caracteristiqueFR`,
				D.`installationFR`,
				D.`noteFR`,
				IP.`lien`,
				IP.`photo`
			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`
			WHERE P.`etat` = 'actif' 
				AND C.`lienFR` = '".$categories."'
			GROUP BY P.`produits`
			ORDER BY P.`nom`") or die("45 - ".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("\r\n", $info['caracteristiqueFR']);
		$bm = explode("\r\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
				$q = mysql_query( 
						"SELECT II.`installation`
						FROM `photos_produits` IP
						LEFT JOIN `photos_installations` II
							ON II.`id_photo` = IP.`id`
						WHERE IP.`id_produits` = '".$info['id']."'") or die("90 - ".mysql_error());
				while ($photo = mysql_fetch_assoc($q)){
					?>
				<?php
                	if(!empty($photo['installation'])){
						if($info['produits'] == 'XHD-S90E'){
                    ?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$photo['installation']?>.png" alt="" width="200" />
                    <?php
						}
						else{
                    ?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$photo['installation']?>.png" alt="" />
                    <?php
						}
					}
					else{
					?>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" 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>');
				}
				
				$q = mysql_query("SELECT complementaire FROM photos_complementaires WHERE id_photo = '".$info['id_photo']."'") or die("130 - ".mysql_error());
				while ($photo = mysql_fetch_assoc($q)){	
					if(!empty($photo['complementaire'])){
					?>
					<img src="/images/<?php echo $info['lien'].$info['photo'].$photo['complementaire']?>.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"); ?>
Pages :