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 :

récupérer la moitié du texte via une requete SQL [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 18
    Points
    18
    Par défaut récupérer la moitié du texte via une requete SQL
    Bonsoir à tous,

    Tous les articles de mon site sont stockés dans une base de données.
    1 champ = 1 article.

    Je souhaiterai pouvoir récupérer via une requête SQL, la première moitié de l'article, puis dans une seconde requête la dernière moitié de l'article.

    Existe il une syntaxe SQL qui permet de faire cela?

    Je vous remercie par avance.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    En MySQL si c'est cette base que vous utilisez, je tenterais quelque chose du genre :

    Première requête
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUBSTRING(champ1,0,CHAR_LENGTH(champ1)/2) FROM LaTable;

    Deuxième requête

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUBSTRING(champ1,CHAR_LENGTH(champ1)/2) FROM LaTable;


    A tester donc

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par MaitrePylos Voir le message
    En MySQL si c'est cette base que vous utilisez, je tenterais quelque chose du genre :

    Première requête
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUBSTRING(champ1,0,CHAR_LENGTH(champ1)/2) FROM LaTable;

    Deuxième requête

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUBSTRING(champ1,CHAR_LENGTH(champ1)/2) FROM LaTable;


    A tester donc

    Merci pour ta réponse.

    je viens de tester mais cela ne fonctionne pas.

    mais tu m'as donné une piste avec les substring et char_length. Je vais continuer mes recherches.

    Merci encore

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    en faite ta requete fonctionne ^^ je l'avais tester sur phpmyadmin ce qui n'avait pas fonctionné.

    Mais dans mon code cela fonctionne.

    Juste une petite erreur, pour afficher la premiere moitié, il suffit juste de remplacer le 0 par un 1

    Merci maitrepylos

    par contre mon 2ème soucy, c'est en coupant la moitié du texte, parfois il me coupe un mot.
    Comment pourrais je faire pour qu'il coupe sur un espace?

  5. #5
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 628
    Points
    3 628
    Billets dans le blog
    8
    Par défaut
    Pour ton "deuxième souci", j'adopterais une démarche différente...

    Dès le début, ce n'est pas tant pile la moitié des caractères que tu veux, que par exemple, la moitié des mots...

    Si tu utilises cette fonction :

    http://fr.php.net/manual/fr/function.substr-count.php

    pour compter les espaces dans ton champ texte, et donc les mots, tu pourrais diviser par deux et récupérer tout jusqu'au nième/2 espace...

    Heu, je sais, plus facile à dire qu'à faire, surtout le répérage de la nième occurence dans une chaîne, pas trouvé de fonction pré-mâchée pour ça...

    Mais ya des pointures sur ce forum !

    edit :
    Pour le début, ça donne ça :

    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
     
    <html>
    <head>
    </head>
    <body>
    <?php
    $titexte='Dans ce petit texte, il y a exactement 10 mots.';
    echo $titexte.'<br/>';
    $nbespaces=substr_count($titexte, ' ');
    echo 'Il y a exactement '.$nbespaces.' espaces.<br/><br/>';
    $grandtexte="Un mour vers jidi sur la fateplorme d'un arobus, je his un vomme, au fou lort con, et à l'entapeau chourré d'une tricelle fessée.<br/>";
    echo $grandtexte.'<br/>';
    echo 'Celui ci comporte 24 mots.<br/>';
     
    $espaces=substr_count($grandtexte, ' ');
    echo 'Il y a exactement '.$espaces.' espaces.';
    ?>
    </body>
    </html>
    et ça a pour résultat :

    Dans ce petit texte, il y a exactement 10 mots.
    Il y a exactement 9 espaces.

    Un mour vers jidi sur la fateplorme d'un arobus, je his un vomme, au fou lort con, et à l'entapeau chourré d'une tricelle fessée.

    Celui ci comporte 24 mots.
    Il y a exactement 23 espaces.
    Reste à te faire une boucle avec la fonction 'prochaine occurrence de l'espace' et à stocker la première moitié dans une variable et la seconde dans une autre...

    Edith encore et mode curieuse :

    Ceci dit, c'est curieux non, de récupérer le champ texte saucissonné en deux. Il y a une raison ?

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 600
    Points
    12 600
    Par défaut
    Citation Envoyé par Dendrite Voir le message
    Ceci dit, c'est curieux non, de récupérer le champ texte saucissonné en deux. Il y a une raison ?
    J'imagine, qu'il veut afficher un début d'article, et ensuite si tu clique quelque part tu auras le reste .


    Mais en partant de ta reflexion, j'ai trouvé un solution qu'il ne me semble pas mauvaise.

    Alors tout ce fait dans MySQL.

    1: il faut créer une fonction dans la base pour compter le nombres d'espace contenu dans le texte.(cfr reflexion Dendrite)

    Voici la fonction à créer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE FUNCTION substrCount(x text, delim varchar(12)) returns int
    return (length(x)-length(REPLACE(x, delim, '')))/length(delim);
    On pourras choisir n'importe quel délimiteurs dans cette fonctions.

    Une fois que la fonction est en place on recherche la moitié du texte + 1 mot

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUBSTRING_INDEX(Champ1, ' ', FLOOR((substrCount(Champ1, ' ')/2)+1));

    Alors plusieurs remarques :
    Le SUBSTRING_INDEX retourne les mots se trouvant la position données, c'est a dire le total des blancs divisé par 2 + 1 arrondis à l'inférieur : (7/2)+1 = 4.5 arrondis à 4

    Ensuite pour la deuxième partie :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT SUBSTRING_INDEX(Champ1, ' ', FLOOR(-(substrCount(Champ1, ' ')/2)));

    C'est pratiquement identique, sauf qu'on lui passe un nombre négatif, pour que le SUBSTRING_INDEX parte dans l'autre sens et on n'ajoute pas 1 pour ne pas avoir deux fois le même mot : -(7/2) = -3.5 arrondi à -4

    Ouf, mieux cela va être difficile

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Merci bcp pour vos réponses.

    Malheureusement je suis en période d'exam je n'ai pas eu le temps de les tester.

    Je testerai en début de semaine et vous fais un retour.

    Merci encore

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 38
    Points : 18
    Points
    18
    Par défaut
    Je viens de tester ton code MaitrePylos, ca correspond exactement ce que je voulais.

    Merci à toi et à Dentrite

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/03/2012, 21h03
  2. Réponses: 3
    Dernier message: 17/02/2012, 18h40
  3. [Débutant] problème connexion d'un utilisateur via une requete sql
    Par rikiki123 dans le forum ASP.NET
    Réponses: 5
    Dernier message: 10/11/2011, 10h59
  4. [Débutant] Remplissage d'une listbox via une requete SQL
    Par arngrimur dans le forum ASP.NET
    Réponses: 9
    Dernier message: 26/09/2011, 11h31
  5. Réponses: 2
    Dernier message: 25/05/2009, 15h53

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