Une recherche pour deux résultats possibles avec et sans espace en PHP Mysql

Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009 - 1 avril 2009 à 21:58
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 4 mai 2009 à 17:35
Bonjour tout le monde.
Je vais essayer de faire court et être claire.

Je gère le site d'une personne dont les normes de son métier ont changer en mars.
Des immatriculations sous la forme de "1234XY00" et les normes actuelles sont "1234 XY 00"!.
Il y a donc des espaces en plus à gérer.

On va utiliser la fonction       value= '.htmlentities($immat).'    pas de problème.
Mais il y a un historique dans la base MYSQL en "1234XY00" et en plus depuis mars les nouvelles saisies en "1234 XY 00".
Les internautes saisieront une immat soit avec ou sans espace et le système devra afficher comme résulat l'historique sans espace et l'actuelle avec espace sans manipulation humaine supplémentaire.

Voilà mon problème.

Voici le code de mon moteur de recherche dans ma base mysql.
Ce dernier fonctionne parfaitement avec une immat sans espace et logiquement (non testé) avec espace.
Mais l'une ou l'autre en fonction de ma saisie dans ma zone de recherche.
Mais il ne m'affiche pas les deux en même temps.
Je saisie ça "1234XY00" il doit me sortie "1234XY00" et "1234 XY 00"
Et l'idéale même chose si je saisie l'immat avec espace il doit me sortir les deux résulats possible.

Code :
------------------------------------------
//on se connecte à la base de donnée
$db = mysql_connect($host,$login,$pass) or die ("erreur de connexion");


//selection de vôtre base de donnée
mysql_select_db($base,$db) or die ("erreur de connexion base");


//requète de recherche
// afin de suivre la recherche sur le nom durant toute la navigation.
$nom = $_POST['info2'];
$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".$_POST['info3']."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");


//on compte les resultats
$resultat= mysql_numrows($req);


if(empty($resultat)){


echo'
Désolé mais aucun resultat ne correspond à votre demande

';
}
 else{


  //on affiche le nombre de resultats
echo'<table/>';
//on ressort les infos par ordres alphabétiques
while( $result = mysql_fetch_array($req))
{
----------------------------

Merci pour votre aide.
Cordialement

25 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
2 avril 2009 à 08:22
Arf, j'ai loupé les deux derniers messages ... chui un peu lent ce matin.

As tu au moins accès à la DB mysql en modification ?

Si c'est le cas commence par passer toutes tes valeurs sous la forme '1234 XY 00'
Et :

function avecespace($str) {
    return preg_replace('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 \\3 \\5', $str);
}

[...]
$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE
'%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND
Immat LIKE '%".avecespace($_POST['info3'])."%' AND DtValid LIKE
'%".$_POST['info4']."%' Order by DtValid Desc ");
[...]

Cordialement,

Kohntark -
1
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
1 avril 2009 à 22:43
salut

je pense que tu devrais commencer par creer deux fonctions de convertions :

function avecespace($str){
return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 \\3 \\5', $str);
}

function sansespace($str){
return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1\\3\\5', $str);
}

ensuite, t'as juste a utiliser ces deux fonctions avant de construire ta requete SQL

tu remplaces : Immat LIKE '%".$_POST['info3']."%'

par (Immat LIKE '%".avecespace($_POST['info3'])."%' OR Immat LIKE '%".sansespace($_POST['info3'])."%')
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
1 avril 2009 à 22:55
dans la même idée que coucou747 tu devrais continué a stocké sous l'ancienne forme

avant ta recherche tu supprime les espaces une fois récupérer le résultat tu le "clone en nouvelle norme ca donne pour la requette :
Immat LIKE '%".sansespace($_POST['info3'])."%'

pour le résultat :
$numero_nouvformat = avecespace($numero_vieuxformat);

faudras juste pensé a bien utilisé sansespace() a chaque fois que tu doit select, insert,update etc...
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
2 avril 2009 à 07:38
Bonjour

Merci pour vos réponses.
Il est vrais que le plus simple serait de saisir toujours comme avant et retirer les espaces.
Mais voilà, les données viennes de 4 bases Access vers une Mysql et le logiciel qui gère ces bases saisie désormait avec espaces.


Du coup je me retrouve avec un historique sans espace et les noivelles saisies avec espaces.
Il faut que j'arrive à comprendre l'idée de coucou747 pour l'intégrer à mon script.
J'utilise ces fonctions telle quelle ?


J'aime bien comprendre ce que je fais.
Je ne comprend pas ce qui est entre les deux () de str_replace.

return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 \\3 \\5', $str);

Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 avril 2009 à 07:50
c'est une regexp, tu peux commencer par aller lire la doc de str_replace et aller lire comment on fait un regexp.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
2 avril 2009 à 08:10
Salut,

Dans la continuité des 2 précédents commentaires :
Je remplacerai la fonction sansespace() par :
str_replace(' ','', $str); // inutile à mon sens de passer par une fonction et une regex pour supprimer des espaces

Et puis ça :
return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 \\3 \\5', $str);

=>
return preg_replace('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 \\3 \\5', $str);
Car str_replace n'accepte pas les regex
Et avec cette regex tu prends également les immatriculations du genre :
80XV60
1258 TDH75
...

Cordialement,

Kohntark -
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 avril 2009 à 08:18
hum... exact, c'est une erreur de ma part.
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
2 avril 2009 à 21:25
Bonsoir,

J'ai bien pensé à revoir toutes les valeures de la base. Mais cette dernière est remise à jour très régulièrement via des bases Access qui sont gérées par des logiciels propriétaires.
A chaque fois que les bases access sont injectées dans la base Mysql, tout est replacé.
Pas le choix donc de faire une recherche et obtenir les deux résultats.

Je vais essayé vos méthodes et je vous tiens informé.
Merci à tout de suite ou demain.
Cordialement
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
2 avril 2009 à 21:43
Bonsoir,

Bon voilà je viens de faire un essai.

Voici le code modifié :

//on se connecte à la base de donnée
$db = mysql_connect($host,$login,$pass) or die ("erreur de connexion");


//selection de vôtre base de donnée
mysql_select_db($base,$db) or die ("erreur de connexion base");
//-----------------------------------------------
function avecespace($str){
  return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 [file://\\3 \\3][file://\\5' \\5'], $str);
}


function sansespace($str){
  //return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1\\3\\5', $str);
  str_replace(' ','', $str);
}
//------------------------------------------------


//requète de recherche
// afin de suivre la recherche sur le nom durant toute la navigation.
$nom = $_POST['info2'];
//$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".$_POST['info3']."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");
$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".avecespace($_POST['info3'])."%' OR Immat LIKE '%".sansespace($_POST['info3'])."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");

Ou ai-je fait une erreur car le résultat est le suivant :
Fatal error : Maximum execution time of 30 seconds exceeded in d:\www\ct\ctdetails.php on line 159
La ligne 159 étant la dernière $req =...........................

Merci pour votre participation.
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
3 avril 2009 à 08:13
Salut,

C'est normal que ça ne fonctionne pas, tu as omis de tenir compte de mes commentaires.
Coucou a fait une erreur dans la fonction qu'il te proposait, elle ne fonctionne pas.
Remplace ta fonction avecespace par celle de mon précèdent commentaire.
Par ailleurs tu devrait traiter les données POST qui ne passent pas par avecespace(), notamment cellesqui sont saisies par l'utilisateur (nom, prénom, ...)

Et puis :
function sansespace($str){
  str_replace(' ','', $str);
}
=>
function sansespace($str){
  return str_replace(' ','', $str);
}

Kohntark -
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
10 avril 2009 à 07:52
Bonjour,

j'ai pris un peut de temps mais voilà le résultat.
Plutôt positif.

voici le code final :

//selection de vôtre base de donnée
mysql_select_db($base,$db) or die ("erreur de connexion base");
//-----------------------------------------------
function avecespace($str){
  return str_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 [file://\\3 \\3][file://\\5' \\5'], $str);
}


function sansespace($str){
  str_replace(' ','', $str); // inutile à mon sens de passer par une fonction et une regex pour supprimer des espaces
return preg_replace('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 [file://\\3 \\3][file://\\5' \\5'], $str);


}


//------------------------------------------------


//requète de recherche
// afin de suivre la recherche sur le nom durant toute la navigation.
$nom = $_POST['info2'];
//$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".$_POST['info3']."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");
$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".avecespace($_POST['info3'])."%' OR Immat LIKE '%".sansespace($_POST['info3'])."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");


 


Donc ca fonctionne.
Sauf que par exemple j'entre une immatriculation 1234XP56 elle sort bien avec et sans espace mais aussi 9234ZG78
Point commun "234".  Je ne comprends pas.

Une idée ?
Merci
Yannick
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
10 avril 2009 à 16:59
Re,

Je ne veux pas être méchant, mais tout de même !!!
Lis tu les messages que je poste ? Permets moi d'en douter, tu n'en as tenu compte à aucun moment.
Je veux bien t'aider, mais je ne suis pas là pour ré écrire 20 fois le même message.


Faire un copié/collé est si difficile que ça ?


Enfin bref, j'arrête là sur ce post, tu comprendras que parler dans le vide n'est pas ma tasse de thé.

Si tu veux véritablement de l'aide tiens compte des remarques et je tenterai de t'aider à nouveau.

Bonne soirée à toi,

Kohntark -
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
10 avril 2009 à 17:30
use preg_replace
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
16 avril 2009 à 13:19
Bonjour,

Moi je demande de l'aide, comme tout le monde et non lire des choses déplaisantes.
Pas besoin d'écrire que je ne sais pas lire mais juste "Tu as oublié aussi de remplacer un str par preg" c'est mieux non ?


Bon, apparement le problème existe toujours.
Je vais vérifier de nouveau mon code testé et vous informer.


Cordialement
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
16 avril 2009 à 17:36
Salut Calypdoso,

Pas besoin d'écrire que je ne sais pas lire mais juste "Tu as oublié aussi de remplacer un str par preg" c'est mieux non ?
= > je n'ai vu nul part une personne qui a dit que tu ne savais pas lire. En ce qui me concerne j'ai juste dit que je doutais que tu ai lu mes commentaires, ce qui est fort différent.

Moi je demande de l'aide, comme tout le monde et non lire des choses déplaisantes.
=>
Moi, je passe pas mal de temps à tenter d'aider, comme quelques dizaines de personnes ici, et non pour poster dans le vide A PLUSIEURS REPRISES

Bon, apparement le problème existe toujours.
=> permet moi de ne pas être étonné (n'y vois là aussi aucune méchanceté)
Essaie de recopier à la lettre ce qui a été dit et fais nous part des éventuels dysfonctionnements ou réussite.
J'avais testé de mon côté avant de poster et les résultats étaient OK.

Bonne soirée,

Kohntark -
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
16 avril 2009 à 20:56
Bonsoir

Voici le résulat
Le code doit êrte bon puisque déjà validé sur ce forum sauf effectivement les "preg"
Mais il y a toujours ce problème d'immat qui s'affichent en résultat de la recherche.

//selection de vôtre base de donnée
mysql_select_db($base,$db) or die ("erreur de connexion base");
//-----------------------------------------------
function avecespace($str){
  return preg_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 [file://\\3 \\3][file://\\5' \\5'], $str);
}


function sansespace($str){
  preg_replace(' ','', $str);
return preg_replace('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 [file://\\3 \\3][file://\\5' \\5'], $str);


}


//------------------------------------------------


//requète de recherche
// afin de suivre la recherche sur le nom durant toute la navigation.
$nom = $_POST['info2'];
//$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".$_POST['info3']."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");
$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".avecespace($_POST['info3'])."%' OR Immat LIKE '%".sansespace($_POST['info3'])."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");

Je ne cherche pas à vous ennuyer.
J'aime bien comprendre ce que je fais, ceci pourrais m'aider et moins vous soliciter.
J'avoue pas bien comprendre Preg_replace. Certes on remplace des espaces mais je ne lis pas bien ce qui est entre ( )

Mais la priorité est l'immat qui s'affiche alors qu'elle ne devrait pas.
Merci à vous
Cordialement
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
16 avril 2009 à 23:33
Je n'ai pas pris la peine de regarder le code
quand j'ai vu que pour la énième édition tu n'avais pas tenu compte de
mes remarques :


function avecespace($str){

  return preg_replace('/^([0-9]{4})(\s?)(..)(\s?)(..)$/', '\\1 [../c.aspx?u= ZmlsZTovL1xcMw== \\3] }


=> je t'ai fourni le code de cette fonction, il n'y avait plus qu'a faire un
copié/collé là aussi ... tu n'as même pas besoin de changé de page, c'est écrit
noir sur blanc tout en haut de la page de ton dernier message.


Franchement, faut que tu m'explique là, il y a vraiment un truc qui m'échappe.

Le but n'étant pas de se prendre la tête je te laisse te débrouiller seul.
J'aurai voulu t'aider jusqu'à la résolution totale de ton problème, mais là je ne sais vraiment plus quoi faire.

Bonne continuation,

Kohntark -
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
16 avril 2009 à 23:39
à première vue mon message a été tronqué.
Je ne vais pas le refaire, mais en 2 mots :

Tu demandes de l'aide => on t'a fourni du code qu'il suffisait de recopier
pourquoi ne le fais tu pas ???

Je reste perplexe-

Kohntark -
0
Calypdoso Messages postés 18 Date d'inscription mardi 18 octobre 2005 Statut Membre Dernière intervention 3 juillet 2009
28 avril 2009 à 21:30
Bonjour Tout le monde et Kohntark,
Merci pour votre aide mais voilà.
J'ai essayé avec str_  ou preg_
Le problème est le même.
Au départ il y avait une erreur, mais j'ai résolut cette dernière.

Je sais bien que l'on m'a dis de relire vos commentaires et de copier.
Mais vous avez également indiqué dans vos commentaires qu'il avait quelques problèmes : "à première vue mon message a été tronqué."

Donc cherchons l'erreur.
Immatriculation recherché 100BY99 fonctionne mais pas 100 BY 99 rien s'affiche.

Voici mon code, au rique de me faire encore "grondé" mais il faut que l'avance :

//-----------------------------------------------
function avecespace($str) {
    return str_replace('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 [file://\\3 \\3][file://\\5' \\5'], $str);
}
//function sansespace($str){
  //str_replace(' ','', $str);
//}
//=>
function sansespace($str){
  return str_replace(' ','', $str);
}




//------------------------------------------------


//requète de recherche
// afin de suivre la recherche sur le nom durant toute la navigation.
$nom = $_POST['info2'];
//$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".$_POST['info3']."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");
$req = mysql_query("SELECT * FROM $table WHERE FA_Prenom LIKE '%".$_POST['info']."%' AND FA_Nom LIKE '%".$_POST['info2']."%' AND Immat LIKE '%".avecespace($_POST['info3'])."%' OR Immat LIKE '%".sansespace($_POST['info3'])."%' AND DtValid LIKE '%".$_POST['info4']."%' Order by DtValid Desc ");

//---------------------------------------------------

Désolé Kohntark si je vous ennuis encore, mais c'est important pour moi.
Tout le reste du site est ok pour moi sauf cette fonction que je n'arrive pas à règler.

Merci pour votre aide, a plusieurs on arrivera à trouver une solution.
Cordialement
Calypdoso
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
28 avril 2009 à 22:24
Re Calypdoso,

Je ne pensais plus avoir de tes nouvelles après tous ces jours passés sans réponse.
Mais vous avez également indiqué dans vos commentaires qu'il avait
quelques problèmes : "à première vue mon message a été tronqué."
= >
je voulais dire par là que j'avais écrit, dans mon message précédent, d'autres commentaires qui n'étaient pas passé. Ce n'était pas du code mais des remarques, le code en question t'ayant été proposé bien avant.

Allé, je ne peux m'empêcher de faire une remarque, juste pour la forme
a plusieurs on arrivera à trouver une solution
= >
la solution t'a été donnée et rappelée à de multiples occasions. J'avais pris le temps de tester avant de te répondre d'ailleurs.

Là par contre je ne l'ai pas pris. Il y a du mieux semble t il, mais ça :
function avecespace($str) {
    return str_replace
('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 \\3</gras> [../c.aspx?u =ZmlsZTovL1xcNQ= = \\5
'], $str);
}
=>
et différent du code que j'avais donné, non ?
function avecespace($str) {
    return preg_replace('/^([[:digit:]]{2,4})(\s?)([[:alpha:]]{2,4})(\s?)([[:digit:]]{2})$/', '\\1 \\3 \\5
', $str);
}

Je te sur sur surligne le truc, non pas pour te prendre pour un imbécile (c'est vraiment pas mon but), mais pour faire en sorte que tu avances, et que tu finisses ton site (quelle url ??)
Je t'encourage à relire tous les messages (Coucou, moi) dans l'ordre chronologique, TOUT a été dit et répété

Si tu rencontres encore des problèmes avec le VRAI ()code fourni n'hésites pas à nous en faire part.

Bonne soirée,

Kohntark -
0
Rejoignez-nous