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

Langage PHP Discussion :

Problème tronquage news


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut Problème tronquage news
    Bonjour,
    j'écris ici vu que ma question n'a plus rien à voir avec mon problème initial.
    J'aimerais tronquer une partie de ma news afin que cela soit plus présentable qui s'ouvrirait ensuite lorsque je clique dessus.
    Voila un exemple concret : http://www.footmercato.net/

    News tronquée et quand on clic dessus on a la news en intégralité.

    J'ai créé une fonction pour cela :

    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
    function Tronquer_Texte($texte, $longeur_max) {
     
        if (strlen($texte) > $longeur_max) {
     
          $texte = substr($texte, 0, $longeur_max);
     
          $dernier_espace = strrpos($texte, "");
     
          $texte = substr($texte, 0, $dernier_espace)."<br><a href='adresse.html'>Suite de l'article</a>";
     
        }
     
        return $texte;
     
    }
    Est-elle fonctionnelle ?

    Comment l'utiliser ensuite dans mon code qui est le suivant ?

    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
    						    <?php
    $dossier = 'images/';
    	$sql="SELECT * FROM news order by date desc";
     
    	$req = mysql_query($sql) or die(mysql_error());
    	while($data=mysql_fetch_assoc($req))
    	{
    		$id=$data["id"];
    		$filename=$dossier.$data['image'];
     
    		echo '<img src="'.$filename.'" alt="" />';
    		echo "<p>{$data["titre"]} -- ";
    		echo "<p>{$data["contenu"]} </p>";
    		echo "<p align\"right\">".date("j/n/Y G:i",strtotime($data["date"]))."</p>";;
    		echo "<p><a href=\"formcom.php?id={$data["id"]}\"> Cliquez ici pour ajouter un commentaire </a></p>";
    		$sql="SELECT id FROM comment WHERE news_id={$data["id"]}";
    		$req2 = mysql_query($sql) or die(mysql_error());
    		echo" Commentaire(s) (".mysql_num_rows($req2).")<br><br><br><br><br>";
     
    	}
     
     
    ?>

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Salut,

    on appelle une fonction comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
    function truncate($text){
      return $text;
    }
    echo truncate('bla bla');
    // ou
    $str = truncate('bla bla');
    echo $str;
    ?>
    tu devrais aussi regarder du côté des jointures mysql pour éviter d'effectuer une requête à chaque boucle
    pour toi, ç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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    function Tronquer_Texte($str, $longueurMax = 150, $suffixe = '...'){
        $subString = substr(trim($str), 0, $longueurMax);
        if(strlen($subString) < strlen($str)){
            $pos = strrpos($subString, ' ');
            if($pos !== false){
                $str = substr($subString, 0, $pos);
                $disallowed = array(',', '.', ':');
                $last_char = substr($str, -1, 1);
                if(in_array($last_char, $disallowed)){
                    $str = substr($str, 0, -1);
                }
                $str .= $suffixe;
            }
            else{
                $str = $subString;
            }
        }
        return $str;
    }
     
    $dossier = 'images/';
    $sql="SELECT n.`id`, n.`titre`, n.`contenu`, n.`date`, n.`image`, COUNT(c.`id`) AS nb_comments
    FROM `news` AS n
    LEFT JOIN `comment` AS c ON n.`id` = c.`news_id`
    GROUP BY n.`id`
    ORDER BY n.`date` DESC ;";
    $req = mysql_query($sql) or die(mysql_error());
    while($data=mysql_fetch_assoc($req))
    {
        $id=$data["id"];
        $filename=$dossier.$data['image'];
     
        echo '<img src="'.$filename.'" alt="" />';
        echo "<p>{$data["titre"]} -- ";
        echo "<p>".Tronquer_Texte($data["contenu"],  50)."<br><a href='adresse.html'>Suite de  l'article</a></p>";
        echo "<p align=\"right\">".date("j/n/Y G:i",strtotime($data["date"]))."</p>";
        echo "<p><a href=\"formcom.php?id={$data["id"]}\">  Cliquez ici pour ajouter un commentaire </a></p>";
        echo" Commentaire(s) ({$data["nb_comments"]})<br><br><br><br><br>";
     
    }
    ?>

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Tout d'abord merci à toi.
    J'ai réussis à mettre en œuvre ce que tu expliquais mis à part l'affichage du nombre de commentaires que j'ai gardé comme je le faisais.

    Maintenant que j'ai cela, comment faire pour que lorsque je clique sur lire la suite cela m'ouvre une page avec, en fonction de la news sur laquelle j'aurai cliqué cela ouvre cette news ?
    Comme sur le site cité précédemment ?

    Merci encore !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    si l'affichage du commentaire pose problème, signale nous l'erreur, j'ai fais ça sans vérifier si ça fonctionne.

    sinon pour ce qui est de la page de l'actualité, au lieu de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "<p>".Tronquer_Texte($data["contenu"],  50)."<br><a href='adresse.html'>Suite de  l'article</a></p>";
    tu peux mettre par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "<p>".Tronquer_Texte($data["contenu"],  50)."<br><a href='detail-news.php?id={$data["id"]}'>Suite de  l'article</a></p>";
    puis retrouver la news en question avec son id : $_GET['id']

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    L'erreur est à ce niveau là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo" Commentaire(s) ({$data["nb_comments"]})<br><br><br><br><br>";
    Où on me dit que nb_comments n'existe pas (je ne l'ai pas dans ma bdd donc c'est logique)
    Il faudrait juste que je rajoute un champ nb_comments en int dans ma table news et cela fonctionnerait n'est ce pas ?

    En ce qui concerne la suite j'essaie et je repose pour te dire si je m'en sors !

    Merci beaucoup j'ai bien avancé pour le moment grâce à toi

    EDIT : C'est ok pour pour l'affichage développé des news !
    Il ne reste plus que tu me répondes à ma question pour savoir si je me lance dans la modif même si je pense que c'est ça.

    Puis-je laisser l'affichage du nombre de commentaires comme je l'avais fais quand même ou c'est vraiment moche ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Je confirme, c'est vraiment moche =)

    Imaginons que tu sortes 10 000 résultats sur une page, mysql devra traiter 10 001 requêtes au lieu d'une seule... pouerk


    Donc, l'erreur est au niveau de nb_comments qui est un alias de COUNT(c.`id`), regarde mieux la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT n.`id`, n.`titre`, n.`contenu`, n.`date`, n.`image`, COUNT(c.`id`) AS nb_comments
    FROM `news` AS n
    LEFT JOIN `comment` AS c ON n.`id` = c.`news_id`
    GROUP BY n.`id`
    ORDER BY n.`date` DESC ;
    Chez moi, la requête précédente fonctionne.

    Point de diagnostic sans symptôme, poste donc ici l'erreur retournée par mysql, voire même la structure de tes tables.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Ah oui je n'avais pas fait attention !
    Merci cela fonctionne maintenant !

    J'avais rajouté une limite entre temps car je voulais afficher uniquement un certains nombre de news et ça donnait ç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
    20
    21
     
     
     
    # // on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages
    $sql = 'SELECT count(*) FROM news';  
     
    $resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
    # // on récupère le nombre d'éléments à afficher
    $nb_total = mysql_fetch_array($resultat); 
    # // sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0
    if (!isset($_GET['debut']))
     $_GET['debut'] = 0; 
     
     $nb_affichage_par_page = 3; 
     
     
     
    $dossier = 'images/';
     
    # // Préparation de la requête avec le LIMIT 
    $sql='SELECT id,titre,contenu,date`, n.`image COUNT(id) AS nb_comments FROM news order by date desc LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;

    J'ai donc changé mon code comme cela grâce à ton aide :

    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
    # // on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages
    $sql = 'SELECT count(*) FROM news';  
     
    $resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
    # // on récupère le nombre d'éléments à afficher
    $nb_total = mysql_fetch_array($resultat); 
    # // sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0
    if (!isset($_GET['debut']))
     $_GET['debut'] = 0; 
     
     $nb_affichage_par_page = 3; 
     
     
     
     
     
     
    $dossier = 'images/';
     
    # // Préparation de la requête avec le LIMIT 
    $sql="SELECT n.`id`, n.`titre`, n.`contenu`, n.`date`, n.`image`, COUNT(c.`id`) AS nb_comments
    FROM `news` AS n
    LEFT JOIN `comment` AS c ON n.`id` = c.`news_id`
    GROUP BY n.`id`
    ORDER BY n.`date` DESC
    LIMIT '.$_GET['debut'].','.$nb_affichage_par_page";
    Mais il y a une erreur de syntaxe à la limite sinon le reste fonctionne.
    Plus précisement voilà l'erreur

    Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in F:\EasyPHP 3.0\www\psg test\index.php on line 140

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    quelles sont les lignes 140 ou 139?

    pour tronquer ton texte, tu aurais pu utiliser une méthode qui fonctionne sur les mots et pas sur les lettres... ça te laisse des mots complets dans ton extrait.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    c'est au niveau de ta clause LIMIT, la syntaxe est foireuse
    http://www.php.net/manual/fr/language.types.string.php

    ha oui et tu peux aussi utiliser la fonction LEFT en mysql pour tronquer ton texte, ça évite de récupérer tout le contenu si tu n'en a pas besoin, mais c'est moins joli que la fonction que je t'ai refilé précédemment..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    
    $sql="SELECT n.`id`, n.`titre`, LEFT(n.`contenu`, 50) AS contenu_tronque, ...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    C'est celle avec la limite justement.

    Les voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ORDER BY n.`date` DESC
    LIMIT '.$_GET['debut'].','.$nb_affichage_par_page";
    EDIT : pour la mise en place du troncage avec des lettres et pas des mots c'est compliqué à mettre en place ?
    Tu peux m'y aider ?

    Merci d'avance !

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par polux31 Voir le message
    C'est celle avec la limite justement.

    Les voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ORDER BY n.`date` DESC
    LIMIT '.$_GET['debut'].','.$nb_affichage_par_page";
    hop hop ! tout cuit dans la bouche
    fais au moins l'effort de cliquer sur les liens que je te donne...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Je répondais à la question de la personne précédente
    Je suis en train de lire ce que tu m'as donné et d'essayer de le comprendre

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    désolé, je me suis un peu emporté

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Tu n'as pas à t'excuser vu l'aide que tu m'apportes

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    tes news c'est que du texte y'a pas de HTML ?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    Oui je n'ai que du texte

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par polux31 Voir le message
    Je suis en train de lire ce que tu m'as donné et d'essayer de le comprendre
    Quelques exemples :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    echo 'texte non interprété par PHP, impossible de mettre tel quel des $variables. Il faut échapper les caractères \' et \\';
    
    $var = 'fonctionne';
    echo "Texte interprété par PHP, là ça $var. Il faut échapper les caractères suivants : \" \$ et le caractère d'échappement \\ ";
    
    $var1 = 'concatenation';
    $var2 = 'chose';
    echo 'Pour la ' . $var1 . ', c\'est la ' . "même $var2";
    ?>
    Quel éditeur de texte utilises tu ? ça aurait dû clocher avec la coloration syntaxique...
    [edit]ha non, ça passe bien[/edit]
    J'utilise et recommande notepad++

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 196
    Points : 53
    Points
    53
    Par défaut
    J'utilise notepad ++.
    Je continue à chercher et a essayer de comprendre et trouver la solution...

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 52
    Points : 54
    Points
    54
    Par défaut
    En général, je te conseille d'adopter cette convention :

    html -> guillemet double : <tag attr="value">
    php -> apostrophe : $str = 'chaine '. $var .' chaine';

    ça évite les confusions et fait gagner du temps (négligeable) à PHP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql='SELECT n.`id`, n.`titre`, n.`contenu`, n.`date`, n.`image`, COUNT(c.`id`) AS nb_comments
    FROM `news` AS n
    LEFT JOIN `comment` AS c ON n.`id` = c.`news_id`
    GROUP BY n.`id`
    ORDER BY n.`date` DESC
    LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par christoff Voir le message
    En général, je te conseille d'adopter cette convention :

    html -> guillemet double : <tag attr="value">
    php -> apostrophe : $str = 'chaine '. $var .' chaine';

    ça évite les confusions et fait gagner du temps (négligeable) à PHP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sql='SELECT n.`id`, n.`titre`, n.`contenu`, n.`date`, n.`image`, COUNT(c.`id`) AS nb_comments
    FROM `news` AS n
    LEFT JOIN `comment` AS c ON n.`id` = c.`news_id`
    GROUP BY n.`id`
    ORDER BY n.`date` DESC
    LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;
    et pas oublier de protéger les valeurs la aussi

Discussions similaires

  1. Problème pagination news
    Par valpirl dans le forum Langage
    Réponses: 3
    Dernier message: 25/03/2010, 11h53
  2. Problème de news
    Par Ella68 dans le forum SharePoint
    Réponses: 2
    Dernier message: 14/02/2008, 10h06
  3. [MySQL] Problème de news
    Par fourgeaud dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/11/2006, 23h16
  4. [Système] Système de news: problème aux commentaires
    Par Maxime33 dans le forum Langage
    Réponses: 7
    Dernier message: 16/06/2006, 13h43
  5. Problème sur script de news :(
    Par Anthos59 dans le forum ASP
    Réponses: 7
    Dernier message: 12/04/2006, 10h42

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