8768 sujets

Développement web côté serveur, CMS

Ceci est surement un problème connu....
j'ai un champ texte dans une base mySql
je charge ce champ dans un textarea dans un formulaire pour l'éditer
je fais des sauts de lignes au clavier dans le textarea, ils apparaissent à l'écran
lorsque je valide le formulaire les sauts de lignes ne sont pas stockés c'est à dire que si je recharge plus tard ce champ dans un div il n'y a plus de saut de lignes.
alors j'ai ensuite utilisé la fonction nl2br juste avant d'enregistrer en BDD et là les saut de lignes
sont respecté en affichage, par contre si j'ouvre le champ dans un textarea les sauts de linges sont affiché <br> dans le texte et ils sont doublés....
bref une histoire de fou..

Comment on fait pour saisir du texte dans un textarea en faisant des sauts de lignes et que ces sauts de lignes soient respectés lorsque l'on affiche ensuite le champ dans un div ou bien dans un paragraphe..

Merci
en cherchant un peu (car j'ai cherché , quand même...) j'ai trouvé sur ce fil une remarque concernant nl2br()

" un nl2br, contrairement à ce que son nom peut laisser penser ne "remplace" pas les retours à la ligne par des balises <br /> mais ajoute ces balises et conserve les retours à la ligne.

Pour revenir en arrière, il suffit donc juste de supprimer les <br/> qui ont été ajoutés, sans quoi tu risques de doubler tous tes retours à la ligne Smiley smile
"

cela veut dire qu'il faudrait effacer les<br> ??? avant de réafficher ?
Modérateur
Bonjour,

Par défaut, dans une balise "textarea", les sauts de ligne sont des retours à la ligne comme on en a en utilisant un traitement de texte.

Quand tu enregistres le contenu de ton "textarea" dans une base de données, les sauts de lignes sont en principe conservés (on a rien à faire de spécial).

Par contre, quand tu récupères ce que tu as stocké dans ta base de données pour l'afficher dans une balise html qui n'est pas un textarea, c'est là qu'il faut utiliser nl2br().

Amicalement,
Modifié par parsimonhi (26 Jul 2020 - 20:29)
parsimonhi a écrit :
Bonjour,

Par contre, quand tu récupères ce que tu as stocké dans ta base de données pour l'afficher dans une balise html qui n'est pas un textarea, c'est là qu'il faut utiliser nl2br().
Amicalement,


ah .. tiens tien en fait c'est au moment d'afficher qu'il faut utiliser nl2br ??? moi je l'utilisais au moment de sauvegarder en base de données, c'est peut-être pour ça que ça marche mal, je vais refaire des essais, merci
ça marche pas, ça fait 4H que ça me rend fou cette affaire, ça m'a même pourri ma digestion...

même en mettant nl2br au moment d'afficher, ça cumule les <br> tout seul

j'ai fait une maquette pour le montrer.
J'affiche un champ de la table dans le textarea, je créé un saut de ligne au milieu du texte et je valide, le champ se recharge dans le textarea et le saut de ligne est affiché <br> dans le textarea et c'est un vrai saut de ligne dans le <div>
Par contre si je valide le formulaire plusieurs fois sans rien modifier il me rajoute un <br> supplémentaire à chaque fois

example: "omnis est nobis laboriosam reiciendis possimus eius praesentium commodi quos,<br /><br /><br /><br /><br /><br /><br /><br />
8888888888 kkkkkkperferendis rem ullam asperiores debiti "

création de la table


CREATE TABLE IF NOT EXISTS `semaine_messages` (
  `id_message` int(11) NOT NULL AUTO_INCREMENT,
  `id_message_sender` int(11) NOT NULL,
  `id_message_receiver` int(11) NOT NULL,
  `message_content` text NOT NULL,
  `toggle` tinyint(4) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id_message`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;


code php en début du fichier php


<?php

try {

	$db = new PDO('mysql:host=localhost;dbname=votre-BDD', 'user', 'password',array(
			PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES UTF8',
			PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING 
			));

	} catch (PDOException $e) {
		echo $e->getMessage();	
	}


if (isset($_POST['valid'])):  
	$data= array(
		'id' => 6,
		'message' => $_POST['edit-message']
		);

	$sql_update = "UPDATE semaine_messages SET message_content = :message
										WHERE id_message = :id";
	$req_update = $db->prepare($sql_update);
	$req_update->execute($data);
endif;



$sql_test = "SELECT * FROM semaine_messages
												WHERE id_message = 6";
$req_test = $db->prepare($sql_test);
$req_test->execute();
$res_test = $req_test->fetchAll(PDO::FETCH_OBJ);  


?>



partie html, suite su fichier index.php (faut récuperer un bootstrap quelque part)


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
		<link rel="stylesheet" href="css/bootstrap-material-design.min.css">

</head>
<body>
	
	<div class="container mt-5 pt-5">
		<div class="row pt-5">

			<div class="col-6">
				<form method="post" action="">
						  <div class="form-group">
						    <label class="text-warning"><b><i>vous modifiez le message:</i></b></label>
						    <textarea 
						    	class="form-control p-2" 
						    	name="edit-message" 
						    	rows="4"><?php echo nl2br($res_test[0]->message_content); ?></textarea>
						  </div>
						  <button type="submit" id="valid" name="valid" class="btn btn-success">Valider</button>
				</form>
			</div>

			<div class="col-6">
				<?php echo $res_test[0]->message_content; ?>				
			</div>

		</div>
	</div>

</body>
</html>
Modérateur
Bonjour,

Il ne faut pas de nl2br() quand tu écris dans un textarea. Or t'en mets un !!!

Il faut en mettre dans les éléments html genre <div>, <span>, <table>, mais pas dans un <textarea>.

Je l'avais pourtant déjà écrit dans ma première réponse !!! Smiley smile

Amicalement,
Meilleure solution
Ah mais oui, je me disais aussi que ça ne pouvait être qu'un détail à la noix comme ça..

donc ce faisant il ne doit pas sauvegarder les <br> dans la BDD et c'est bien le cas maintenant..

voici un fragment corrigé de ma maquette, merci à toi


			<div class="col-6">
				<form method="post" action="">
						  <div class="form-group edit-message-running">
						    <label for="edit-message-temporaire" class="text-warning"><b><i>vous modifiez le message:</i></b></label>
						    <textarea 
						    	class="form-control p-2" 
						    	name="edit-message" 
						    	rows="4"><?php echo $res_test[0]->message_content; ?></textarea>
						  </div>
						  <button type="submit" id="valid" name="valid" class="btn btn-success">Valider</button>
				</form>
			</div>

			<div class="col-6">
				<?php echo nl2br($res_test[0]->message_content); ?>				
			</div>

lionel_css3 a écrit :
Ah mais oui, je me disais aussi que ça ne pouvait être qu'un détail à la noix comme ça..

donc ce faisant il ne doit pas sauvegarder les &lt;br&gt; dans la BDD et c'est bien le cas maintenant..

voici un fragment corrigé de ma maquette, merci à toi


						<div class="col-6">
				<form method="post" action="">
						  <div class="form-group edit-message-running">
						    <label for="edit-message-temporaire" class="text-warning"><b><i>vous modifiez le message:</i></b></label>
						    <textarea 
						    	class="form-control p-2" 
						    	name="edit-message" 
						    	rows="4"><?php echo $res_test[0]->message_content; ?></textarea>
						  </div>
						  <button type="submit" id="valid" name="valid" class="btn btn-success">Valider</button>
				</form>
			</div>

			<div class="col-6">
				<?php echo nl2br($res_test[0]->message_content); ?>				
			</div>


Ah oui, question idiote, j'affiche le contenu du champ avec Javascript.... il y a t-il un équivalent de la fonction nl2br() en JS ?????
Alors Super, j'ai trouvé sur le net un équivalent nl2br en Javascript et maintenant ça marche nickel, je peux saisir sur plusieurs lignes dans le textarea et ça s'affiche ok dans les élément html


	function nl2br (str, is_xhtml) {
	    if (typeof str === 'undefined' || str === null) {
	        return '';
	    }
	    var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
	    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1' + breakTag + '$2');
	}

Modérateur
Bonjour,

J'utilise ça juste avant affichage dans le html (ça remplace les retours à la ligne par des <br>, ça ne les conserve pas, mais comme c'est juste avant affichage dans le html, en général, ça n'a aucune importance) :
var nl2br=function(s)
{
	return (s+'').replace(/\r\n|\n\r|\r|\n/g,'<br>');
};

Amicalement,
Modérateur
Bonjour,

lionel_css3 a écrit :
Alors Super, j'ai trouvé sur le net un équivalent nl2br en Javascript et maintenant ça marche nickel

Oui, ça aussi, c'est bien, et c'est un peu plus parfait que ce que je t'ai proposé. Smiley smile

Amicalement,
parsimonhi a écrit :
Bonjour,

J'utilise ça juste avant affichage dans le html (ça remplace les retours à la ligne par des &lt;br&gt;, ça ne les conserve pas, mais comme c'est juste avant affichage dans le html, en général, ça n'a aucune importance) :
var nl2br=function(s)
{
	return (s+'').replace(/\r\n|\n\r|\r|\n/g,'&lt;br&gt;');
};

Amicalement,


ah merci à toi, j'y réfléchirai demain matin à tête reposée car là j'étais au bord du pétage de plomb car si je voulais ré entrer de suite en édition après une édition préalable du champ il me remettait des <br> dans le textarea.

j'ai donc trouvé une fonction javascript de nettoyage du genre


textAfter =  textBefore.replace(/<br\s*[\/]?>/gi, "");

dans le cas où je devrais remettre (avec ajax et Js) du contenu (qui a subit la fonction nl2br equiv. Js) dans un textarea

et maintenant ça semble marcher...