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

PHP & Base de données Discussion :

Requête SQL avec REGEXP en PHP


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 79
    Par défaut Requête SQL avec REGEXP en PHP
    Bonjour chers amis,

    Je ne sais pas trop par où commencer donc je vais essayer d'être le plus bref possible.

    J'ai une page PHP avec un champ texte et un bouton Submit. Je tape le mot "test" et appuie sur le bouton. La variable $KeyW prend la valeur "test" et grâce à une requête SQL que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $GetIssue = 'SELECT *
    			FROM ISSUETASK
    			WHERE ((title like "%'.$KeyW.'%")
    			OR (iduser IN (select distinct iduser from user where name like "%'.$KeyW.'%"))
    			OR (idproject IN (select distinct idproject from project where idclient IN (select distinct idclient from client where clientname like "%'.$KeyW.'%")))
    			OR (datetimestart like "%'.$KeyW.'%")
    			OR (duedate like "%'.$KeyW.'%")
    			OR (priority like "%'.$KeyW.'%")
    			OR (description like "%'.$KeyW.'%")
    			OR (idissue IN (select idissue from followupcomplete where thingsdone LIKE "%'.$KeyW.'%")))
    			AND close != "'.$Close.'"
    			AND idtype like "%'.$Type.'%"';
    Le résultat s'affiche dans un tableau plus bas.

    Sur mon formulaire, j'ai ajouté une checkbox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <tr>
        <td>
            <label for="Fulled">Expression complete :</label>
            <input type="checkbox" id="Fulled" <?PHP if($_GET["Fulled"] == "on"){echo "checked='checked'";} ?> name="Fulled"/>
        </td>
    </tr>
    Jusque ici tout fonctionne parfaitement !
    Ce que je voudrais faire c'est que lorsque j'appuie sur le bouton submit et que la case est cochée, la requête change un petit peu, pour m'afficher seulement les résultats qui répondent à ma condition REGEXP. Exemple : avant j'avais les résultats "Jean-Test", "Test2", "Test Lol", "Le test" et je voudrais que les résultats avec la case cochée soient : "Test Lol" et "Le test", que la condition soit : "rien ou un espace" AVANT le mot clé, et "rien ou un espace" APRÈS le mot clé (et sans casse). En PCRE ça donne : #$KeyW#i ($KeyW étant le mot clef, donc c'est une variable PHP).

    Maintenant je voudrais ajouter cela à ma requête SQL (donc en POSIX), voici ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if($_GET["Fulled"] == "on")
    {
    	$GetIssue .= "AND idcategory = 1 AND $KeyW REGEXP '^$KeyW$'";
    }
    else
    {
    	$GetIssue .= 'and idcategory = 1';
    }
     
    $ResultGetIssue = mysql_query($GetIssue);
    Ici, Fulled est ma checkbox, donc si j'ai coché la checkbox cela s'ajoute à la fin de ma requête (ne prenez pas en compte le idcategory il est indépendant du REGEXP) sinon il s'agit d'une recherche normale.

    OR tout ceci ne fonctionne pas et j'aimerais bien savoir pourquoi ... L'erreur :
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\sasCopy\search.php on line 489

    Ligne 489 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while($ResultIssue = mysql_fetch_array($ResultGetIssue))
    Voila j’espère que vous m'aurez compris, si vous avez besoin de plus d'infos je suis là Merci d'avance

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $GetIssue .= "AND idcategory = 1 AND $KeyW REGEXP '^$KeyW$'";
    A ton avis, savoir quel $ correspond à une variable et lequel correspond à la regexp, c'est décidé à pile ou face ?

    EDIT
    D'ailleurs, à quoi peut bien te servir la condition $KeyW REGEXP '^$KeyW$' ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 79
    Par défaut
    C'est justement la mon problème ^^ Je n'ai jamais utilisé le REGEXP auparavant et je me demandais si on pouvais mettre le nom d'une variable PHP sans que le $ ne gêne ...

    Et sinon je ne voit pas trop comment s'utilise cette fonction si tu peux me guider

    EDIT : D'habitude je trouve ce dont j'ai besoin sur Open Classrooms mais ils traîtent à peine le sujet des REGEXP en POSIX ...

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Le plus simple est d'utiliser une chaine avec des quotes simples (donc sans interprétation) et de concaténer ta variable
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $GetIssue .= 'AND idcategory = 1 AND ma_colonne REGEXP \'^'.$KeyW.'$\' ';
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 79
    Par défaut
    D'accord merci mais pour ma_colonne je met quoi ? Car dans ma requête je traite plusieurs colonnes. Je pensait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $GetIssue .= 'AND idcategory = 1 AND mysql_query($GetIssue) REGEXP \'^'.$KeyW.'$\' ';
    Mais cela m'affiche le même message d'erreur qu'avant.

    EDIT Sinon avec une seule colonne cela marche très bien Merci

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    En fait, je pense qu'il faut que tu remplaces les morceaux avec "like" par les regex, par exemple '(title like "%'.$KeyW.'%")' devient '(title REGEXP \'^'.$KeyW.'$\' )'.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 79
    Par défaut
    D'accord, donc je ne peux pas rajouter juste une ligne à la fin comme je pensait faire, c'est dommage, surtout que je vais devoir faire ça avec les quelques 24 requêtes de mon script ^^ Merci


    Par contre je t'ai dit que ça marchait le \'^'.$KeyW.'$\' mais du coup non, sais-tu comment dire "espace" et "ou" dans le langage REGEX ?

  8. #8
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $GetIssue .= 'AND idcategory = 1 AND mysql_query($GetIssue) REGEXP \'^'.$KeyW.'$\' ';
    Mais qu'est-ce que c'est que cette syntaxe ?
    Que vient faire un mysql_query à l'intérieur d'une requête SQL ?

    Cel
    '(title REGEXP \'^'.$KeyW.'$\' )' ça revient quelque peu au même que 'title = \''.$KeyW . '\'' non ?
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 79
    Par défaut
    Ce que je voudrais c'est qu'on ai le choix : expression complète ou non

    Donc si je suis obligé d'avoir toutes mes requêtes en double avec juste un petit truc qui change c'est très chiant

  10. #10
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2015
    Messages : 79
    Par défaut
    Re,

    cela ne fonctionne pas, j'en ai testé d'autres comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    " SELECT * FROM ISSUETASK WHERE title REGEXP '^[ ]?.'$KeyW'.[ ]?' "
    mais toujours sans résultat ...
    Quelqu'un pourrait-il m'aider svp ?

  11. #11
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Chuis pas sure de ce qu'on peut mettre dans une REGEX SQL exactement, mais tu peux essayer quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '(title REGEXP \'^([ ]*)'.$KeyW.'([ ]*)$\' )'
    Au passage, attention aux quotes encadrant la chaine : soit tu utilises des simples quotes, soit des doubles, mais évites de mélanger les deux
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Déjà il faut arrêter de te mélanger les pinceaux entre les quotes simples et doubles. Donc il faut s'imposer une règle et ne plus en changer, par exemple: php encadre ses chaînes SQL entre simple quotes, et SQL encadre ses chaînes entre double quotes.

    Avec cette règle ton exemple précédent donnerai:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = 'SELECT * FROM ISSUETASK WHERE title REGEXP "^[ ]?' . $KeyW . '[ ]?"';

    Avant toute chose, pour s'assurer qu'un caractère pouvant avoir un sens spécial dans une regex soit échappé de manière à ce qu'il soit vu comme un caractère littéral et pas comme une "commande" spéciale, il faut utiliser la fonction PHP preg_quote qui va se charger de "désactiver" ces caractères spéciaux en les échappant. Exemple preg_quote('Maurice+Berthe=Amour pour toujours'); donnera Maurice\+Berthe\=Amour pour toujours (bien que l'échappement du égal ne sert à rien).


    Bref, pour "isoler" $keyW, il y a 2 manières possibles:
    • soit $keyW commence et se termine par des lettres, des chiffres ou des underscores et là tu peux utiliser des word boundaries (~limites de mot)
    • soit ce n'est pas le cas et il faut vérifier la présence d'un espace ou de la limite de la chaîne de part et d'autre.



    Donc dans le premier cas:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = 'SELECT * FROM ISSUETASK WHERE title REGEXP "[[:<:]]' . preg_quote($KeyW) . '[[:>:]]"';
    [[:<:]] marque une séparation avec à sa droite un caractère qui est une lettre ou un chiffre ou un underscore, et à sa gauche un caractère qui n'en est pas ou le début de la chaîne. [[:>:]] c'est le contraire.

    Dans le deuxième cas:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = 'SELECT * FROM ISSUETASK WHERE title REGEXP "( |^)' . preg_quote($KeyW) . '( |$)"';

    Maintenant une remarque plus générale. Si tu te retrouves à chercher la présence d'un mot-clef à coup de LIKE (déjà pas bien rapides) ou de REGEXP (encore pire) sur je ne sais pas combien de colonnes avec des sous-requêtes en veux-tu en voilà, c'est que quelque chose ne va pas en amont dans la conception de la bdd voire de l'application entière. Je te suggère de prendre un peu de recule pour voir s'il n'y a pas de moyen plus simple pour arriver à tes fins.

Discussions similaires

  1. Exécuter des requête SQL (avec ou sans PHP) dans javascript
    Par mir540 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/11/2009, 10h03
  2. [SQL] Comparer résultat d'une requête Sql avec php
    Par nicoxweb dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/09/2007, 22h46
  3. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15
  4. requête SQL avec paramètre en vb avec base de donnée SQL srv
    Par dialydany dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/02/2005, 10h33
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37

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