recherche des quatre derniers caractéres d'une chaine

Eléphant du PHP | 89 Messages

24 mars 2007, 13:43

Bonjour à tous
Au boulot nous possédons une base de données gerant un stock de marchandises. Quand nous interrogeons notre base à partir d'un numéro de colis nous saisissons souvent les quatre ou cinq derniers caractéres.
Mais en fait celle ci liste tous les colis qui contiennent ces caractéres.
Je souhaiterais savoir comment interroger la base afin qu'elle m'affiche seulement les references de colis dont les derniers caractéres correspondent aux caractéres saisis
actuellement elle me liste tous les colis
ex: recherche : 123A
réponse colis N° 28123AZZ...colis N° DDV55123ACC24...colis N° 655BB123A

Alors que je souhaiterais qu'elle affiche
recherche : 123A
réponse colis N° 655BB123A

Merci d'avance

Eléphant du PHP | 89 Messages

24 mars 2007, 14:12

Voici le fichier recherche.php pour que cela soit plus clair
(comme vous voyez mon niveau est celui d'un gros débutant...)

Code : Tout sélectionner

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Rechercher</title> </head> <body> <br> <?php $connect=mysql_connect("localhost", "root", "") or die ("Echec de la connexion au serveur !"); $select=mysql_select_db("Gestion"); $query="select * from t_col"; $result=mysql_query($query); $totenreg=mysql_num_rows($result); if ($totenreg==0) echo "<td colspan=9 align=center bgcolor='#000000'><h2>PAS DE COLIS A RECHERCHER</td>"; else if (!(empty($_POST["recherche"]))) { echo "<table width=100% border=1 align=center>"; echo "<tr bgcolor='#000000'>"; echo "<td colspan=9><h2>RECHERCHER COLIS</td>"; echo "</tr>"; echo "<tr align=center bgcolor=#87CEEB>"; echo "<td><h4 class='h41'>Colis</td>"; echo "<td><h4 class='h41'>Nom</td>"; echo "<td><h4 class='h41'>Adresse</td>"; echo "<td><h4 class='h41'>CP</td>"; echo "<td><h4 class='h41'>Localité</td>"; echo "<td><h4 class='h41'>Envoi</td>"; echo "</tr>"; $i=0; while ($row=mysql_fetch_array($result)) { if (stristr($row[$_POST["choix"]], $_POST["recherche"])) { if ($i==0) { echo "<tr bgcolor=#D3D3D3>"; $i++; } else { echo "<tr bgcolor=#FFFFFF>"; $i--; } echo "<td><h5>".$row["NUMCOL"]."</td>"; echo "<td><h5>".$row["NOM"]."</td>"; echo "<td><h5>".$row["ADR"]."</td>"; echo "<td><h5>".$row["CP"]."</td>"; echo "<td><h5>".$row["LOC"]."</td>"; echo "<td><h5>".$row["ENV"]."</td>"; echo "</tr>"; } } echo "</table>"; } else echo "<td colspan=9 align=center bgcolor='#000000'><h2>PAS DE COLIS A RECHERCHER"; ?> </body> </html>
[/php]

ViPHP
ViPHP | 1380 Messages

24 mars 2007, 14:24

C'est au niveau de ta requête sql que tu dois travailler:

Code : Tout sélectionner

SELECT ... FROM ... WHERE code LIKE '%123A'
ou, certainement plus rapide si ta colonne est de largeur fixe:

Code : Tout sélectionner

SELECT ... FROM ... WHERE SUBSTRING(code, 7, 4) = '123A'
ripat

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

24 mars 2007, 14:27

Plutôt que de faire une requête qui va chercher dans ta base tous les enregistrements et de filtrer ensuite en php ceux qui correspondent à ta recherche, pourquoi ne pas filtrer directement dans la requête et ne ramener que ceux qui te conviennent ?

La commande LIKE en sql te permet d'utiliser le caractère "%" comme jocker des parties de la chaine que tu ne connais pas. Ainsi si ta requête est ainsi :
$sql = "SELECT ... 
  FROM t_col
  WHERE ". $_POST["choix"] ." LIKE '%".$_POST["recherche"]."'"
Elle ne te renverra que les enregistrement pour lesquels la colonne $_POST["choix"] se termine par la chaine $_POST["recherche"].

Si tu veux une recherche commençant par ta chaine, il suffit de mette le joker à la fin ('$_POST["recherche"]%') et si tu veux que ta chaine soit contenue il suffit d'en place un au début et un à la fin ('%$_POST["recherche"]%')
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 mars 2007, 15:05

Solution Like '% ....'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
<head> 
  <title>Rechercher</title> 
</head> 
<body> 
<br> 
<?php 

if ( !$_POST[choix] || !$_POST[recherche]) {
    echo "<td colspan=9 align=center bgcolor='#000000'><h2>SAISIR LES CRITERES DE RECHERCHE</td>"; 
exit;
}


$connect=mysql_connect("localhost", "root", "") or die ("Echec de la connexion au serveur !"); 

$select=mysql_select_db("Gestion"); $query="select * from t_col where $_POST[choix] LIKE '%$_POST[recherche]'";
 
$result=mysql_query($query); 

if ( $result && mysql_num_rows($result) ==0)
    echo "<td colspan=9 align=center bgcolor='#000000'><h2>PAS DE COLIS A RECHERCHER</td>"; 

else if ($result) { 

echo "<table width=100% border=1 align=center>"; 
echo "<tr bgcolor='#000000'>"; 
echo "<td colspan=9><h2>RECHERCHER COLIS</td>"; 
echo "</tr>"; 
echo "<tr align=center bgcolor=#87CEEB>"; 
echo "<td><h4 class='h41'>Colis</td>"; 
echo "<td><h4 class='h41'>Nom</td>"; 
echo "<td><h4 class='h41'>Adresse</td>"; 
echo "<td><h4 class='h41'>CP</td>"; 
echo "<td><h4 class='h41'>Localité</td>"; 
echo "<td><h4 class='h41'>Envoi</td>"; 
echo "</tr>"; 
$i=0; 

while ($row=mysql_fetch_array($result)) { 

 if ($i==0) { echo "<tr bgcolor=#D3D3D3>"; $i++; } 
 else { echo "<tr bgcolor=#FFFFFF>"; $i--; } 

 echo "<td><h5>".$row["NUMCOL"]."</td>"; 
 echo "<td><h5>".$row["NOM"]."</td>"; 
 echo "<td><h5>".$row["ADR"]."</td>"; 
 echo "<td><h5>".$row["CP"]."</td>"; 
 echo "<td><h5>".$row["LOC"]."</td>"; 
 echo "<td><h5>".$row["ENV"]."</td>"; 
 echo "</tr>"; 
} 
 echo "</table>"; 
} 

 ?> 
</body> 
</html>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 89 Messages

24 mars 2007, 15:29

MERCI BEAUCOUP Ô GRANDS MAITRES ...ça marche[/b]

Eléphant du PHP | 170 Messages

25 mars 2007, 10:28

Like c'est très lent !
Je pense que ceci est plus rapide que substring :
<?php
$req="SELECT les_champs_voulus FROM latable WHERE RIGHT(`code`, 4) ='123A'";
?>
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

27 mars 2007, 12:24

Mais l'avantage de Like est qu'on ne se limite pas aux 4 derniers mais aux N derniers (où N peut être toute la longueur de la chaine de recherche et ainsi permettre à la fois la recherche partielle que complète). La solution est extensible (réutilisable) alors sans mise à jour du code SQL.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 170 Messages

27 mars 2007, 12:41

Mais l'avantage de Like est qu'on ne se limite pas aux 4 derniers mais aux N derniers (où N peut être toute la longueur de la chaine de recherche et ainsi permettre à la fois la recherche partielle que complète). La solution est extensible (réutilisable) alors sans mise à jour du code SQL.
LIKE est lent, très lent.
Sur une petite base, pas de problème, sur une base de plusieurs centaines de milliers de données, ça va plus le faire du tout.
Et pour peu que tu fasses de la recherche sur plusieurs critères tes performances vont s'écrouler.

Si je devais tenir compte de ton argument des N caractères, je te dirais que dans un système de recherche de ce type, je contruirais mes requêtes à la volée sans ton LIKE.
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

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

27 mars 2007, 14:25

On peut aussi dire que RIGHT() n'est pas compatible oracle, tandis que LIKE() est universelle... :)

Tu ne sais pas par ailleurs sur combien de caractères portera la recherche (certes on peut les compter) ni si la recherche se fera toujours sur les derniers caractères. Il suffit alors d'ajouter un joker plutôt que de trouver une alternative à right() ;)

Et ceci dit, cette fonction n'est réellement "très très lente" que si l'on place un joker tout au début de la chaine et s'il y a vraiment quantité d'enregistrements... :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...