recherche des quatre derniers caractéres d'une chaine

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : recherche des quatre derniers caractéres d'une chaine

par Ryle » 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... :)

par Expreg » 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.

par sadeq » 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.

par Expreg » 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'";
?>

[RESOLU] recherche des quatre derniers..

par martial » 24 mars 2007, 15:29

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

par sadeq » 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>

par Ryle » 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"]%')

par Ripat » 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'

par martial » 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]

recherche des quatre derniers caractéres d'une chaine

par martial » 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