8791 sujets

Développement web côté serveur, CMS

Bonjour,

Dans une page j'ai 2 bloc dans lesquels je doit faire affiché une série de produits, mais pas les même. Donc pour l'instant je fais 2 requêtes avec des conditions différente.
<article>
            <h2>Accessoires inlcus: </h2>
			<?php
			$req = mysql_query( 
					"SELECT 
						P.`produits`, 
						P.`nom`,
						I.`lien`,
						I.`photo`
					FROM `produits` P
					LEFT JOIN `photos_produits` I
						ON I.`id_produits` = P.`id`
					LEFT JOIN `categories` C
						ON P.`id_categories` = C.`id`
					WHERE P.`etat` = 'actif' 
						AND P.`type` = 'inclus' 
						AND P.`kit` != 'sport'
					ORDER BY C.`fr`") or die("46 - ".mysql_error());
			while ($info = mysql_fetch_assoc($req)){
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="70" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
			}
			?>
            </article>
            <article>
            <h2>Accessoires disponible: </h2>
			<?php
			$req = mysql_query( 
					"SELECT 
						P.`produits`, 
						P.`nom`,
						I.`lien`,
						I.`photo`
					FROM `produits` P
					LEFT JOIN `photos_produits` I
						ON I.`id_produits` = P.`id`
					LEFT JOIN `categories` C
						ON P.`id_categories` = C.`id`
					WHERE P.`etat` = 'actif' 
						AND P.`type` != 'inclus' 
						AND P.`kit` != 'sport'
						AND P.`produits` NOT IN ('XCEL HD','XHD-HUNTACC')
					ORDER BY C.`fr`") or die("90 - ".mysql_error());
			while ($info = mysql_fetch_assoc($req)){
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="100" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
			}
			?>
            </article>


Je pense qu'il est possible de faire une seule requête et d'appeler les bon élément à coup de "if", mais je n'arrive pas à la faire...

J'ai tenté ceci, mais ça ne fonctionne pas:
<?php
			$req = mysql_query( 
					"SELECT 
						P.`produits`, 
						P.`nom`,
						I.`lien`,
						I.`photo`
					FROM `produits` P
					LEFT JOIN `photos_produits` I
						ON I.`id_produits` = P.`id`
					LEFT JOIN `categories` C
						ON P.`id_categories` = C.`id`
					WHERE P.`etat` = 'actif'
					ORDER BY C.`fr`") or die("46 - ".mysql_error());
			if($info['type'] === 'inclus' && $info['kit'] != 'sport'){
				?>
            <article>
            <h2>Accessoires inlcus: </h2>
                <?
				while ($info = mysql_fetch_assoc($req)){
					
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="70" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
				}
				?>
            </article>
                <?php
			}
			if($info['type'] != 'inclus' && $info['kit'] != 'sport'){
				?>
            <article>
            <h2>Accessoires disponible: </h2>
                <?php
				while ($info = mysql_fetch_assoc($req)){
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="100" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
				}
				?>
            </article>
                <?php
			}
			?>
Modérateur
Je t'avoue que j'ai lu ton code en Z. Mais je crois que tu t'embrouilles le cerveau pour rien. Quelle est la différence entre :


SELECT 
	P.`produits`, 
	P.`nom`,
	I.`lien`,
	I.`photo`
FROM `produits` P
LEFT JOIN `photos_produits` I
	ON I.`id_produits` = P.`id`
LEFT JOIN `categories` C
	ON P.`id_categories` = C.`id`
WHERE P.`etat` = 'actif' 
	AND P.`type` = 'inclus' 
	AND P.`kit` != 'sport'
ORDER BY C.`fr`


et

SELECT 
	P.`produits`, 
	P.`nom`,
	I.`lien`,
	I.`photo`
FROM `produits` P
LEFT JOIN `photos_produits` I
	ON I.`id_produits` = P.`id`
LEFT JOIN `categories` C
	ON P.`id_categories` = C.`id`
WHERE P.`etat` = 'actif' 
	AND P.`type` != 'inclus' 
	AND P.`kit` != 'sport'
	AND P.`produits` NOT IN ('XCEL HD','XHD-HUNTACC')
ORDER BY C.`fr`


Il te restera à faire la bonne condition qui va bien Smiley cligne
Modifié par niuxe (17 May 2013 - 16:00)
Il y a bien une différence! Dans la première j'appel les élément qui sont en type "inclus" et dans la 2e ceux qui ne sont PAS en type "inclus"
Modérateur
comme je t'ai dit, j'ai lu en Z.

Dans ce cas, sélectionnes le plus large possible (dans le raisonable bien sûr) et en php tu fais les conditionnelles adéquates :

- AND P.`type` != 'inclus'
- AND P.`produits` NOT IN ('XCEL HD','XHD-HUNTACC') :


un truc comme :

SELECT 
	P.`produits`, 
	P.`nom`,
	I.`lien`,
	I.`photo,
	P.`type`
FROM `produits` P
LEFT JOIN `photos_produits` I
	ON I.`id_produits` = P.`id`
LEFT JOIN `categories` C
	ON P.`id_categories` = C.`id`
WHERE P.`etat` = 'actif' 
	AND P.`kit` != 'sport'
ORDER BY C.`fr`

code fait de tête. Je peux m'être trompé
J'ai ressayé, c'est ce que j'ai fais mais ça ne donne aucun résultat, rien.

<?php
$req = mysql_query( 
	"SELECT 
		P.`produits`, 
		P.`nom`,
		I.`lien`,
		I.`photo`
	FROM `produits` P
	LEFT JOIN `photos_produits` I
		ON I.`id_produits` = P.`id`
	LEFT JOIN `categories` C
		ON P.`id_categories` = C.`id`
	WHERE P.`etat` = 'actif'
		AND P.`kit` != 'sport'
	ORDER BY C.`fr`") or die("43 - ".mysql_error());
	?>
            <article>
            <h2>Accessoires inlcus: </h2>
                <?
			while ($info = mysql_fetch_assoc($req)){
				if($info['type'] == 'inclus'){
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="70" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
				}
			}
				?>
            </article>
            <article>
            <h2>Accessoires disponible: </h2>
                <?php
			while ($info = mysql_fetch_assoc($req)){
				if($info['type'] != 'inclus'){
				?>
				<div>
					<img src="/images/<?php echo $info['lien'].$info['photo']?>.png" width="100" alt="" />
					<p><?php echo $info['nom'].'<br>(#'.$info['produits'].')'?></p>
				</div>
				<?php
				}
			}
				?>
            </article>
Modérateur
1. Regarde bien ma requête (les champs que je sélectionne) et compare la requête que tu codes.
2. un petit "debug()" de $info devrait t'aider :

f<?php
    /*
     * 	class Debug
     *	@author xxxx
     *	@email xxxx@xxxx.xxxx
     *	@date 04/02/2013 - 03:44:26
     */
    class Debug {
        /*
         * __construct()
         * @param $var
         */
        
        public function __construct($var) {
            if(Config::DEBUG){
                $d = debug_backtrace();
                echo '
                <script type="text/javascript">
                    function showHide(obj){
                        var pre = obj.parentNode.parentNode.getElementsByTagName("pre")[0];
                        if(pre.style.display == "none"){
                            pre.style.display = "block";
                        }else{
                            pre.style.display = "none";
                        }
                    }
                </script>
                <div style="padding-top:32px;">
                    <p>
                        <a href="javascript:;" onclick="showHide(this)"><strong>'.$d[0]['file'].'</strong> l.'.$d[0]['line'].'</a>
                    </p>
                    <pre style="display:none">';
                foreach($d as $k => $v){
                    if($k > 0){
                        print_r($v);
                    }
                }
                echo '</pre>
                </div>';            
                echo '<pre>';
                print_r($var);
                echo '</pre>';
            }
        }
    }

Modifié par niuxe (17 May 2013 - 17:27)
Ah! ouais, il manquait un élément! Smiley langue

Bon j'ai ajouté et maintenant seule les éléments du premier bloc s'affiche, pas ceux du 2e...

Après je ne comprend pas trop comme ton debug fonction...
Modérateur
juliesunset a écrit :


Après je ne comprend pas trop comme ton debug fonction...


Arf, je t'ai copié/collé telle quelle de mon MVC. J'ai viré le if debug .... (mode dev ou prod ?)

en faisant cela, ça devrait fonctionner :

<?php
    /*
     * 	class Debug
     *	@author xxxx
     *	@email xxxx@xxxxx
     *	@date 04/02/2013 - 03:44:26
     */
    class Debug {
        /*
         * __construct()
         * @param $var
         */
        
        public function __construct($var) {
                $d = debug_backtrace();
                echo '
                <script type="text/javascript">
                    function showHide(obj){
                        var pre = obj.parentNode.parentNode.getElementsByTagName("pre")[0];
                        if(pre.style.display == "none"){
                            pre.style.display = "block";
                        }else{
                            pre.style.display = "none";
                        }
                    }
                </script>
                <div style="padding-top:32px;">
                    <p>
                        <a href="javascript:;" onclick="showHide(this)"><strong>'.$d[0]['file'].'</strong> l.'.$d[0]['line'].'</a>
                    </p>
                    <pre style="display:none">';
                foreach($d as $k => $v){
                    if($k > 0){
                        print_r($v);
                    }
                }
                echo '</pre>
                </div>';            
                echo '<pre>';
                print_r($var);
                echo '</pre>';
        }
    }


//autre fichier avec include ....
$tableau = range(1,5);
$d = new Debug($tableau);


Modifié par niuxe (17 May 2013 - 19:58)
Ok, donc j'ai fais copie/colle de ton code dans un fichier à part, ensuite dans ma page j'ai mis ça:
<?php
include('../includes/debug.php');

$tableau = range(1,5);
$d = new Debug($tableau);	
?>


Et voilà ce que j’obtiens:


/home/xcelcamc/public_html/FR/xcel-chasse2.php l.94

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

$d = new Debug($tableau);	


Juste pour dire que t'es pas obligé de stocker ton objet si t'en fais rien après. Smiley langue


new Debug($tableau);	


;)
Modifié par jb_gfx (17 May 2013 - 19:37)
Modérateur
jb_gfx a écrit :

$d = new Debug($tableau);	


Juste pour dire que t'es pas obligé de stocker ton objet si t'en fais rien après. Smiley langue


new Debug($tableau);	


;)


+1

@Julie : Ce que j'ai écris était un exemple. Tu n'as plus qu'à déboguer le résultat de ta requête. J'ai vu que tu travailles en procédurale. Il faudrait peut être que tu détaches la méthode pour en faire une fonction. Là, j'ai fait un simple copié/collé et virer le code qui n'est pas utile pour toi.