Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2011, 20h36   #1
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
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 :
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 :
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>";
 
	}
 
 
?>
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 17h19   #2
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
Salut,

on appelle une fonction comme ça :
Code :
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 :
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>";
 
}
?>
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 20h28   #3
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
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 !
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 21h26   #4
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
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 :
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 :
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']
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 21h46   #5
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
L'erreur est à ce niveau là

Code :
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 ?
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 08h16   #6
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
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 :
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.
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h00   #7
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
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 :
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 :
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
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h08   #8
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
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 : 951
Points : 1 063
Points : 1 063
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.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h11   #9
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
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 :
1
2

$sql="SELECT n.`id`, n.`titre`, LEFT(n.`contenu`, 50) AS contenu_tronque, ...
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h11   #10
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
C'est celle avec la limite justement.

Les voilà
Code :
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 !
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h21   #11
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
Citation:
Envoyé par polux31 Voir le message
C'est celle avec la limite justement.

Les voilà
Code :
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...
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h23   #12
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
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
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h25   #13
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
désolé, je me suis un peu emporté
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h29   #14
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
Tu n'as pas à t'excuser vu l'aide que tu m'apportes
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h30   #15
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
tes news c'est que du texte y'a pas de HTML ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h36   #16
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
Oui je n'ai que du texte
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h46   #17
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
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 :
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++
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h58   #18
Nouveau Membre du Club
 
Inscription : juillet 2010
Messages : 196
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 196
Points : 25
Points : 25
J'utilise notepad ++.
Je continue à chercher et a essayer de comprendre et trouver la solution...
polux31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 11h03   #19
Membre du Club
 
Inscription : mars 2007
Messages : 51
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 51
Points : 42
Points : 42
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 :
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;
christoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 11h07   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 :
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h55.


 
 
 
 
Partenaires

Hébergement Web