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 :

Requete sql pour extraire une chaine précise dans une colonne mysql [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 107
    Points : 52
    Points
    52
    Par défaut Requete sql pour extraire une chaine précise dans une colonne mysql
    Bonjour,

    J'aimerai pouvoir extraire une sous-chaîne de caractères du type 'img_' pour récupérer toutes les noms d'images compris dans le champ contenu de ma table mais je ne trouve pas la solution. Je ne récupére que des morceaux de chaîne où ne se trouvent pas mon img_ et il faudrait qu'il soit dedans. Un petit coup de main ?
    merci

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id,page, SUBSTRING(contenu, 8, 20) 
    FROM tbl_contenu
    WHERE contenu like '%img_%'
    ORDER BY id;

  2. #2
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Quel est le format de la donnée dans la colonne contenu ? Tu as pensé à récupérer la totalité de la colonne et à faire le découpage en php plutôt ?
    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]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par LiliValerie Voir le message
    ... du type 'img_' pour récupérer toutes les noms d'images compris dans le champ contenu de ma table...
    Bien qu'il soit possible d'utiliser des regex (expressions régulières) dans les requêtes SQL...
    ...personnellement, je ne m'y risque pas.

    Je suis de l'avis de Celira :
    • une requête simple (récupération des contenus bruts)
    • ensuite, traitement en PHP, où il existe toutes sortes de fonctions de traitement de regex preg_match(), preg_match_all(),...

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 107
    Points : 52
    Points
    52
    Par défaut
    Bonjour et merci beaucoup pour vos réponses.
    Ma chaîne de caractères est de type text, je vais essayer de tout récupérer et de faire un découpage en php comme vous me le conseillez.


    J'ai fait quelque chose comme ça qui fonctionne mais ca ne me retourne pas mal de texte inutile, c'est le bazarre. Et j'ai utilisé les ereg_replace, je n'arrive pas à avoir quelque chose de correct avec preg_match...

    Code php : 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
     
    $req = "select pages,contenu from donnees where contenu LIKE '%img_%' order by id asc ";
    $resultat = mysql_query($req,$conn)  or die('Erreur SQL !'.$req.'<br>'.mysql_error());
    while ($data= mysql_fetch_array ($resultat)){  
     
    	$dataGlobal = $data['contenu'];
        $data_donnees = ereg_replace("^.*img.","",$dataGlobal);
        $data_donnees = ereg_replace("/.*img","",$data_donnees);
     
    	echo($data['pages']);
     
    	$dataGlobal = $data['donnees'];
        $data_donnees = ereg_replace("^.*gal.","",$dataGlobal);
        $data_donnees = ereg_replace("/.*$","",$data_donnees);
        echo $data_donnees;
       }

    Sympa tes citations en signature jreaux62 ;-)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,


    Avertissement
    Cette fonction est OBSOLETE depuis PHP 5.3.0. Nous vous encourageons vivement à ne plus l'utiliser.
    Ici, on utilisera plutôt :







    Citation Envoyé par LiliValerie Voir le message
    Sympa tes citations en signature jreaux62 ;-)
    Merci

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 107
    Points : 52
    Points
    52
    Par défaut
    Oui, je sais bien pour les ereg_replace. J'ai essayé autrement mais ce n'est pas encore le résultat escompté même si c'est mieux, j'ai toujours du texte parasite qui s'affiche.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $req = "SELECT * FROM donnees WHERE contenu REGEXP \"img_\"";
     
    $resultat = mysql_query($req,$conn)  or die('Erreur SQL !'.$req.'<br>'.mysql_error());
    while ($data= mysql_fetch_array ($resultat)){  
     
    	$dataGlobal = $data['contenu'];
    	$debut = stripos($dataGlobal, 'http://www.site.fr/upload/img_') + 5; 
        $fin = stripos($dataGlobal, '.jpg');
        $data_donnees = substr ($dataGlobal, $debut, $fin-$debut);
    	echo $data_donnees;
     
    	}

    Je récupère ceci :

    numero page image
    677 //www.site.fr/upload/img_678.jpg" alt="" /> + du texte, des images et de nouveau un autre numéro de page et lien image 679 //www.site.fr/upload/img_682.jpg" alt=""

    et ceci sur toutes mes lignes de résultats...


    si je teste ça :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $dataGlobal = $data['donnees'];
    $pattern = '/^img_/';
    preg_match($pattern, substr($dataGlobal,30), $matches, PREG_OFFSET_CAPTURE);
    print_r($matches);

    je récupère ceci :

    677 Array
    679 Array
    680 Array
    681 Array
    54 Array
    55 Array

  7. #7
    Invité
    Invité(e)
    Par défaut
    Si tu nous donnais quelques exemples de "contenu" (ou des extraits significatifs), on pourrait peut-être t'aider...

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 107
    Points : 52
    Points
    52
    Par défaut
    Oui, ce serait plus simple alors je viens de modifier mon dernier message pour montrer les retours

  9. #9
    Invité
    Invité(e)
    Par défaut
    Que veux-tu qu'on en fasse...

    Si on n'a ni le texte de départ ("contenu"), ni ce qu'on est censer récupérer, comment veux-tu qu'on te dise quel motif de regex utiliser ?


    Question subsidiaire : pourquoi n'effectuer la recherche que sur les 30 premiers caractères ?
    substr($dataGlobal,30)

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 107
    Points : 52
    Points
    52
    Par défaut
    Ok bon désolée...

    Je cherche à récupérer ce genre d'information "http://www.site.eu/upload/img_694.jpg" dans mon champ contenu en text sachant que j'ai toujours ce même masque de départ "http://www.site.eu/upload/img_":

    voici un exemple de contenu :
    Code html : 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
     
    <p style="text-align: justify;"><img src="http://www.site.eu/upload/img_334.jpg
    " style="width: 84px; height: 91px;" alt="" /></p>
    <p style="text-align: justify;"><font class="editor_TexteTitre"><img align="left" src="http://www.site.eu/upload/instruments_site_111.jpg
    " style="width: 80px; height: 110px;" alt="" /><br />
    </font></p>
     
     
    <p><font class="editor_TexteTitre"></font></p>
    <table width="650" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td><img width="205" height="280" align="left" alt="" src="http://www.site.eu/upload/l
    " /></td>
                <td style="text-align: justify;"><font class="editor_TexteParagraphe"><br />
                - Set one temperature <br />
                - Set gain</font><br />
                <br />
                <ul>
     
                </ul>
                </td>
            </tr>
            <tr>
                <td style="text-align: center;"><font class="editor_TexteParagraphe"><strong>P/N 85000</strong></font></td>
                <td><font class="editor_TexteParagraphe">with HPLC nebulizer</font></td>
            </tr>
        </tbody>
    </table>
    <p><font class="editor_TexteTitre">Sedex 90LT The Ultimate</font></p>
    <table width="650" cellspacing="0" cellpadding="0" border="0">
        <tbody>
            <tr>
                <td><img width="208" height="285" alt="" src="http://www.site.eu/upload/img_697.jpg" /></td>
                <td style="text-align: justify;"><font class="editor_TexteParagraphe">based on a Laser.</font><br />
                <ul>
     
                </ul>
                </td>
            </tr>
            <tr>
                <td style="text-align: center;"><font class="editor_TexteParagraphe"><strong></strong></font></td>
                <td><font class="editor_TexteParagraphe"></font></td>
            </tr>
        </tbody>
    </table>
    <p>&nbsp;</p>

  11. #11
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    // $pattern = '/<img[^>]*src[^>]*=[^>]*"([^>]*)"/Ui';	// contenu <img src en général
    $pattern = '/<img[^>]*src[^>]*=[^>]*"http:\/\/www.site.eu\/upload\/(img_[^>]*)"/Ui';		// contenu <img src contenant "http://www.site.eu/upload/img_"
     
    preg_match_all($pattern, $texte, $result);
     
    if(!empty($result))
    {
    	echo '<pre>'; print_r($result[1]); echo '</pre>';
    }
    ?>
    $result[1] contient les noms des images -> entre les (...) du $pattern :

    Affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Array
    (
        [0] => img_334.jpg
     
        [1] => img_349.jpg
     
        [2] => img_694.jpg
        [3] => img_695.jpg
        [4] => img_696.jpg
        [5] => img_697.jpg
    )
    Cela dit, normalement, on utilise à parseur pour ce genre de recherche. "php parser fichier html"

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 107
    Points : 52
    Points
    52
    Par défaut
    Merci beaucoup pour ton aide, le temps que tu m'as consacré, c'est très gentil. Cela fonctionne, je vais garder ce code comme si c'était mon précieux ;-)
    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2011, 11h40
  2. Réponses: 6
    Dernier message: 13/11/2009, 17h06
  3. Réponses: 0
    Dernier message: 07/06/2009, 13h31
  4. Réponses: 2
    Dernier message: 02/10/2007, 12h42
  5. fct pour lire autant de caracteres dans une chaine?
    Par jeanfrancois dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2006, 16h45

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