Page 1 sur 1

Recherche EXACTE en PHP dans MYSQL

Posté : 23 août 2007, 16:38
par Luverger
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

Posté : 23 août 2007, 16:49
par Ryle
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.

Posté : 23 août 2007, 16:57
par Luverger
Ou devrais placer les LIKE ou = dans mon exemple ???

Posté : 23 août 2007, 17:02
par Ryle
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 %'

Posté : 23 août 2007, 17:08
par Luverger
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

????????

Posté : 23 août 2007, 17:15
par Vikchill

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 '%'"?

Posté : 23 août 2007, 17:18
par Luverger
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 ...

Posté : 23 août 2007, 17:23
par Ryle
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)

Posté : 23 août 2007, 17:25
par Vikchill
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.