Retour à la ligne non pris en compte dans un textarea

Eléphant du PHP | 372 Messages

15 sept. 2015, 21:14

Salut à tous.
Voici le problème.
Mes visiteurs post des commentaires mais les retour à la ligne ne sont pas pris en compte.
J'ai donc ma première partie avec le post du message:
<label>Détail du commentaire</label>
          <textarea class="form-control" rows="8" name="description"><?php echo !empty($_POST['description']) ? $_POST['description'] : NULL; ?></textarea>
          <?php echo !empty($erreurs['description']) ? '<div class="alert alert-danger" role="alert"><i class="fa fa-exclamation-triangle"></i>' .$erreurs['description'].'</div>' : NULL;?>
Et une page ou je l'affiche:
<p><?php if($ligne['description'] == NULL) { echo "Non renseigné";} else {echo stripslashes($ligne['description']);}?></p>

Mammouth du PHP | 2703 Messages

15 sept. 2015, 22:27


Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 sept. 2015, 09:34

En complément de la réponse d'Or1 et pour être un peu plus explicite quant au problème que tu rencontres : les retours à la ligne saisis par l'utilisateur sont bien présent. Le problème c'est que le navigateur ne les interprète pas et ne les restitue donc pas à l'écran.

Pour obliger le navigateur à afficher un retour à la ligne, il faut utiliser la balise html <br> (ou <br /> en xhtml). La fonction nl2br() de php va ajouter cette balise à chaque fois qu'il rencontre un retour à la ligne dans le texte passé en paramètre. Tu pourras ainsi obtenir le résultat souhaité à l'écran :)

Nota : cette fonction ne devrait être utilisée que pour l'affichage sur le navigateur. Si tu enregistres la données en base, enregistre les retours chariots sans balises. Ainsi si un jour tu as besoin de t'en servir pour autre chose qu'un affichage html (un pdf, un export csv, ...) tu ne seras pas pollué par des balises html :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 7 Messages

16 sept. 2015, 17:10

Nota : cette fonction ne devrait être utilisée que pour l'affichage sur le navigateur. Si tu enregistres la données en base, enregistre les retours chariots sans balises. Ainsi si un jour tu as besoin de t'en servir pour autre chose qu'un affichage html (un pdf, un export csv, ...) tu ne seras pas pollué par des balises html :)
Du coup moi j'ai une question, si on affiche le textearea dans un navigateur mais qu'on l'a aussi dans la base de données on fait comment ? merci !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 sept. 2015, 13:25

Dans ce cas, le mieux est d'utiliser la fonction nl2br() uniquement lors de l'affichage de la variable sans altérer le contenu de celle-ci.

Tu stockes ainsi ta variable en base sans les balises html, et dès le moment où tu as besoin d'afficher la donnée sur un navigateur tu fais appel à nl2br :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 7 Messages

17 sept. 2015, 14:56

Je prends un exemple concret je fais un site dans lequel on peut donner des avis dans un textearea, donc en fait je prend la variable $avis que je met dans un nl2br ou c'est quand j'affiche cette variable que je dois la mettre ? merci je suis nouveau donc un peu perdu ^^

Mammouth du PHP | 2703 Messages

17 sept. 2015, 15:04

textarea -> sauvegarde de l'avis, pas de nl2br
affichage de l'avis dans une page html -> ajout de nl2br
un bouton pour modifier son avis, donc affichage de l'avis déjà rentré dans un textarea, pas de nl2br

si, lors de la sauvegarde, un nl2br avait été ajouté, ce dernier cas aurait posé problème.