8791 sujets

Développement web côté serveur, CMS

Bonjour,


Alors, je vais d'abord expliquer sans le code car à mon lieu de stage, sur mon portable, je dois tout transférer sur mon DD externe pour remettre ça sur le pc connecté au net, etc. et je me dis que le problème ne vient pas forcément du code mais plutôt de la logique, une fonction à ajouter peut-être...


1) J'utilise un éditeur de texte, FCKeditor, pour être précis.

2) Mon site contient des articles qui seront donc modifiables par des membres à travers l'éditeur de texte.

3) Le texte de chaque article est stocké dans une base de données dans une table et porte le nom de arch_texte en varchar(9999) et utf8_unicode_ci.

4) Dans un premier temps, le texte peut venir d'une source diverse et est donc rentré tel quel dans la base de données... Du texte brut quoi.

5) J'appuie sur le bouton -modifier- sur ma page html qui me dirige donc vers une page "Modification_page" qui contient l'éditeur de texte.

6) Là, je modifie le texte, rajoute du gras, fait une belle mise en forme... Et je valide.

7) C'est là qu'est le problème... Le texte se modifie bien dans la base de données mais comme il est brut, il indique également les balises générées par FCKeditor. Dès lors, mon article contient également ces balises mais ne les applique pas, ce qui donne par exemple : <p>Voici un char</p>

Est-ce qu'une fonction peut transformer ce texte brut de la base de données en texte html, ce qui donnerait donc un article avec la mise en forme voulue ?


Voilà, j'espère avoir été précis, merci Smiley smile
Modifié par BassT4ken (21 Apr 2009 - 15:22)
En gros, comment afficher : Problème lorsque dans le champ de ma base de données, il y a : <b>Problème</b>

En ce moment, ma page html affiche <b>problème</b>

Voici un exemple concret Smiley cligne
Modifié par BassT4ken (20 Apr 2009 - 16:06)
Salut,

BassT4ken a écrit :
3) Le texte de chaque article est stocké dans une base de données dans une table et porte le nom de arch_texte en varchar(9999)
Ce qui est une erreur puisque varchar ne peut pas dépasser 255 de long. (Re)lire mysql : les types chaînes.

BassT4ken a écrit :
7) C'est là qu'est le problème... Le texte se modifie bien dans la base de données mais comme il est brut, il indique également les balises générées par FCKeditor. Dès lors, mon article contient également ces balises mais ne les applique pas, ce qui donne par exemple : <p>Voici un char</p>
Eh bien c'est l'idéal... Smiley rolleyes
BassT4ken a écrit :
En gros, comment afficher : Problème lorsque dans le champ de ma base de données, il y a : <b>Problème</b>

En ce moment, ma page html affiche <b>problème</b>
Ah OK... dans ce cas (puisque visiblement FCKeditor ne le fait pas automatiquement) il faut convertir cet espèce de BBCode en vrai code html... par exemple en <strong>Problème</strong>

Pour cela il faut regarder du côté des expressions régulières (avec par exemple preg_replace).
Modifié par Heyoan (20 Apr 2009 - 16:14)
Salut,

j'ai fais plusieurs fois la même manip' avec tinyMCE et je n'ai jamais eu ce soucis. De souvenir, FCK editor est monstrueusement lourd (maintenant je sais pas Smiley cligne ).

Sinon, il faut zyeuter un peu la documentation. Par exemple : HtmlEncodeOutput .
Modifié par bzh (20 Apr 2009 - 17:34)
Merci pour les réponses Smiley cligne

Heyoan a écrit :
Ah OK... dans ce cas (puisque visiblement FCKeditor ne le fait pas automatiquement) il faut convertir cet espèce de BBCode en vrai code html... par exemple en <strong>Problème</strong>

Pour cela il faut regarder du côté des expressions régulières (avec par exemple preg_replace).


Hmm, en disant qu'il met <b> </b>, c'est une erreur de ma part...
Je viens d'écrire un exemple d'article avec toutes sortes de caractéristiques et je copie colle ce qu'il m'a mis dans la page article.

<p>Ca ne <strong>fonctionne</strong> <em>toujours</em> <span style="font-size: smaller;">pas</span> pffff Smiley decu lol</p>

Le problème est qu'il l'enregistre tel quel dans la base de données et que lorsque je fais ma requête Select, il sort ce code mais n'applique pas les balises... Donc, il n'a pas l'air de comprendre le html et sort le texte en brut. Et c'est pour ça que je me demandais si il n'y avait pas une fonction qui permet de comprendre ces balises html et de les appliquer.


Harold2009 a écrit :
Tu peux mettre ta ligne de code pour lire la variable stp?


Voici le code des 2 pages importantes. La page article et la page modification article ; Peut-être faudrait-il que je mette la modification dans la page d'article avec comme condition d'appuyer sur "modifier" pour pouvoir rentrer dans l'éditeur de texte... J'y réfléchirai.


La page de modification d'article "modification_page.php"
<?php 

// Titre de la page affichée
$page_title = 'Modification';

// Tableau contenant les fichiers css à inclure sur la page
//$css = array('accueil.css');

// Header de la page
include ROOT.'Common/header.php';

// Intégration éditeur
include_once("./fckeditor/fckeditor.php");

?>

<?php
if(isset($_POST['submit_form']) && ($_POST['submit_form'] == 1))
{
	$data = mysql_real_escape_string($_POST['FCKeditor1']);
	$res = mysql_query("UPDATE archive SET arch_texte = '$data' WHERE arch_page_id = 5");

	if(!$res)
		die("Error saving the record ! Mysql said:".mysql_error());
	
}

$query = mysql_query("SELECT arch_texte FROM archive WHERE arch_page_id = 5");
$data = mysql_fetch_array($query);

?>

<div id="page">	
<h3 style="text-align:center">Modification de l'article</h3>

<form method="post" action="index.php?page=modification_page">
<?php
$oFCKeditor = new FCKeditor('FCKeditor1') ;
$oFCKeditor->BasePath = './fckeditor/' ;
$oFCKeditor->Value = $data["arch_texte"];
$oFCKeditor->Height = 400;
echo $oFCKeditor->CreateHtml() ;
?>
<br>
<input type="hidden" name="submit_form" value="1"/>
<input type="submit" value="Save Form" />
</form>



</div>






La page article, ici : aiv.php

<?php 

// Titre de la page affichée
$page_title = 'aiv';

// Tableau contenant les fichiers css à inclure sur la page
//$css = array('accueil.css');

// Header de la page
include ROOT.'Common/header.php';

?>


<?php

	
	$query = "SELECT * FROM page, utilisateur, archive, image
	where page_titre='A.I.V.'
	and page.page_user_id=utilisateur.user_id
	and page.page_id=archive.arch_page_id
	and page.page_id=image.img_page_id
	";
	
	$reponse = mysql_query($query);
	
	$donnee = mysql_fetch_array($reponse);
	
?>		


<div id="page">	
	<form method="post" class="sommaire">
		<fieldset>
			<legend>Sommaire</legend>
			<p><label><a href="#haut"> Haut</a></label></p>
			<p><label><a href="#milieu"> Milieu</a></label></p>
			<p><label><a href="#bas"> Bas</a></label></p>
			<p><label><a href="index.php?page=quiz&amp;q=<?php echo $donnee['page_id']; ?>"> Quizz</a></label></p>
		</fieldset>
	</form>

	<div id="cadre_page">
		<div id="cadre2_page">
			<span class="titre_article">Caractéristiques</span>
		</div>
		
		<a href="<?php echo $donnee['img_lien'];?>"><img border=0 src="<?php echo $donnee['img_lien'];?>"></a>
		
		<div class="cadre_texte_caract1"><span class="texte_caract1">Information</span></div>
		<div class="cadre_texte_caract2"><span class="texte_caract2">Type</span></div>
		<div class="cadre_texte_caract3"><span class="texte_caract3">Char</span></div>
		<div class="cadre_texte_caract2"><span class="texte_caract2">Pneumatique</span></div>
		<div class="cadre_texte_caract3"><span class="texte_caract3">Roue</span></div>
		<div class="cadre_texte_caract2"><span class="texte_caract2">Standarplatform</span></div>
		<div class="cadre_texte_caract3"><span class="texte_caract3">16500kg</span></div>
		<div class="cadre_texte_caract2"><span class="texte_caract2">MCW</span></div>
		<div class="cadre_texte_caract3"><span class="texte_caract3">22000kg</span></div>
		<div class="cadre_texte_caract1"><span class="texte_caract1">Lieu</span></div>
		<div class="cadre_texte_caract2"><span class="texte_caract2">Armée</span></div>
		<div class="cadre_texte_caract3"><span class="texte_caract3">Belge</span></div>
		
	</div> 
	<div id="text_page">
		<a id="haut"></a>
		<h1><u><br><?php echo show($donnee['page_titre']);?></u></h1><p style="font-size:xx-small,color:black"><a href="index.php?page=modification_page">[Modifier]</a></p>

		<p>
			<?php echo show($donnee['arch_texte']);?>
			<a id="milieu"></a>
		</p>
	</div>
	
<br>	
<?php 
while($don = mysql_fetch_array($reponse))
	{?>
	<br><br>	
	<b>Image:</b>
	<br><br>
	<img width="280" height="200" src="<?php echo $don['img_lien'];?>"><br>
	<?php echo show($don['img_description']);?>&nbsp:&nbsp
	<?php echo show($don['img_nom']);
	}?>
<a id="bas"></a>

</div>





En attendant, je vais checker la doc Smiley cligne
Modifié par BassT4ken (21 Apr 2009 - 09:28)
BassT4ken a écrit :
Je viens d'écrire un exemple d'article avec toutes sortes de caractéristiques et je copie colle ce qu'il m'a mis dans la page article.

<p>Ca ne <strong>fonctionne</strong> <em>toujours</em> <span style="font-size: smaller;">pas</span> pffff Smiley decu lol</p>

Le problème est qu'il l'enregistre tel quel dans la base de données et que lorsque je fais ma requête Select, il sort ce code mais n'applique pas les balises...
Ben alors il faudrait voir le code source de la page html générée... Peut-être que cela est fait dans la fonction show dont tu n'as pas donné le code : est-ce que les caractères < et > sont transformés en &lt; et &gt; ou autre...
Je pense aussi que tes caractères sont enregistrés sous forme d'entités. Ce qui est logique d'un point de vue sécurité, le formulaire n'étant pas forcément privé.

Note que ça peut aussi venir de là : ProcessHTMLEntities
Modifié par bzh (21 Apr 2009 - 13:26)
bzh a écrit :
Je pense aussi que tes caractères sont enregistrés sous forme d'entités. Ce qui est logique d'un point de vue sécurité, le formulaire n'étant pas forcément privé.
Ben je n'ai vu qu'un mysql_real_escape_string... Smiley murf
Heyoan a écrit :
Ben alors il faudrait voir le code source de la page html générée... Peut-être que cela est fait dans la fonction show dont tu n'as pas donné le code : est-ce que les caractères < et > sont transformés en &lt; et &gt; ou autre...



Voici le plus intéressant je pense dans le code de l'article.

<?php

	
	$query = "SELECT * FROM page, utilisateur, archive, image
	where page_titre='A.I.V.'
	and page.page_user_id=utilisateur.user_id
	and page.page_id=archive.arch_page_id
	and page.page_id=image.img_page_id
	";
	
	$reponse = mysql_query($query);
	
	$donnee = mysql_fetch_array($reponse);
	
?>	


et un peu plus bas...

<?php echo show($donnee['arch_texte']);?>



Tel quel, ça ne m'affiche pas les < ou > mais lorsque je mets la fonction htmlentities par exemple, là, ça m'affiche &lt; et &gt;
BassT4ken a écrit :
Voici le plus intéressant je pense dans le code de l'article.
Non : ce qui serait intéressant c'est de voir la function show...

BassT4ken a écrit :
Tel quel, ça ne m'affiche pas les < ou > mais lorsque je mets la fonction htmlentities par exemple, là, ça m'affiche &lt; et &gt;
Ben pour que les balises soient interprétées elles ne doivent pas être htmlentitisées Smiley lol !
Heyoan a écrit :
Non : ce qui serait intéressant c'est de voir la function show...

Ben pour que les balises soient interprétées elles ne doivent pas être htmlentitisées Smiley lol !


Oups, désolé, mon collègue travaille avec moi sur ce projet et je n'avais pas pensé à la page des fonctions directement.

La voici :

function show($text)
{
    return htmlspecialchars($text);
}



Pourtant, si je comprends bien, cette fonction doit convertir les caractères spéciaux en entité html et donc il ne devrait pas afficher les balises mais les convertir et donner le rendu attendu... Je me trompe peut-être.
Je viens de tester sans cette fonction show et ça marche impeccable...

Niveau sécurité, c'est pas conseillé, non ?
BassT4ken a écrit :
Niveau sécurité, c'est pas conseillé, non ?
En même temps il faut choisir : soit tu veux interpréter les balises html soit tu ne veux pas. Smiley cligne

Un (bon ?) compromis serait de retravailler ce qui est entré par le visiteur et par exemple de ne pas permettre certaines balises (typiquement <script... ).
cf. Cross site scripting (XSS).