Bonjour a tous !
J'ai un probleme avec un forum que j'ai créer :
Voici le script :

<?php
// Connexion a la base de données
//Récupération des données
$sql = "SELECT * FROM livre_or";
$req = mysql_query($sql) or die("Erreur a la ligne ". __LINE__."<br />Erreur mysql :".mysql_error());
while($data = mysql_fetch_assoc($req)){
echo $data'pseudo'].' : '.$data'message'].'<br />';
}
?>

Ici sa marche , mais ce n'est pas protéger , et si je le protège avec un htmlentities , mon Bbcode ne marche pas

J'aimerais de l'aide S.V.P

8 réponses


tottosche
Réponse acceptée

Comme l'à dit Guilhem, c'est plus interessant de faire:

Enregistrer le message tel quel (après avoir bien entendu echapper les caractere délicat avec mysql_real_escape_string() )
Sortir le contenu de la BDD en convertissant les balise html (avec htmlentities() )
Convertir avec ton tableau BBCode

Cette solution requiere une grande prudence car a chaque sortie de BDD il faudra TOUJOURS vérifier que tu a bien convertis les balise html mais au moins ça te permet une plus grande flexibilité car tu auras le texte tel quel que l'utilisateur a deposer

<u><strong>Pour résumer:</strong></u>

Tu a ta page form, je pense que je n'ai pas besoin de te montrer un code pour

Ensuite tu a ta page qui reçoit le contenu de ton form (ça peut etre la même que celle du form ou une autre tt dépend de la valeur d' action de ton form

Voila comment je traiterais l'info:

<?php 
$pseudo = mysql_real_escape_string($_POST'pseudo']);
$message = mysql_real_escape_string($_POST'msg']); 
$sql = "INSERT INTO livre_or(pseudo,message,ip) VALUES('$pseudo','$message','".$_SERVER'REMOTE_ADDR']."')";
mysql_query($sql);  
?>

Ensuite pour ta sortie de BDD regardes le message précedent et change juste les valeurs des index de tableau pour faire correspondre a ton cas et peut être que tu va devoir convertir les caractère new line en balise br donc si tu n'as pas de retour a la ligne, tu va devoir utiliser la fonction nl2br()

Là tu affiches le pseudo et le contenu c'est tout..

Oui , mais quand le visiteur poste ces messages en BBcode , je ne peux pas les protéger .
Voici le code que j'avais mis (avant avoir mis le BBcode)

<?php
// Connexion a la base de données
//Récupération des données
$sql = "SELECT * FROM livre_or";
$req = mysql_query($sql) or die("Erreur a la ligne ". __LINE__."<br />Erreur mysql :".mysql_error());
while($data = mysql_fetch_assoc($req)){
echo htmlentities($data'pseudo']).' : '.htmlentities($data'message']).'<br />';
}
?>

Mais comme sa , le visiteur ne peut pas souligner son texte etc.. Vu que c'est du html .
Je ne sais pas si vous m'avez compris
P.S : Je me suis tromper , c'est pas un forum , c'est un livre d'or ^^

Mais tu as mis le code de conversion du "BBCODE => html" avant de récupérer les données ?

Voici mon code :

<form action="#" method="post">
<!-- Code du formulaire : -->
Pseudo : <input type="text" name="pseudo" /><br />
Message : <br />
<textarea name="msg"></textarea>
</form>

<?php
// insertion dans la base de données
if(isset($_POST) && !empty($_POST'pseudo']) && !empty($_POST'msg'])){
$message = $_POST'msg'];
$conv = array(
  '\[gras\](.*)\\/gras\]'=>'<strong>$1</strong>',
  '\[italique\](.*)\\/gras\]'=>'<em>$1</em>',
  '\[lien:(.*)\](.*)\\/lien\]'=>'<a href=$1>$2</a>'
);
foreach($conv as $cle=>$val){
$message = preg_replace("/".$cle."/",$val,$message);
}
mysql_connect('localhost','root','');
mysql_select_db('mon_site');
$sql = "INSERT INTO livre_or(pseudo,message,ip) VALUES('".$_POST'pseudo']."','$message','".$_SERVER'REMOTE_ADDR']."')";
$req = mysql_query($sql);
}
?>

Voila , et quand je ne protège pas les message avec htmlentities , sa marche , mais si je protège , sa ne marche pas =(
Je ne sais pas comment faire , mais je pense qu'il faut faire une expression régulière a l'affichage des message , je me trompe ?

La tu fais la conversion avant l'insertion, tu peux, et ça serai peut être plus simple de ne pas faire la conversion dans le formulaire d'ajout, mais a l'affichage. Après question de gout je suppose. Mais peut être que ça marcherai...

Oui je pense aussi , mais je ne vois pas trop comment faire pour trier les bons commentaires (laisser avec le Bbcode) et les mauvais (les "pirate" qui veulent me balancer un script)

Pourrais tu me mettre sur une piste Silteplait ?

Pour mon script j'ai enregistrer les balises tel quel dans la BDD. CAD, (C'est-à-dire) "****" etc... . Ensuite dans l'affichage ça donne: [code]<?php $conv = array(
'[b](.?)[\/b]' => ' $1', '[i](.*?)[\/i]' => '$1', '[u](.*?)[\/u]' => '<u>$1</u>', '[img](.*?)[\/img]' => ' ', '[url=([^]]*)](.\)[\/url]' => ' $2', ); ?><?php mysql_connect("localhost"," ****","***");
mysql_select_db(" ****");
$sql="SELECT * FROM articles_s ORDER BY id_article DESC LIMIT 0,5";
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'
'.mysql_error()); while($data=mysql_fetch_assoc($req)){ echo "{$data["nom_article"]}"; $data["contenu_art"] = htmlentities($data["contenu_art"],ENT_NOQUOTES,'UTF-8'); foreach($conv as $k=>$v){ $data["contenu_art"] = preg_replace('/'.$k.'/',$v,$data["contenu_art"]); } echo "

{$data["contenu_art"]}
"; } ?>[/code]