Toutes les clefs pour réussir dans le e-commerce

Mes modules Prestashop

mysql_real_escape_string + nl2br = problème

La fonction nl2br n’a  pas d’effet sur les chaînes de caractères enregistrées à l’aide de mysql_real_escape_string dans une base de données. Nous allons voir ici pourquoi ainsi qu’une solution pour récupérer vos sauts de ligne lors de l’affichage.

Tout d’abord, si vous ne connaissez pas encore l’importance d’enregistrer vos informations dans votre base de données en utilisant préalablement mysql_real_escape_string, cet article vous sera d’un grand secours.

Ceci étant dit, supposons que vous ayez un formulaire qui envoie la chaîne de caractères suivante dans votre base de données:



Ligne 1
Ligne 2
Ligne 3


en utilisant mysql_real_escape_string vous obtiendrez en réalité dans votre base de données la chaîne suivante:



Ligne 1\nLigne 2\nLigne 3


Jusque là pas de problème.

Mais si vous désirez récupérer puis afficher cette chaîne de caractères sur votre site il vous faut remplacer les \n qui ne sont pas compris en HTML par des <br /> (qui eux le sont).

Vous allez donc logiquement utiliser la fonction nl2br qui est faite pour ça et voici ce que cela donnera:



Ligne 1\nLigne 2\nLigne 3


Et oui nl2br ne fonctionne pas dans ce cas

Pourquoi ?

Tout simplement parce que dans votre chaîne de caractères les \n sont des caractères comme les autres ils ne sont pas interprétés comme des saut de ligne donc nl2br les ignore.

Pour être plus clair nl2br ne peut ajouter des <br /> que pour une chaîne de ce type:



Ligne 1

Ligne 2

Ligne 3


C’est à dire une chaîne où les \n sont réellement interprétés comme des sauts de ligne.

Si vous avez encore un doute essayez ce bout de code.



$str="Ligne 1\nLigne 2\nLigne 3";

echo nl2br($str); echo "<hr />";

eval('echo nl2br("'.$str .'");');


Vous allez voir s’afficher ceci:



Ligne 1\nLigne 2\nLigne 3
-------------------
Ligne 1
Ligne 2
Ligne 3


Cela prouve bien que tant que les \n ne sont pas interprétés nl2br ne peut les convertir.

La solution

J’ai déjà donné une solution avec eval mais c’est à éviter, car eval est trop gourmand en ressources.
Voici donc ce que je propose:



nl2br(str_replace(array("\\n","\\r"),array("\n",""),$str)));


Cette ligne de code va supprimer les \r et remplacer les \n non interprétés par des \n interprétés. Nl2br pourra alors faire son travail correctement.

Vous pouvez également utiliser ceci:



str_replace(array("\\n","\\r"),array("<br />",""),$str));


ici le nl2br devient inutile car c’est le str_replace qui s’occupe de faire directement son boulot.

Personnellement je préfère la première méthode qui reste un peu plus logique, mais j’avoue qu’il doit exister une solution plus propre. Si vous avez des idées n’hésitez pas à utiliser les commentaires.

J’espère en tous cas vous avoir aider.

Poster un Commentaire

4 Commentaires sur "mysql_real_escape_string + nl2br = problème"

Recevoir un email pour
avatar
Trier par:   plus récent | plus vieux | Plus de vote
Steph
Invité
Steph

Bonjour,
j’ajouterais aussi, parce que je viens de passer un bon petit moment a chercher le pourquoi du comment, que nl2br ne remplace pas \n par mais ajoute devant \n ! Le \n reste !
Si ca peut en aider certains, c’est expliqué ici http://www.infosprog.com/php/nl2br/ ;)

Alex
Invité
Alex

Est-ce qu’il serait intéressant/utile d’appliquer d’abord le nl2br avant d’enregistrer dans la base mysql (avec évidemment un mysql_real_escape au passage) ?

De cette façon, je suppose qu’on enregistre des tags et pas des \\n dans la DB. non ?

ou bien j’ai loupé un étape ?

Alex
Invité
Alex

Aaah, oui vu comme ça c’est logique. Merci

wpDiscuz