8795 sujets

Développement web côté serveur, CMS

Bonjour à tour,

Je suis coincé dans la réalisation d'un forum par les sauts de ligne.

Je récupère le texte du <TEXTAREA> du visiteur et je le convertis avant de l'intégrer à ma bdd par htmlentities. Si tout marche pour les accents, les sauts de ligne ne sont pas respectés et tout le post est en un sel bloc, tout à la queue leu leu...

Y'à un truc, non ?

Si vous avez une idée...

Merci d'avance.

Cordialement.
Bonjour,

Je croyais (d'après tout ce que j'ai pu lire sur le web à ce sujet) que htmlentities remplaçait (faisait pareil) que htmlspecialchars...

Si j'ai faux, peus-tu m'en indiquer, en 2 mots, les différences?

De toutes façons, je vais essayer.

J'avais trouvé plein de fonctions :

htmlentities
strip_tags
addslashes

mais je dois être un petit esprit parce que je ne percute pas tout à fait. Par exemple, le fait de les combiner, je n'arrive pas à m'imaginer l'ordre et le résultat :



$texte_final = htmlentities(strip_tags(addslashes($variable_texte)));



suivant qu'il s'agisse d'une adresse email, d'un texte de 10 paragraphes, etc...


Le résultat je le vois mais à quoi est-il dû ? A mes fonctions ou au fait que je me trompe depuis le départ ?
Il suffit d'appliquer un nl2br() en sortie :
$texte = nl2br($texte);

Il remplace les sauts de ligne par des <br />. A utiliser donc après la sécurité html :
$texte = nl2br(htmlentities($texte));

Le mieux reste quand même de faire rentrer les données déjà sécurisées (comme tu as fais), puis les récupérer en ayant plus qu'à appliquer le nl2br().
Modifié par Noix de Coco (24 Jan 2009 - 09:58)
Oui, j'avais essayé mais je nj'avais pas pensé à combiner les 2 :

$texte = nl2br(htmlentities($texte));

Je vais essayer ça.

Pour l'instant, je vais aller faire une petite sieste parce que j'y travaille (à mon forum) depuis hier soir à 20 heures... J'ai une panne de paupières.

Dès ma reprise, c'est sûr je l'essaie.

Merci du tuyau.

Cordialement.
Salut,

personnellement je t'invite à utiliser mysql_real_escape_string au moment de l'insertion en base et à garder nl2br(htmlspecialchars($texte)); pour l'affichage.

Pour préciser un peu :
* mysql_real_escape_string va permettre de sauvegarder les données en étant sûr que la requête sera bien exécutée (pas de risque d'injection SQL).
* htmlspecialchars suffit amplement à assurer un bon affichage (notamment pas de balises html inopportunes) alors que htmlentities va même transformer les accents (aucun intérêt).
* je ne vois pas non plus l'intérêt d'utiliser htmlspecialchars avant l'insertion en base puisque cela augmente inutilement la taille des données.
Modifié par Heyoan (24 Jan 2009 - 12:02)
Bonjour,

Quelques heures de sieste et surtout de pannes de courant (je suis dans le sud-ouest), me revoilou...

Je viens de copier ton post et je crois avoir bien compris. A un détail près :

Pourquoi "transformer les accents (aucun intérêt)" ?

Personnellement, j'ai des soucis si je ne transforme pas les accents : soit avec mysql soit avec mon site, suivant la fameuse phrase



<meta http-equiv='content-type' content='text/html;charset=iso-8859-1'>

ou

<META http-equiv='Content-Type' content='text/html; charset=windows-1252' />



A ce propos, je vois de plus en plus un espace-slash (' /') à la fin , avant le '>'.

A quoi cela sert-il ? Je n'en mets jamais et tout fonctionne mais il doit il y avoir une bonne raison pour le mettre...

J'ai cherché un peu sur Google mais je n'arrive manifestement pas à poser la bonne question.
Il y a deux types de balises : les balises paires et les balises simples (pas certain du terme, mais c'est dans l'idée). Les balises paires s'écrivent comme cela :
<balise></balise>

Et les balises simples comme ceci :
<balise />


Le / avant le > est donc une convention d'écriture qui est utilisée lorsque la balise n'a pas de valeur à l'intérieur d'elle.
Ainsi, par exemple, une balise <img> pourrait s'écrire :
<img src="image.jpg" alt="image indisponible"></img>

Mais s'écrit plutôt :
<img src="image.jpg" alt="image indisponible" />

car on ne met jamais rien entre <img> et </img>.
Bon, voilà qui est clair.

Mais, par défaut, HTML ou PHP attend qq chose entre <img> et </img> ou bien, ce qui est mon cas, lorsqu'on laisse sans fermeture :

<img src='images/coucou.gif'>

il pourrait se passer un 'coinçage' ?
Voilà,

J'ai un code simple pour entrer en BDD les données d'un formulaire de forum :



$valuesList = "pseudo, email, dateCreat, texte, parent, remoteAddr, titre, reply, url, lastReply";
                
$addValues= "'$pseudo', '$email', '$dateCreat', '$message', '$parent',' ".$_SERVER["REMOTE_ADDR"]."', '$titre', '$email_reply', '$url', '$dateCreat'";
                
$sql = "INSERT INTO forum (".$valuesList.") VALUES(".$addValues.")";
$reponse = mysql_query($sql, GetMyConnection());
CleanUpDB();



où GetMyConnection() est une fonction de connexion et CleanUpDB de déconnexion.

Comment dois-je faire, comment dois-je écrire ma formule, pour utiliser mysql_real_escape_string avec $email, $message, $titre et $url ?

J'ai lu plein de pages sur mysql_real_escape_string...

J'ai vu, lu et relu des exemples que je n'arrive pas à adapter.

Des heures que je suis dessus. AU SECOURS s'il vous plaît..

Cordialement.
a écrit :

Mais, par défaut, HTML ou PHP attend qq chose entre <img> et </img> ou bien, ce qui est mon cas, lorsqu'on laisse sans fermeture :
<img src='images/coucou.gif'>
il pourrait se passer un 'coinçage' ?

Ca dépend du doctype que tu as choisi.
Si tu es en XHTML 1.0, écrire <img ... > est faux.
Si tu es en HTML 4.01, les deux sont possibles (cependant si on veut être strict, <img ... /> devrait être faux)
Dans tous les cas, ça ne causera pas un blocage de php car php n'a rien à voir avec les détails d'affichage (il s'en fiche du code HTML que tu lui fais produire). Par contre, le navigateur peut ne pas aimer et le validator du W3C invalidera ta page.


a écrit :

Comment dois-je faire, comment dois-je écrire ma formule, pour utiliser mysql_real_escape_string avec $email, $message, $titre et $url ?

IL faut que tu l'appliques individuellement à chaque variable. P.ex. $email = mysql_escape_string($email);
a écrit :


IL faut que tu l'appliques individuellement à chaque variable. P.ex. $email = mysql_escape_string($email);



C'est ce que je lis et j'ai lu partout. Jusque là, je suis bon. Mais en pratique ??

Aurais-tu qq secondes pour me mettre ça en forme par rapport au court script que j'ai proposé ?

Si je le vois fait une fois, je comprendrais et je ne l'oublierais plus mais d'ici là...

J'ai essayé 100 combinaisons, et à chaque fois des erreurs. Même des fois sans erreur mais SANS enregistrement... C'est un comble.

J'ai rien compris, je disais, et c'est bien vrai.
$valuesList = "pseudo, email, dateCreat, texte, parent, remoteAddr, titre, reply, url, lastReply";

$pseudo = mysql_escape_string($pseudo);
$email = mysql_escape_string($mail);
$message = mysql_escape_string($message);
// etc...
                
$addValues= "'$pseudo', '$email', '$dateCreat', '$message', '$parent',' ".$_SERVER["REMOTE_ADDR"]."', '$titre', '$email_reply', '$url', '$dateCreat'";
                
$sql = "INSERT INTO forum (".$valuesList.") VALUES(".$addValues.")";
$reponse = mysql_query($sql, GetMyConnection());
CleanUpDB();

Où est le problème ? Il suffisait juste d'appliquer la fonction sur tes variables
Modifié par Noix de Coco (25 Jan 2009 - 12:31)
Noix de Coco a écrit :
Il y a deux types de balises : les balises paires et les balises simples (pas certain du terme, mais c'est dans l'idée).
On parle de balises orphelines.

Pour ce qui est des conventions d'écriture (dont la manière de fermer les balises en mettant > ou />) elles sont définies par le DOCTYPE. Ce que, si je puis-je me permettre Smiley lol , tu saurais déjà si tu avais tenu compte de ma suggestion de lire les tutoriels d'Alsa.

Pour ce qui est de mysql_real_escape_string il suffit de se référer à la doc :
$sql = sprintf("INSERT INTO forum (pseudo, email, dateCreat, texte, parent, remoteAddr, titre, reply, url, lastReply) VALUES('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
	mysql_real_escape_string($pseudo, GetMyConnection()),
	mysql_real_escape_string($email, GetMyConnection()),
	mysql_real_escape_string($dateCreat, GetMyConnection()),
	mysql_real_escape_string($message, GetMyConnection()),
	mysql_real_escape_string($parent, GetMyConnection()),
	mysql_real_escape_string($_SERVER["REMOTE_ADDR"], GetMyConnection()),
	mysql_real_escape_string($titre, GetMyConnection()),
	mysql_real_escape_string($email_reply, GetMyConnection()),
	mysql_real_escape_string($url, GetMyConnection()),
	mysql_real_escape_string($dateCreat, GetMyConnection()));
mysql_query($sql, GetMyConnection());
A noter que si les champs dateCreat et lastReply sont bien de type date (DATETIME, DATE, et TIMESTAMP) il faudrait plutôt utiliser NOW() :
$sql = sprintf("INSERT INTO forum (pseudo, email, dateCreat, texte, parent, remoteAddr, titre, reply, url, lastReply) VALUES('%s', '%s', NOW(), '%s', '%s', '%s', '%s', '%s', '%s', NOW())",
	mysql_real_escape_string($pseudo, GetMyConnection()),
	mysql_real_escape_string($email, GetMyConnection()),
	mysql_real_escape_string($message, GetMyConnection()),
	mysql_real_escape_string($parent, GetMyConnection()),
	mysql_real_escape_string($_SERVER["REMOTE_ADDR"], GetMyConnection()),
	mysql_real_escape_string($titre, GetMyConnection()),
	mysql_real_escape_string($email_reply, GetMyConnection()),
	mysql_real_escape_string($url, GetMyConnection()));
mysql_query($sql, GetMyConnection());
Voilà qui est clair. Je vais faire comme ça.

J'ai compris et je suis sûr que ça va marcher.

Merci pour toutes vos réponses, merci beaucoup.

Cordialement,
Autant pour moi, je ne savais pas que c'était une fonction SQL.è/quote¨
mysql_real_escape_string n'est pas une fonction SQL... C'est bien du php.

Pas mal l'utilisation de sprintf... c'est juste un peu barbant à écrire

<hs>PDO powa</hs>
C'est le sprintf que je n'avais pas vu >.< . Je pensais que c'était déjà la requête. Décidément moi et l'analyse ...
Modifié par Noix de Coco (26 Jan 2009 - 19:44)