8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un problème de sélection SQL à l'aide d'un LIKE dans une de mes pages.

En gros, j'ai une page de sélection de produits. Lorsque je clique sur un produit, je tombe sur la page descriptive du produit.

Le contenu de cette page est généré dynamiquement via une bdd. Je récupère les données du produit grâce à un $_GET en début de page. J'appel différentes table à différent endroit à travers la page et je fait un (LIKE '%$produits%') dans mes requête SQL.

Le problème c'est que j'ai quelques produits dont les noms se ressemble. Exemple, LIVE et LIVE-3G sont 2 produits différent, mais lorsque je suis sur la page de LIVE, les données de la LIVE-3G s'affiche également.

voici une lien vers la page
et le code complet:
<?php
$produits = $_GET['produits'];

$preprocess['title'] = "Caméra SPYPOINT ".$produits."";
$preprocess['meta']['description'] = "".$produits." Digital trail cameras SPYPOINT";

$preprocess['css'][] = "/CSS/MAIN-2013.css";
$preprocess['css'][] = "/CSS/slimbox2.css";
$preprocess['css'][] = "/CSS/2013.css";

$preprocess['topextra'][] = '<!--[if IE 7]>
							   <link href="../CSS/complements_iE7.css" rel="stylesheet" type="text/css" />
							<![endif]-->';
							
require_once($_SERVER['DOCUMENT_ROOT'] . "/includes/topFr.inc.php");
?>

<!--HEADER-->

<div class="left">
	<h2><img src="../../../Images/photosProduits/<?php echo $produits.'/'.$produits; ?>_logo.png" width="170" alt="<?php echo $produits; ?>" /></h2>
    <div class="icon">
    <?php
	$r = "SELECT * FROM icon WHERE cameras LIKE '%$produits%' AND categorie NOT IN ('couleurs') ORDER BY categorie NOT IN ('résolution')";
	$req = mysql_query($r);
	while ($info = mysql_fetch_assoc($req)){
		?>
        <img src="../../../../Images/photosProduits/icon/<?php echo $info['iconFR']?>" width="122" alt="<?php echo stripslashes($info['descFR']); ?>" />
        <?php
	}
	?>
    </div>
</div>
<div class="texte">
    <?php
	$r = "SELECT * FROM produits_text WHERE produits LIKE '%$produits%' ORDER BY id";
	$req = mysql_query($r);	  
	while($info = mysql_fetch_assoc($req)){
		if($info['niveau'] == 1){
			if($info['type'] == 'titre'){
				echo '<h3>'.$info['texte'].'</h3>';
			}
			elseif($info['type'] == 'texte'){
				echo '<p>'.$info['texte'].'</p>';
			}
		}
		elseif($info['niveau'] == 2){
			if($info['type'] == 'titre'){
				echo '<h4>'.$info['texte'].'</h4>';
			}
			elseif($info['type'] == 'texte'){
				echo '<p>'.$info['texte'].'</p>';
			}
		}
		?>
        <?php
	}
	?>
</div>
<?php
$r = "SELECT produits,photo FROM produits WHERE produits='$produits'";
$req = mysql_query($r);	  
if ($info = mysql_fetch_assoc($req)){
	?>
<a href="/Images/photosProduits/<?php echo $produits.'/'.$produits;?>_large.jpg"  rel="lightbox-camera" title="Cam&eacute;ra Spypoint <?php echo $produits;?>" class="camera" >
	<img src="/Images/photosProduits/<?php echo $info['photo'];?>" alt="cam&eacute;ra: image 1 de 4" width="295" border="0">
</a>
	<?php
}
?>
<!--TABLEAU-->
<div class="spec right">
	<table class="caracteristiques">
		<caption class="gradient-gray"><h4>Caractéristiques</h4></caption>
		<tbody>       
		<?php
		$r = "SELECT spec,fr FROM produits_spec WHERE produits LIKE '%$produits%' ORDER BY ordre";
		$req = mysql_query($r);
		while ($info = mysql_fetch_assoc($req)){
			?>
            <tr>
            	<th><?php echo $info['spec'];?></th>
                <td><?php echo $info['fr'];?></td>
			</tr>
            <?php
		}
		?>
        </tbody>
	</table>
    
    <div class="complements">
        <h4 class="gradient-gray">Accessoires disponibles</h4>
        <?php
        $recherche = "SELECT * FROM produits_details WHERE camera LIKE '%$produits%' ORDER BY categorie,produit";
        $requete = mysql_query($recherche);
        while ($info = mysql_fetch_assoc($requete)){
            ?>
        <div class="lien">
            <img src="../../../../Images/photosProduits/<?php echo $info['photo']?>" alt="<?php echo stripslashes($info['produit']); ?>" />
            <div class="descr">
                <img src="../../../../Images/photosProduits/<?php echo $info['photo']?>" alt="" />
                <h5><?php echo stripslashes($info['produit']); ?></h5>
                <p><?php echo stripslashes($info['descrFR']); ?></p>
            </div>
        </div>
            <?php
        }
        ?>
        <div class="spacer"></div>
    </div>
</div>

<div class="left2">
    <div>
        <?php
        $r = "SELECT image,fr FROM produits_images WHERE produits LIKE '%$produits%' ORDER BY image DESC";
        $req = mysql_query($r);	  
        while ($info = mysql_fetch_assoc($req)){
            ?>
        <a href="/Images/photosProduits/complementaire/<?php echo $info['image']?>_large.jpg" rel="lightbox-camera" title="<?php echo $info['fr']?>" >
            <img src="/Images/photosProduits/complementaire/<?php echo $info['image']?>_mini.png" alt="" border="0">
        </a>
            <?php
        }
        ?>
    </div>
    <!--<div class="dispo">-->
    <div>
        <?php
        $r = "SELECT * FROM icon WHERE cameras LIKE '%$produits%' AND categorie='couleurs'";
        $req = mysql_query($r);	  
        while ($info = mysql_fetch_assoc($req)){
            ?>
            <img src="../../../../Images/photosProduits/icon/<?php echo $info['iconFR']?>" alt="Disponible en <?php echo stripslashes($info['descFR']); ?>" />
            <?php
        }
        ?>
    </div>
    <?php
	if($produits == 'LIVE' OR $produits == 'LIVE-3G'){
	?>
	<div class="activation">
   		<a href="LIVE-info.html"><h5><img src="../../../../Images/photosProduits/icon/Gestion.png" width="190" height="47" alt="Gestion en ligne" /></h5>
        <p>&raquo; En savoir plus</p></a>
	</div>
	<div class="activation">
   		<h5><a href="http://www.myspypoint.com/" target="_blank" class="acces">Acc&eacute;der &agrave;<br>
	    <img src="../../../../interface/images/mySpypoint.png" width="180" height="31" alt="mySpypoint.com"></a></h5>
        <span class="clear"></span>
	</div>
	<div class="activation">
		<h5>Proc&eacute;dures d'activation</h5>
		<ul>
          <li><a href="/Images/photosProduits/LIVE-3G/PDF/activation/Procedure_FIDO_FR.pdf" target="_blank">Fido</a></li>
          <li><a href="/Images/photosProduits/LIVE-3G/PDF/activation/Procedure_TELUS_FR.pdf" target="_blank">Telus</a></li>
      </ul>
    </div>
    <?php
	}
	?>
    
    <h5><a class="bouton manuel" href="../../../../Images/photosProduits/<?php echo $produits.'/Manual_'.$produits;?>.pdf" target="_blank">Manuel d'utilisation</a></h5>
    
    <div class="video">
        <?php		  
        //while ($info = mysql_fetch_assoc($requete)){
        $r = "SELECT * FROM video WHERE produits='$produits'";
        $req = mysql_query($r);	  
        while ($info = mysql_fetch_assoc($req)){
			if ($info['etatFR']=='actif'){
				if (!empty($info['titre'])){
					echo '<h5>'.$info['titre'].'</h5>';
				}
            ?>
        <iframe width="230" height="129" src="<?php echo $info['video']; ?>" frameborder="0" allowfullscreen></iframe>
				<?php
                if ($info['langue']=='en'){
                    echo '<p class="lang">Vidéo en anglais</p>';
                }
				if(!empty($info['hd'])){
					echo '<p class="hd"><a href="'.$info['hd'].'" onclick="HD(this.href);return(false);">» Visionner en HD</a></p>';
				}
			}
			else if ($info['etatFR']=='old'){
				?>
				<p><a href="<?php echo $info['../video']; ?>" target="_blank">» <?php echo $info['titre']?></a>
				<?php
                if ($info['langue']=='en'){
                    echo '<br>(Vidéo en anglais)';
                }
				echo '</p>';
			}
        }
        ?>
    </div>
</div>

<?php require_once($_SERVER['DOCUMENT_ROOT'] . "/includes/bottomFr.inc.php"); ?>

Modifié par juliesunset (25 Feb 2013 - 14:46)
Salut,

Et si tu limite ta requete a un seul résultat ?

tu rajoute

LIMIT 1,1


a la fin de ta requete .
Modifié par JuseN (20 Feb 2013 - 14:12)
Bonjour, merci pour la réponse.

Ça fonctionne pour le texte, si je mets LIMIT 0,4. Il m'affiche donc les 4 premiers éléments de texte se rapportant au produit.

Pour le reste par contre, ça ne convient pas puisque j'ignore le nombre de champ qui se rapport au produit sélectionné et que ce nombre n'est pas le même d'un produit à l'autre (icône dans la colonne en haut à gauche et surtout le tableau des caractéristiques après le texte).
Salut,

si ta page ne doit retourner qu'un seul produit, pourquoi utiliser LIKE ?
Mets directement "=".
Parce que que certaines caractéristique sont assigné à plusieurs produits dans ma bdd.

Exemple, la résolution de photos, une résolution de 5mp peu être assigné à IR-5 et LIVE. Donc dans ma bdd j'ai un table contenant une colonne avec le nom du l’icône et une colonne contenant le nom des produits assigné séparé par une virgule (comme suit: LIVE,IR-5).
Ok du coup, ce n'est plus un problème de SQL, mais d'architecture de ta base de données.

Il y a quand même une solution à ton problème, sans devoir refaire la DB:

- la colonne qui contient les noms des "produits assigné séparé par une virgule" doit avoir tous ses produits qui se terminent par une virgule (ie 'LIVE,IR-5' non toléré mais 'LIVE,IR-5,' OK)

- dans tes recherches LIKE, tu rajoutes à la fin de $produit une virgule, et c'est gagné.
Ainsi, au lieu d'écrire
"SELECT * FROM MATABLE WHERE produits LIKE '%".$produit."%' ORDER BY id" , il faudra écrire
"SELECT * FROM MATABLE WHERE produits LIKE '%".$produit.",%' ORDER BY id";