8790 sujets
Développement web côté serveur, CMS
Ah bon j'ai réussi à faire afficher les produits dans toutes les page en enlevant ceci en début de page:
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...
$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...
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 :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
Mais diantre ! A quoi sert ce bout de code ?
$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 :C'est ce que j'ai fait.
Pourquoi tu ne fait pas directement ta requête de lecture des produits sur le champ produits.lienFR ?
benj 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...
Edit : Dans ta nouvelle requête tu as oublié de mettre le group by.
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 :Ah ok, donc c'est bien ce que je pensais, ça ne servait à rien
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...

juliesunset 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.
Corrigé, je n'est plus de répétition, mais ça ne m'affiche quand même qu'une seule des 2 photos installation...
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 (

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

benj a écrit :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:
Ah ok, donc c'est bien ce que je pensais, ça ne servait à rienPar 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.
$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 :C'est bien ce que je pensais
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.
juliesunset 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.
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...
Pour ma part je fais tous mes traitements de donnée avant d'afficher du html.
Lothindil 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.
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);
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 :J'ai commencé à regarder ça, mais je ne comprend pas tout pour l'instant. À suivre...
Et au passage, il serait grand temps de faire migrer le code de mysql_ vers mysqli_ ou PDO Smiley cligne
benj a écrit :J'ai bien dit que j'avais essayé, mais pas réussi...
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.

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

a écrit :Je l'ai précisé ^^ on garde les doublons et on trie par l'id ^^
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.
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![]()
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"); ?>