Recherche EXACTE en PHP dans MYSQL

Eléphanteau du PHP | 24 Messages

23 août 2007, 16:38

Bonjour,

J'ai ce bout de code:

Code :

Code : Tout sélectionner

<?php require_once('../Connections/ConnexionBiblio.php'); ?> <?php require_once('../Connections/ConnexionBiblio.php'); $colMarque_rsChemise = "0"; if (isset($_GET['VARmarque'])) { $colMarque_rsChemise = (get_magic_quotes_gpc()) ? $_GET['VARmarque'] : addslashes($_GET['VARmarque']); } $colProduit_rsChemise = "0"; if (isset($_GET['VARproduit'])) { $colProduit_rsChemise = (get_magic_quotes_gpc()) ? $_GET['VARproduit'] : addslashes($_GET['VARproduit']); } mysql_select_db($database_ConnexionBiblio, $ConnexionBiblio); $query_rsChemise = sprintf("SELECT tableproduit.ProduitNumChemise, tableproduit.ProduitNumCD, tableproduit.ProduitMarque, tableproduit.ProduitType, tablesociete.SocieteNom, tablesociete.RefSociete, tableproduit.RefProduit FROM tableproduit, tablesociete WHERE tablesociete.SocieteNom LIKE '%' AND tableproduit.ProduitMarque=tablesociete.RefSociete AND tableproduit.ProduitType LIKE '%' ORDER BY tableproduit.ProduitType, tablesociete.SocieteNom", $colMarque_rsChemise,$colProduit_rsChemise); $rsChemise = mysql_query($query_rsChemise, $ConnexionBiblio) or die(mysql_error()); $row_rsChemise = mysql_fetch_assoc($rsChemise); $totalRows_rsChemise = mysql_num_rows($rsChemise); ?>
Et j'aimerais dans un premier temps savoir comment faire pour le modifier afin que j'ai j'écris le mot VIS dans mon moteur de recherche et me retourne les résultats comprenant uniquement le mot VIS et non asserVISsement ou laser de VISée ...

Et j'aimerais dans un deuxième temps pouvoir ajouter le caractère % ou un autre pour pouvoir étendre la recherche ...

D'avance merci
Modifié en dernier par Luverger le 23 août 2007, 17:05, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 août 2007, 16:49

Pour une recherche exacte, il suffit d'utiliser le '=' à la place de 'LIKE'. Au pire tu peux utiliser le LIKE sans les '%', mais c'est nettement moins performant.

Pour étendre la recherche, il suffit d'utiliser 'LIKE' et d'ajouter des '%' comme joker pour représentée la ou les parties inconnues de la chaine recherchée.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 24 Messages

23 août 2007, 16:57

Ou devrais placer les LIKE ou = dans mon exemple ???

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 août 2007, 17:02

Ben dans critères de recherche de la requête ... dans le WHERE en somme...

Code : Tout sélectionner

SELECT ... WHERE nom_du_champ = 'texte recherché' SELECT ... WHERE nom_du_champ LIKE 'texte recherché dont on ne connait pas la fin %'
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 24 Messages

23 août 2007, 17:08

Donc je devrais écrire dans ce genre là ???

Code : Tout sélectionner

$query_rsChemise = sprintf("SELECT tableproduit.ProduitNumChemise, tableproduit.ProduitNumCD, tableproduit.ProduitMarque, tableproduit.ProduitType, tablesociete.SocieteNom, tablesociete.RefSociete, tableproduit.RefProduit FROM tableproduit, tablesociete WHERE tablesociete.SocieteNom LIKE '%' AND tableproduit.ProduitMarque=tablesociete.RefSociete AND tableproduit.ProduitType LIKE '%' ORDER BY tableproduit.ProduitType, tablesociete.SocieteNom", $colMarque_rsChemise,$colProduit_rsChemise); $rsChemise = mysql_query($query_rsChemise, $ConnexionBiblio) or die(mysql_error()); $row_rsChemise = mysql_fetch_assoc($rsChemise); $totalRows_rsChemise = mysql_num_rows($rsChemise);
Mais si je marque ça comme ça il me retourne :

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RDER BY tableproduit.ProduitType, tablesociete.SocieteNom' at line 1

????????

Eléphant du PHP | 193 Messages

23 août 2007, 17:15

Code : Tout sélectionner

SELECT tableproduit.ProduitNumChemise, tableproduit.ProduitNumCD, tableproduit.ProduitMarque, tableproduit.ProduitType, tablesociete.SocieteNom, tablesociete.RefSociete, tableproduit.RefProduit FROM tableproduit, tablesociete WHERE tableproduit.ProduitMarque=tablesociete.RefSociete AND tablesociete.SocieteNom LIKE '%' AND tableproduit.ProduitType LIKE '%' ORDER BY tableproduit.ProduitType, tablesociete.SocieteNom"
Tu attends quoi de cette requête? Qu'est-ce qu'elle doit te donner d'après toi?

A quoi servent tes deux "LIKE '%'"?

Eléphanteau du PHP | 24 Messages

23 août 2007, 17:18

Je ne sais pas trop il y a une partie un peu flou ...

Au début j'avais mis des LIKE '%%%s%%' mais il parait qu'il faut des LIKE '%'

Alors j'ai essayé mais ca ne marche pas mieux ...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 août 2007, 17:23

Chaque pourcentage en SQL correspond à une partie de la chaine que tu ne connais pas.. il est donc inutile d'avoir deux '%' côte à côte. En revanche, la fonction sprintf() que tu utilises pour générer ta chaine sql a un usage bien particulier du caractère '%' : %s correspon à une chaine, %d à un nombre, etc.

Afin que php ne confonde pas le caractère pourcent spécifique à sprintf et celui que tu souhaites utiliser dans ta requête, il faut le doubler. Ainsi "% ma chaine %" devient "%% ma chaine %%", la chaine étant ensuite spécifiée dans les variables du sprintf, on remplace celle-ci par '%s', ce qui au final te donne donc "%% %s %%" (sans les espaces)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 193 Messages

23 août 2007, 17:25

Essaie ça:
require_once('../Connections/ConnexionBiblio.php');

$colMarque_rsChemise = '';
if (isset($_GET['VARmarque'])) {
  $colMarque_rsChemise = (get_magic_quotes_gpc()) ? $_GET['VARmarque'] : addslashes($_GET['VARmarque']);
}
$colProduit_rsChemise = '';
if (isset($_GET['VARproduit'])) {
  $colProduit_rsChemise = (get_magic_quotes_gpc()) ? $_GET['VARproduit'] : addslashes($_GET['VARproduit']);
}
mysql_select_db($database_ConnexionBiblio, $ConnexionBiblio);

$query_rsChemise = "SELECT tableproduit.ProduitNumChemise, tableproduit.ProduitNumCD, tableproduit.ProduitMarque, tableproduit.ProduitType, 
tablesociete.SocieteNom, tablesociete.RefSociete, tableproduit.RefProduit 
FROM tableproduit, tablesociete 
WHERE tableproduit.ProduitMarque=tablesociete.RefSociete 
AND tableproduit.ProduitType = '".$colMarque_rsChemise."' 
AND tablesociete.SocieteNom = '".$colProduit_rsChemise."' 
ORDER BY tableproduit.ProduitType, tablesociete.SocieteNom";

$rsChemise = mysql_query($query_rsChemise, $ConnexionBiblio) or die(mysql_error());

$row_rsChemise = mysql_fetch_assoc($rsChemise);

$totalRows_rsChemise = mysql_num_rows($rsChemise);
?>
Peut-être comprendras-tu mieux le petit bout de code. Un petit opérateur ternaire ferait pas de mal mais allons y doucement.