[Résolu] Notice: Uninitialized string offset:

Eléphant du PHP | 84 Messages

12 nov. 2005, 19:30

Bonjour,

J'utilise le code ci-dessous pour tronquer des commentaires dont le nombre de caractères est superieur ou égal à 100.

Code : Tout sélectionner

/* On met en forme le commentaire avant l'affichage */ $Maxi = 100; $texte =''; $nbr_caracteres = strlen($Commentaire); if( $nbr_caracteres >= $Maxi) { $i=0; while ($i <= $Maxi) { $texte.= $Commentaire[$i]; $i++; } $texte.= '...'; } else { $texte = $Commentaire; }
Mais php renvoie:
Notice: Uninitialized string offset: 100 in /home/.../fichier.php on line 47

ce qui correspond à la ligne de code :
$texte.= $Commentaire[$i];

Comment eviter cette Notice?
Modifié en dernier par zouetchou le 13 nov. 2005, 02:04, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

12 nov. 2005, 21:35

Salut change cette boucle
while ($i <= $Maxi)
par
while ($i < $Maxi)
tu déppase le nombre de caractères

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 84 Messages

13 nov. 2005, 02:04

Ok merci :wink:

Mammouth du PHP | 19672 Messages

13 nov. 2005, 10:14

On peut peut-être simplifier:
/* On met en forme le commentaire avant l'affichage */
         $Maxi = 100;
         $texte ='';
         
         $nbr_caracteres = strlen($Commentaire);
         
         $texte = ( $nbr_caracteres > $Maxi) ? substr($Commentaire, 0, $Maxi) ."..." : $Commentaire;
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 84 Messages

13 nov. 2005, 15:31

Merci.

Puis-je avoir une explication sur ce code ?

Mammouth du PHP | 19672 Messages

13 nov. 2005, 15:43

:D C'est drôle, je l'attendais presque cette question...

BOn, la première chose, c'est qu'au lieu de m'amuser à compter les caractères de la chaine dans une boucle, j'utilise une fonction native de PHP : substr() qui me permet d'extraire une portion de chaine selon les paramètres envoyés. (Suis le lien vers la doc qui ne sera pas moins claire que moi sur les détails de cette fonction.

La seconde chose que j'ai utilisée s'appelle un opérateur ternaire :

Code : Tout sélectionner

$var = ($condition) ? "valeur 1" : "valeur 2";
C'est une manière différente d.écrire ceci:

Code : Tout sélectionner

if($condition == true) { $var = "valeur 1"; } else { $var = "valeur 2"; }
C'est strictement la même chose, mais l'opérateur ternaire se fait ici sur 1 ligne au lieu de 8 :) Ce qui suit le "?" est la valeur attribuée si la condition testée retourne "TRUE"; le ":" fait office de "else" et la seconde valeur proposée sera attribuée si le scondition testée retourne "FALSE"
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 84 Messages

13 nov. 2005, 15:53

Super Merci :D
En plus le traitement est plus rapide :wink: