Page 1 sur 1
recherche des quatre derniers caractéres d'une chaine
Posté : 24 mars 2007, 13:43
par martial
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
Posté : 24 mars 2007, 14:12
par martial
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]
Posté : 24 mars 2007, 14:24
par Ripat
C'est au niveau de ta requête sql que tu dois travailler:
ou, certainement plus rapide si ta colonne est de largeur fixe:
Posté : 24 mars 2007, 14:27
par Ryle
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"]%')
Posté : 24 mars 2007, 15:05
par sadeq
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>
[RESOLU] recherche des quatre derniers..
Posté : 24 mars 2007, 15:29
par martial
MERCI BEAUCOUP Ô GRANDS MAITRES ...ça marche[/b]
Posté : 25 mars 2007, 10:28
par Expreg
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'";
?>
Posté : 27 mars 2007, 12:24
par sadeq
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.
Posté : 27 mars 2007, 12:41
par Expreg
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.
Posté : 27 mars 2007, 14:25
par Ryle
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...
