IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Plantage aléatoire sur Requete avec REGEX


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Plantage aléatoire sur Requete avec REGEX
    Bonjour a tous
    Voici mon code php pour faire une requete sur un fichier client, critères nom et prénom, mais en contrôlant les variantes accentuées.
    Parfois ma requete fonctionne et d'autres fois j'ai ce message d'erreur "
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    $nom_test = strtolower($nom);
    $nom_test = preg_replace('/[eèéêëEÈÉÊË]/', "[eèéêëEÈÉÊË]", $nom_test);
    $nom_test = preg_replace('/[aàáâãäåAÀÁÃÄÅ]/', "[aàáâãäåAÀÁÃÄÅ]", $nom_test);
    $nom_test = preg_replace('/[iìíîïIÌÍÎÏ]/', "[iìíîïIÌÍÎÏ]", $nom_test);
    $nom_test = preg_replace('/[oòóôõöOÒÓÔÕÖ]/', "[oòóôõöOÒÓÔÕÖ]", $nom_test);
    $nom_test = preg_replace('/[uùúûüUÙÚÛÜ]/', "[uùúûüUÙÚÛÜ]", $nom_test);
    $nom_test = preg_replace('/[yýÿYÝ]/', "[yýÿYÝ]", $nom_test);
    $nom_test = preg_replace('/[cçCÇ]/', "[cçCÇ]", $nom_test);
     $nom_test = preg_replace('/[ -]/', "[ -]", $nom_test);
     
    $prenom_test = strtolower($prenom);
    $prenom_test = preg_replace('/[eèéêëEÈÉÊË]/', "[eèéêëEÈÉÊË]", $prenom_test);
    $prenom_test = preg_replace('/[aàáâãäåAÀÁÃÄÅ]/', "[aàáâãäåAÀÁÃÄÅ]", $prenom_test);
    $prenom_test = preg_replace('/[iìíîïIÌÍÎÏ]/', "[iìíîïIÌÍÎÏ]", $prenom_test);
    $prenom_test = preg_replace('/[oòóôõöOÒÓÔÕÖ]/', "[oòóôõöOÒÓÔÕÖ]", $prenom_test);
    $prenom_test = preg_replace('/[uùúûüUÙÚÛÜ]/', "[uùúûüUÙÚÛÜ]", $prenom_test);
    $prenom_test = preg_replace('/[yýÿYÝ]/', "[yýÿYÝ]", $prenom_test);
    $prenom_test = preg_replace('/[cçCÇ]/', "[cçCÇ]", $prenom_test);
    $prenom_test = preg_replace('/[ -]/', "[ -]", $prenom_test);
     
    $requete = $bdd->query("SELECT * FROM membres WHERE LOWER(prenom) REGEXP '^$prenom_test' AND LOWER(nom) REGEXP '^$nom_test'");

    Je ne suis pas un pro je fais probablement mal les choses mais je n'ai pas trouver comment faire mieux . Merci a vous

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $nom_test = strtolower($nom);
    $nom_test = preg_replace('/[eèéêëEÈÉÊË]/', "[eèéêëEÈÉÊË]", $nom_test);
    Ça ne vous semble pas étrange de vouloir remplacer des capitales accentuées dans un texte qui a été mis tout en minuscules ?
    Et en plus, vous remplacez quelque chose par la même chose !

    Bref, je ne comprends pas bien le sens de votre démarche !

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM membres WHERE LOWER(prenom) REGEXP '^$prenom_test' AND LOWER(nom) REGEXP '^$nom_test'
    1) Il vaut mieux éviter la guerre des étoiles !

    2) Pourquoi utiliser REGEXP qui empêche l'utilisation des index de la BDD ?

    Quel est le but global de votre programme ? Trouver des noms et prénoms voisins pour détecter de potentiels doublons ?

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes
    Le message est assez clair : vous obtenez un résultat de taille trop grande par rapport au paramètre max_allowed_packet.

    Voyez déjà si la non utilisation de l'étoile dans la requête permet de diminuer la taille du résultat et donc empêcher la survenue de l'erreur.
    Si c'est insuffisant, agrandissez la taille de max_allowed_packet.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci CinePhil,

    Pour préciser je cherche effectivement à éviter des doublons de client quelque soit la façon dont le nom et prénom ont été orthographiés lors de la saisie d'un formulaire.
    Par exemple Helene doit etre = helene = helène = Hélene ou Jean-luc = jean luc = Jean Luc
    Donc je cherche tout les caractères accentué pour chaque lettre pouvant etre accentuée
    Pour Hélène ça donnera h [n'importe quel e accentué ou pas] l [n'importe quel e accentué ou pas] n [n'importe quel e accentué ou pas]

    J'ai viré * je n'ai besoin que de l'id client.

    Peut etre y a t'il plus simple auquel cas je suis preneur

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Pour préciser je cherche effectivement à éviter des doublons de client quelque soit la façon dont le nom et prénom ont été orthographiés lors de la saisie d'un formulaire.
    Notez que vous pouvez potentiellement avoir deux clients appelés Jean Dupont !

    Pour le reste, je ne sais pas s'il y a plus simple mais ayez conscience que les accents sont importants et que M. Démon n'est pas le même que M. Demon. Dans votre BDD, vous devez avoir des données les plus exactes possible.

    Et quelle que soit la méthode, corrigez votre code qui ne fait pas ce que vous attendez !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Pour faire ceci il vaudrait mieux travailler avec les COLLATIONS....
    À me lire : https://sqlpro.developpez.com/cours/...er/collations/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je me penche sur l'histoire des collations effectivement avec le _ci et _ai il y a peut être une piste. Faut juste trouver la requête qui va bien

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes
    Dans votre fichier my.ini, modifiez la variable suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    max-allowed-packet     = 16M
    Si cela ne passe toujours pas, mettez 32M.

    En ce qui concerne votre base de données, vous devez appliquer une collation "CI" pour "Case Insensitive"
    Si vous ne désirez pas faire de distinction entre les mots avec accents et sans accent, voici un exemple de la gestion du collate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`   integer unsigned NOT NULL AUTO_INCREMENT primary key,
      `lib`  varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`lib`) VALUES
    ('été'),('france'),('forêt'),('après'),('ici'),('là')
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+--------+
    | id | lib    |
    +----+--------+
    |  1 | été    |
    |  2 | france |
    |  3 | forêt  |
    |  4 | après  |
    |  5 | ici    |
    |  6 | là     |
    +----+--------+
    --------------
    select  *
      from  `test`
     where  lib like '%e%'
    --------------
     
    +----+--------+
    | id | lib    |
    +----+--------+
    |  2 | france |
    +----+--------+
    --------------
    select  *
      from  `test`
     where  lib like '%e%' collate latin1_general_ci
    --------------
     
    +----+--------+
    | id | lib    |
    +----+--------+
    |  2 | france |
    +----+--------+
    --------------
    select  *
      from  `test`
     where  lib like '%e%' collate latin1_swedish_ci
    --------------
     
    +----+--------+
    | id | lib    |
    +----+--------+
    |  1 | été    |
    |  2 | france |
    |  3 | forêt  |
    |  4 | après  |
    +----+--------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Dans mon exempe, autant mettre partout "latin1_swedish_ci".
    Il y a beaucoup de conneries sur le net concernant la gestion des collates.
    Le mieux est de faire un test afin de déterminer ce que vous cherchez à faire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2017
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci à tous, pas mal de trucs à tester pour arriver a qq chose de propre et efficace.
    Je ne pense pas changer le max-allowed-packet dans un premier temps, mais je le garde sous le coude en cas d'ultime recours.

Discussions similaires

  1. [11g] Fermeture socket sur requete avec sysdate
    Par Francky8 dans le forum Administration
    Réponses: 1
    Dernier message: 03/02/2014, 15h59
  2. Probleme sur requete avec jour manquant
    Par calou_33 dans le forum SQL
    Réponses: 5
    Dernier message: 27/01/2011, 10h14
  3. Problème sur split avec regex
    Par fr1man dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/05/2009, 13h46
  4. Probleme sur requete avec LIKE
    Par cryosore dans le forum JDBC
    Réponses: 13
    Dernier message: 23/04/2009, 14h23
  5. Pb Graphique sur requete avec parametre
    Par catoucat dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/06/2006, 08h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo