Supprimer les points et traits d'union dans un request

cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017 - 11 nov. 2009 à 10:27
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 13 nov. 2009 à 06:54
Bonjour à tous,

Voilà, dans un champ texte, j'entre "3180270" (qui sera le $_GET[champ_police]) et je demande dans mon request une recherche dans la base où l'entrée correspond à "3.180.270". En fait, j'aimerais que les points et autres symboles soient supprimés au moment de la recherche.

Voici mon code "request" :

mysql_select_db($database_connexion, $connexion);
$query_result = "SELECT * FROM CONTRATS WHERE ereg_replace("'.'","",NUM_POLICE LIKE) '%$_GET[champ_police]%' ORDER BY NUM_POLICE, ID_COMP ASC";
$result = mysql_query($query_result, $connexion) or die(mysql_error());
$row_result = mysql_fetch_assoc($result);

C'est le code en rouge que j'ai ajouté au bol car je ne sais pas du tout comment faire.

Merci de votre aide.

Salutations à tous



David

13 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
11 nov. 2009 à 11:15
Salut,

Oula, ça ne va pas bien marcher ça.
J'ai du mal à comprendre ...
Tu souhaites entrer '3180270' et récupérer les résultats qui correspondent à '3.180.270' dans la DB, c'est bien ça ?
Il faudrait préciser un peu :
quels caractères peuvent être présent ? Le point, ... ??
quels emplacements peuvent ils prendre ? Ils marquent les milliers ? ils peuvent se situer ailleurs ?
Ne vaut il pas mieux stocker '3180270' dans la DB et éventuellement le mettre en forme au moment de l'affichage ?


Cordialement,


Kohntark -
0
cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017
11 nov. 2009 à 11:23
Merci de ta réponse.

Non, je ne peux pas mettre le numéro de contrat sans points ni traits d'union car lorsque j'adresse un courrier à mon client, il doit pouvoir voir le numéro dans le bon format c'est à dire 3.111.111 ou G-123-456.

En fait, ce que je souhaiterais c'est faire l'inverse que lorsqu'on enregistre une nouvelle donnée dans un bdd. Par exemple, quand j'écris 3.111.111 dans le champ text, l'enregistrement à la bdd avec str_replace ou ereg_replace est 3111111 (en éliminant les points et autres caractères). Donc est-il possible de supprimer les points et autres caractères dans le result de la bdd.

Exemple :

dans la bdd, j'ai un contrat portant le numéro 3.111.111. Dans mon champ texte, j'entre 3111111. Avec un code (si possible), on supprime les points et autres caractères dans le request (... WHERE NUM_POLICE = ...)

Suis-je assez clair ???


David
0
cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017
11 nov. 2009 à 11:25
Je précise qu'il s'agit d'une recherche dans une bdd à partir d'un champ texte.

Est-ce besoin de le mentionner.


David
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
11 nov. 2009 à 12:24
Suis-je assez clair ???

Moyennement
Il faut définir au mieux la ou les structures possibles de la chaîne étant donné qu'une regex semble nécessaire.
Ainsi :
est ce toujours ce format ?
[une lettre ou 1 chiffre][1 point ou un -][3 chiffres][1 point ou un -][3 chiffres]
ou peux tu avoir des trucs du genre 'GHJ-34-232.23', '342.566.322.323', 'TE-ED-ERZ-TRT' etc ...

En même temps une recherche à partir de 3111111 pourrait retourner '3.111.111' et '3-111-111', est ce possible ? est ce grave ?

Il peut être intéressant de créer une autre colonne qui ne contient que les chiffres / lettres (sans . et -) afin d'accélérer la chose. Ce n'est valable que si le nombre d'enregistrements et de requêtes de recherche est élevé.

Une solution serait :
SELECT * FROM CONTRATS 
WHERE NUM_POLICE REGEXP '(^[[:alnum:]]{1,3}[.|-][0-9]{1,3}[.|-][0-9]{1,3}$)' 
ORDER BY NUM_POLICE, ID_COMP ASC"; 

Cela devrait fonctionner, à condition que le format soit conforme à celui que je citais.

Tu pourrais également faire cela en PHP en ajoutant des '_' tous les 3 caractères (en commençant par la fin de la chaîne)


Cordialement,

Kohntark -
0

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

Posez votre question
cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017
11 nov. 2009 à 15:58
Merci encore. Afin d'être bien sûr de ce que je fais, pourrais-tu (STP) me placer ton code REGEXP dans la ligne ci-dessous ?

$query_result = "SELECT * FROM CONTRATS WHERE NUM_POLICE LIKE '%$_GET[champ_police]%' ORDER BY NUM_POLICE, ID_COMP ASC";

Je penses que cela devrait fonctionner. Sinon, l'idée de rajouter un champ dans la bdd sans les points et autres caractères est une bonne idée. Le problème c'est que ma base de données compte à ce jour plus de 2'000 contrat. Je te laisse imaginer ce que cela représenterait d'ajouter ce champ un par un.


Bien à toi

David
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
12 nov. 2009 à 06:39
ralala, faut que j'arrête de dire n'importe quoi moi !!

Le plus simple est peut être d'opter pour ma seconde solution :

<?php
$search_num_police =  strrev(preg_replace('`(\w{3})`', '${1}_', strrev($_GET['champ_police'])));
$query_result = "SELECT * FROM CONTRATS WHERE NUM_POLICE LIKE '$search_num_police' ORDER BY NUM_POLICE, ID_COMP ASC";
?>


Il y a sans doute moyen d'optimiser un peu, j'ai pondu ça à la va vite.


Je te laisse imaginer ce que cela représenterait d'ajouter ce champ un par un.

J'imagine très bien .... disons 1 seconde grand maximum avec une requête SQL


Cordialement,

Kohntark -
0
cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017
12 nov. 2009 à 08:46
MERCI ENCORE ET ENCORE.

J'ai posé le code tel quel et ça marche pas !!!

Par contre, il est vrai (je n'y avais pas pensé), qu'avec une requête SQL, il serait plus facile de copier les données du champ NUM_POLICE dans un nouveau champ que je pourrais appeler NUM_POLICE_SANS et qui contiendrait les numéros de polices sans les points et autres caractères ("-", "'", ".", "/").

Je vais essayer de trouver la ligne de code SQL à moins que ta générosité (bien prouvée) ne t'incite à m'indiquer la voie.


Bien à toi


David
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
12 nov. 2009 à 08:56
et ça marche pas !!!

C'est une réponse bien peu précise ça
Tu as une erreur ? Pas de résultat ? Trop de résultats ? autre ?

Si tu pouvais poster ton code (le nécessaire) ça serait d'une grande utilité.

Commençons par là. Pour la requête SQL je pourrai te filer un coup de main ce soir si tu veux mais n'hésites pas à poster ce que tu auras trouvé de ton côté.

Pas besoin de se prendre trop la tête côté optimisation étant donné que la requête ne sera exécuter qu'une seule fois.
en gros :

- récupération ligne par ligne du résultat NUM_POLICE
- traitement de la chaîne avec des str_replace() pour virer les . et -
- INSERT du résultat dans le champ NUM_POLICE_SANS préalablement crée


Cordialement,

Kohntark -
0
cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017
12 nov. 2009 à 09:02
Il n'y a pas d'erreur. En fait, j'ai rentré un numéro de contrat du style 3111111 pour trouver le contrat enregistré dans ma bdd portant le numéro 3.111.111 et il n'y a eut aucun résultat. Par contre, dans le code que tu m'as aimablement remis, je n'arrive pas à voir où est-ce qu'on remplace les points et/ou les "-". En fait, dans les numéros de polices que je rentre, il peut y avoir les caractères suivants : ".", "-", "/", "'".

C'est très sympa de ta part.

Autre question. Comment fais-tu pour reprendre partie du texte posté par un autre comme tu l'as fait dans ton dernier message. (reprendre l'expression pour y répondre précisément) ?


David
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
12 nov. 2009 à 20:09
Salut David,

Désolé de me répéter :
Si tu pouvais poster ton code (le nécessaire) ça serait d'une grande utilité.


J'avais fait un test rapide de mon code et il fonctionnait. Il peut cependant rester une erreur. Etant donné que tu n'avais pas répondu aux questions de mes précédents messages ("quels caractères peuvent être présent ? Le point, ... ?? ", "est ce toujours ce format ?", ...) j'ai vu large et le code devrait prendre en compte tous les autres caractères (".", "-", "/", "'")

Concernant ces questions en suspend :
quels emplacements peuvent ils prendre ? Ils marquent les milliers ? ils peuvent se situer ailleurs ?

est ce toujours ce format ?
[une lettre ou 1 chiffre][1 point ou un -][3 chiffres][1 point ou un -][3 chiffres]
ou peux tu avoir des trucs du genre 'GHJ-34-232.23', '342.566.322.323', 'TE-ED-ERZ-TRT' etc ...

En même temps une recherche à partir de 3111111 pourrait retourner '3.111.111' et '3-111-111', est ce possible ?
est ce grave ?


.. il est indispensable que tu y répondes si tu veux de l'aide.

Pour tenter d'isoler le pb ajoute après la ligne du $query_result :
echo '<hr />Requête = '.$query_result.'<hr />';

et dis moi ce que ça retourne.

Autre question. Comment fais-tu pour reprendre partie du texte posté par un autre comme tu l'as fait dans ton dernier message

Il suffit d'utiliser le premier icône de la textbox à gauche de ('citation' noté au passage de la souris) et de coller le texte voulu entre les balises.


Kohntark -
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
12 nov. 2009 à 20:18
Un peu plus d'info ...
Par contre, dans le code que tu m'as aimablement remis, je n'arrive pas à voir où est-ce qu'on remplace les points et/ou les "-".

Comme je l'ai dit dans mon dernier message j'ai vu large.
Mon code ne tient pas compte des caractères ., - ou autres, il se "contente" d'ajouter des jokers MySQL '_' tous les 3 caractères (en partant de la fin)

ex :
3111111 donne 3_111_111
Ce qui devrait renvoyer tous les résultats de la forme
3[n'importe quel caractère]111[n'importe quel caractère]111
Ainsi 3[111+111, 3-111-111, A-ERSX876, etc ... devraient être retournés

Cordialement,


Kohntark -
0
cs_sebalex Messages postés 150 Date d'inscription vendredi 25 février 2005 Statut Membre Dernière intervention 6 janvier 2017
12 nov. 2009 à 23:45
Salut,

quels emplacements peuvent ils prendre ? Ils marquent les milliers ? ils peuvent se situer ailleurs ?

est ce toujours ce format ?
[une lettre ou 1 chiffre][1 point ou un -][3 chiffres][1 point ou un -][3 chiffres]
ou peux tu avoir des trucs du genre 'GHJ-34-232.23', '342.566.322.323', 'TE-ED-ERZ-TRT' etc ...


En fait, il n'y a pas de format spécifique et les caractères peuvent être des points, des traits d'union, des séparateurs de milliers ou encore des "slash". Il se peut qu'avant le premier point il y ait deux chiffres ou même cinq ou six chiffres du style 0034512.98-2 ou encore un format comme 70/2.345.678-9, etc.

Comment faire pour copier toutes les données dans mon champ bdd NUM_POLICE dans le nouveau champ NUM_POLICE_SANS que je viens de créer et en supprimant tous les caractères qui ne sont pas des chiffres ou des lettres ?


En même temps une recherche à partir de 3111111 pourrait retourner '3.111.111' et '3-111-111', est ce possible ?
est ce grave ?


Non, ce n'est logiquement pas possible car il n'est pas possible d'avoir deux contrats avec le même numéro de police. Et même si c'était le cas, ce ne serait pas grave.

Salutations.


David
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
13 nov. 2009 à 06:54
franchement essai de répondre aux questions à l'avenir parce que pour le coup il faut attendre le treizième message pour s'apercevoir que tout ce qui a été dit avant ne sert à rien, alors que les questions essentielles ont été posées dès mon premier message, et répétées ensuite.

Bizarre un tel format qui semble plus relever de l'aléatoire que du structuré, ça ne doit pas faciliter le traitement des données tout ça. Bref, il semble bien que la création d'une colonne soit nécessaire.

Comment faire pour copier toutes les données dans mon champ bdd NUM_POLICE dans le nouveau champ NUM_POLICE_SANS que je viens de créer et en supprimant tous les caractères qui ne sont pas des chiffres ou des lettres ?


Un truc dans le genre peut être :
- récupération ligne par ligne du résultat NUM_POLICE

- traitement de la chaîne :
<?php
// suppression de tout ce qui n'est pas une lettre ou un chiffre
$resultat = preg_replace('`\W|_`', '', $champ_NUM_POLICE);
?>


- INSERT du résultat dans le champ NUM_POLICE_SANS préalablement crée


Cordialement,

Kohntark -
0
Rejoignez-nous