Texte brute ou avec tag dans la base de données ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Texte brute ou avec tag dans la base de données ?

Re: Texte brute ou avec tag dans la base de données ?

par two3d » 04 déc. 2020, 23:45

perso j'ai opté pour le bbcode + la conversion de tous les caractères éligibles en entités HTML, simple et permet d'éviter les injections SQL...

Re: Texte brute ou avec tag dans la base de données ?

par fury_fatal » 27 sept. 2020, 12:27

La fonction nl2br() ne convient que pour les commentaires, car j'ai retiré tout tag html avec strip_tags().

Pour la partie admin (écrire des articles...), on est obligé d'utiliser les titres et gras. Je crois que je suis obligé de garder le html dans la base de données. Certains utilisent le bbcode je crois (mais c'est nul de décoder après pour l'affichage).

J'ai vu aussi que beaucoup d'entreprises utilisent CK Editor pour la partie admin. Cela génère du code html dans la base de données aussi.

Je vais donc opter pour le code html dans la base de données.

Re: Texte brute ou avec tag dans la base de données ?

par or 1 » 25 sept. 2020, 19:50

soit c'est un simple champ texte, alors texte brut en base de données et
echo '<p>'.nl2br($article['content']).'</p>';

soit l'éditeur de texte utilisé produit de l'html pour les titres, le gras ... et il faut sauver le html généré en bdd.

Re: Texte brute ou avec tag dans la base de données ?

par fury_fatal » 25 sept. 2020, 17:04

Oui,
echo '<p>'.nl2br($article['content']).'</p>'; pose problème quand il y a un titre au milieu d'un paragraphe.

Exemple qui va poser problème :

Code : Tout sélectionner

Bonjour ! Un texte de la BDD. <h2>Un texte de la BDD.</h2> Je suis un texte <strong>gras</strong> de la base de données

J'ai donc pensé à créer une fonction :

Code : Tout sélectionner

function addHtmlTags($para) { $clean = nl2br($para); // Remplace saut de ligne par <br /> $clean = str_ireplace('<br />', '<br>', $clean); // Remplace tous les <br /> par <br> $clean = preg_replace("#\n|\r|\t#", "", $clean); // Remplace Nouvelle ligne (\n), Retour-chariot (\r) et Tabulation (\t) par du vide. Cela les efface $clean = preg_replace('/(\>)\s*(\<)/m', '$1$2', $clean); // Supprimer les espaces entre les balises HTML. Exemple: <ul> <li> devient <ul><li> $clean = '<p>'.$clean.'</p>'; // Ajouter <p></p> $clean = str_replace('<br><br><br>', '<br><br>', $clean); // Remplace les <br> en trop $clean = str_replace('<br><br>', '</p><p>', $clean); // Remplace tous les <br><br> par </p><p>. $remplacement = ["<p><h1"=>"<h12", "</h1></p>"=>"</h1>", "<p><h2"=>"<h2", "</h2></p>"=>"</h2>", "<p><h3"=>"<h3", "</h3></p>"=>"</h3>", "<p><h4"=>"<h4", "</h4></p>"=>"</h4>", "<p><h5"=>"<h5", "</h5></p>"=>"</h5>", "<p><h6"=>"<h6", "</h6></p>"=>"</h6>", "<p><ul><br>"=>"<ul>", "<br></ul></p>"=>"</ul>", "<p><ul"=>"<ul", "</ul></p>"=>"</ul>"]; $clean = strtr($clean, $remplacement); // Nettoyage $remplacement = ["<p></p>"=>"", "<p><br>"=>"", "<br><li"=>"<li", "</li><br>"=>"</li>"]; $clean = strtr($clean, $remplacement); // Dernier nettoyage return $clean; }
Je fais un petit test :

Code : Tout sélectionner

$texte = '<h2 class="h2-gr">Un titre</h2> Je suis un texte. <h3 class="h3-gr">Titre 3</h3> <ul> <li>Liste 1</li> <li>Liste 2</li> </ul> <h3 class="h3-gr">Un autre titre</h3> <ul> <li>Liste 3</li> <li>Liste 4</li> <li>Liste 5</li> </ul> Je suis un texte.'; echo addHtmlTags($texte);
Le html généré est bien ce que je désire (j'ai indenté pour une meilleure lecture) :

Code : Tout sélectionner

<h2 class="h2-gr">Un titre</h2> <p>Je suis un texte.</p> <h3 class="h3-gr">Titre 3</h3> <ul> <li>Liste 1</li> <li>Liste 2</li> </ul> <h3 class="h3-gr">Un autre titre</h3> <ul> <li>Liste 3</li> <li>Liste 4</li> <li>Liste 5</li> </ul> <p>Je suis un texte.</p>
Je trouve ma méthode un peu "bricolage". Avez-vous une meilleure méthode ?

Re: Texte brute ou avec tag dans la base de données ?

par or 1 » 25 sept. 2020, 13:39

echo '<p>'.nl2br($article['content']).'</p>';
ne permet pas de gérer un titre, une portion en gras. si cela n'est pas nécessaire, c'est mieux ainsi.

Re: Texte brute ou avec tag dans la base de données ?

par fury_fatal » 25 sept. 2020, 12:25

Oui, je sais, je mets les sauts de ligne et <p>, mais uniquement pour la lecture. Pas dans la base de données.
J'ai toujours fait comme ça :

Dans la base de donnée :

Code : Tout sélectionner

Texte texte. Texte texte. Texte texte.
En php, pour afficher :

Code : Tout sélectionner

echo '<p>'.nl2br($article['content']).'</p>';
Résultat dans le html généré :

Code : Tout sélectionner

<p>Texte texte.<br> <br> Texte texte.<br> <br> Texte texte.</p>
Est-ce la bonne pratique ? Ou il y a mieux ? Comment font la plupart des sites professionnels modernes ?

Re: Texte brute ou avec tag dans la base de données ?

par Spols » 25 sept. 2020, 12:12

Il est de coutume d'utiliser les balise p pour les paragraphes et les balise h1,h2,... pour les titres. on peut utiliser les balises <b> pour l'emphase, mais le style est toujours mieux via le css que en direct.

Point de vue base de donnée, pas de soucis pour y insérer du html mais attention à la sécurité, il ne faudrait pas qu'un utilisateur mal intentionné y insère du javascript.

les CMS de type wordpress ne sont pas les meilleurs exemple de bonne pratique, il doivent souvent s'adapter pour garantir leur fonctionnalités.

Texte brute ou avec tag dans la base de données ?

par fury_fatal » 25 sept. 2020, 12:01

Bonjour,
J'aimerais savoir si de nos jours sur un site moderne, on met du texte brut ou avec code html dans la base de données.

Même dans des tutoriels symphony, on voit souvent ça dans la base de données :

Code : Tout sélectionner

<p>texte text</p> <p>texte texte</p>
J'ai jeté un coup d'oeil dans wordpress, c'est horrible :

Code : Tout sélectionner

<p style="font-size:25px">titre</p> <p>Je teste</p>
Ce que je fais :

Code : Tout sélectionner

texte text <h2>titre h2</h2> texte text <strong>gras</strong>
Moi, je mets du code html uniquement pour les titres et les gras.