PHP - Récupérer les

eagledark Messages postés 18 Date d'inscription mercredi 15 décembre 2010 Statut Membre Dernière intervention 17 janvier 2013 - 16 janv. 2013 à 19:39
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 19 janv. 2013 à 00:21
Bonjour à tous,

Après quelques recherches sur Google, je n'ai pas trouvé de réponses à ma question.

Je m'explique :

Je voudrais récupérer la valeur d'un textarea afin d'insérer celle-ci dans ma base de donnée mysql.
La récupération se fait donc en JavaScript comme ceci :

//txtCtMsg étant l'id de mon textarea
var msg = document.getElementById("txtCtMsg").value;


Puis j'envoi msg vers une page .php (à l'aide d'AJAX) pour insérer cette valeur dans ma base de données, voci ce qui se passe dans cette page :

if (isset($_GET['msg'])){
    mysql_query("INSERT INTO message (MSG) VALUES('".$_GET['msg']."')");
}


Le problème est que $_GET['msg'] ne contient pas les sauts de ligne effectués dans le textarea, même pas de \n...
Par exemple :
[i]Bonjour
Je m'appelle Philippe/i

Me retourne :
BonjourJe m'appelle Philippe

J'ai essayé d'utiliser nblr2($_GET['msg']) mais sans effet car la chaîne ne contient pas de \n

Merci pour vos solutions

4 réponses

cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
17 janv. 2013 à 00:00
Ce n'est pas plutôt la fonction nl2br() que tu utilises ? Où est-elle instanciée (pas vu) ?
Ca me semble bizarre qu'ils disparaissent ainsi...

Ce qui est plus probable, c'est que tu ne les voies pas à l'affichage (car l'HTML ignore les sauts de lignes).
[c'est l'erreur typique du débutant en développement Web qui ne s'y connait pas encore trop en HTML]
Mais si tu as remplacé \n par [i]
/i, il ne devrait pas y avoir de problème...


Point de vue sécurité

Attention aux injections SQL ! Voici déjà une requête un peu moins risquée :
mysql_query("INSERT INTO message (MSG) VALUES('".mysql_real_escape($_GET['msg'])."')");

Ton script est aussi sensible aux XSS, càd la possibilité d'insérer par exemple une balise <SCRIPT>...
Tu peux par exemple utiliser htmlentities() pour éviter ces problèmes :
<?php
if (isset($_GET['msg'])){
  $msg = htmlentities(mysql_real_escape($_GET['msg']));
  mysql_query("INSERT INTO message(MSG) VALUES('$msg');");
}
?>



En espérant que ça t'aura aidé

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
eagledark Messages postés 18 Date d'inscription mercredi 15 décembre 2010 Statut Membre Dernière intervention 17 janvier 2013 2
17 janv. 2013 à 00:16
Merci de ta réponse ghuysmans99.

Une erreur toute bête car je testais ma variable dans un alert() et du coup je ne voyais pas les \n...
Du coup avant d'envoyer sur la page php je fais un replace(/\n/g, "
") dans le js pour remplacer les \n par le
.

J'allais oublié l'injection SQL encore une fois, merci de me l'avoir rappelé, heureusement que pour l'instant je travaille en local.

Concrètement, la fonction htmlentities permet de remplacer les balises html par des caractères spéciaux du genre , mais du coup j'aurai des caractères de ce type dans ma BDD? Ca m'obligerai à faire un html_entity_decode() à chaque récupération de données?
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
18 janv. 2013 à 17:39
Salut,

Juste une petite intervention au sujet de l'utilisation des fonctions mysql_* : il ne faut pas les utiliser ! Elles sont obsolètes et seront supprimées dans le futur. Je vous laisse lire cet article expliquant plus en détail le pourquoi du comment : Arrêtez d'utiliser les fonctions mysql_*() !
Bref, songez à cela avant qu'il ne soit trop tard.
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
19 janv. 2013 à 00:21
Non, tu ne dois surtout pas faire ça : si tu le faisais, ça rendrait la sécurité inutile. Le but est de considérer tout ce que l'utilisateur entre comme du texte pur... Une fois codé, le symbole < ne sera pas interprété comme un début de balise.

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Rejoignez-nous