Problème de textarea, nl2br, mysql_real_escape_string avec mes objets

takinelinfo Messages postés 13 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 1 juillet 2008 - 4 juin 2008 à 00:16
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 4 juin 2008 à 12:48
Bonsoir à tous,
J'ai actuellement un gros soucis, avant toute chose voici mon code. J'ai fait en sorte qu'il soit le plus simplifié possible.
<?php
require_once('Mysql.class.php');
class Test
{
     var $id;
    var $titre;
    var $content;
   
    function test($id= NULL,$titre=NULL,$contenu=NULL)
    {

        $this->id=$id;
        $this->titre=$titre;
        $this->contenu=$contenu;
    }
   
    function insert()
    {
        $this->entree();
        $mysql = new mysql();
        $mysql->query("INSERT INTO `test`(`titre`,`contenu`) VALUES ('".$this->titre."','".$this->contenu."')");
        $this->id=$mysql->insert_id();
        $this->sortie();
        return true;
    }
   
    function fromDb($id)
    {
        $mysql = new mysql();
        $mysql->connect();
        $this->id = intval(mysql_real_escape_string(trim($id)));
       
        $mysql->query("SELECT * FROM `test` WHERE `id`='".$this->id."'");
       
        if($mysql->num_rows()!=1)
            return false;
       
        $data = $mysql->next_record();
        $this->titre=$data['titre'];
        $this->contenu=$data['contenu'];
        $this->affichage();
    }
   
    function entree()
    {
        $mysql = new mysql();
        $mysql->connect();
       
        $this->id = intval(mysql_real_escape_string(trim($this->id)));
        $this->titre = mysql_real_escape_string(trim($this->titre));
        $this->contenu = mysql_real_escape_string(trim($this->contenu));
    }
   
    function sortie()
    {       
        $this->titre = stripslashes($this->titre);
        $this->contenu = stripslashes($this->contenu);
    }
   
    function affichage()
    {   
        $this->titre = htmlspecialchars($this->titre);
        $this->contenu = htmlspecialchars($this->contenu);
    }
   
    function html()
    {   
        $this->contenu = nl2br($this->contenu);
    }
}
?>

<?php
require_once('Test.class.php');

if(isset($_POST['addTest']))
{
    $test = new Test(NULL,$_POST['titre'],$_POST['contenu']);
    $test->insert();
}
if(true)
{
    $test = new Test();
    $test->fromDb(13);
}
   
$titre    = (isset($test))?$test->titre:'';
$contenu= (isset($test))?$test->contenu:'';

if(isset($test))
    $test->html();
   
$contenuHtml=(isset($test))?$test->contenu:'';

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Ceci est un test</title>
</head>

    <form action="" method="post">
        " />
        <textarea name="contenu" cols="50" rows="10"><?php echo $contenu; ?></textarea>
       
    </form>
   
<?php echo $contenuHtml; ?>

</html>

Le but du jeu est d'avoir un systeme de message avec un titre, et un contenu (j'ai vraiment simplifié là...). Il faut pouvoir le saisir, l'editer, l'afficher,....

Insertion
L'insertion fonctionne bien. Si par exemple je rentre:
Titre: salut'toi
Contenu:
Bonj'our,
Comment vas tu?

j'obitens bien dans ma base le bon resultat, pas de plantage grâce au mysql_real_escape_string, et pas de
car pas de nl2br.

Affichage
Lorsque je veux recuperer l'enregistrement j'utilise $obj->fromBd et si je veux de l'html, si je veux des
quoi, j'utilise en plus $obj->html();

Mixte
Maintenant imaginons, je veux inserer le resultat et dessuite apès afficher le resultat sans avoir à refaire une requete. Je fais donc mon $obj->insert(). le but est de pouvoir avoir le même resultat que le from mais sans l'utiliser. Une fois l'insertion de faite, je veux donc enlever les \ mit par mysql_real_escape_string, je fais donc appel à stripslashes. Pour titre pas de probleme, mais pour contenu j'ai un soucis. Si je rentre par exemple

123'456
123'456

j'obtient en sortie: 123'456rn123'456
et si je ne l'utilise pas: 123\'456\r\n123\'456
dans les deux cas, je ne peux pas reafficher le texte de depart dans le textarea, et bien entendu le nl2br ne peux pas marcher par la suite. Comment puis je faire pour eviter ça?

Autres questions
J'ai l'habitude de faire appel à une fonction de "nettoyage" lors de l'insertion (insertion + update) dans la bdd afin d'avoir des données cohérente. Par exemple,
<?php
function entree()
{
   this->id =intval(trim($this->id));
   $this->nom=mysql_real_escape_string(strtoupper(trim($this->nom)));
   $this->prenom=mysql_real_escape_string(ucfirst(strtolower(trim($this->prenom))));
   $this->adresse=mysql_real_escape_string(trim($this->adresse));
}
?>

Pour ne pas avoir ce problème de mysql_rela_escape_string et stripslashes, n'aurais je pas intérré à utiliser seulement des fonctions du style (trim, ucfirst,strtoupper,....) et mettre le mysql_real_escape_string() dans la requete? Comme ça, ça n'affect pas mon $this.

Par contre si l'on passe d'un serveur avec le magic quotes de off à on, il faut tout modifier, n'y a t'il pas une meilleure solution?

Merci pour ce qui auront pris la peine de lire, car j'ai ecrit un pavé, j'en reviens pas :)  :)  :)
A voir également:

3 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 juin 2008 à 03:51
salut

tu as plusieurs solutions pour ce probleme : d'une part, si mettre le mysql_real_escape_string dans le mysql_query, c'est bien.

d'autre part, faire un htmlentities (avec les bons parametres) te permet de virer toutes les quotes directement, sans avoir a te poser la question "y a t'il des quotes ?".

pour la configuration du serveur, il fau faire un ini_get ou un get_magic_quotes_gpc je crois ( cf http://fr3.php.net/get_magic_quotes_gpc ) pour savoir si tu dois faire un stripslashes ou pas.

sinon, ton code est un peu lent...


$titre = (isset($test))?$test->titre:'';
$contenu= (isset($test))?$test->contenu:'';

if(isset($test))
$test->html();

$contenuHtml=(isset($test))?$test->contenu:'';

ici, tu effectues plein de fois le isset, et t'en as pas besoin.
0
takinelinfo Messages postés 13 Date d'inscription mardi 24 avril 2007 Statut Membre Dernière intervention 1 juillet 2008
4 juin 2008 à 10:19
"sinon, ton code est un peu lent...

$titre    = (isset($test))?$test->titre:'';
$contenu= (isset($test))?$test->contenu:'';

if(isset($test))
    $test->html();
  
$contenuHtml=(isset($test))?$test->contenu:'';

ici, tu effectues plein de fois le isset, et t'en as pas besoin."


Concernant cette partie, je suis tout à fait d'accord, en fait j'ai un script beaucoup plus evoluer, et qui déjà dans une application. C'est comme ça que je me suis rendu compte du probleme. J'ai donc fait une classe de test, et le petit bout de code était la juste pour jongler entre l'affichage des donnees une fois saisies, le fromDb, et autres. Je ne l'ai en aucun cas optimisé.

J'ai pris un autre exemple afin de montrer une solution que j'ai trouvé.
<?phprequire_once('Mysql.class.php');classTest{var$id;var$nom;var$prenom;var$attribut=array('id','nom','prenom');functiontest($id=NULL,$nom=NULL,$prenom=NULL){$this->id=$id;$this->nom=$nom;$this->prenom=$prenom;}functioninsert(){$this->entree();foreach($attributas$key=>$value)${$key}=mysql_real_escape_string($value);$mysql=newmysql();$mysql->query("INSERT INTO `test`(`nom`,`prenom`) VALUES ('".$nom."','".$prenom."')");$this->id=$mysql->insert_id();returntrue;}functionentree(){$this->id=intval(trim($this->id));$this->nom=trim(strtoupper($this->nom));$this->prenom=trim(ucfirst(strtolower($this->prenom)));}}?>

Quand pensez vous?
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 juin 2008 à 12:48
"Quand pensez vous?"=> quand je ne dors pas...

ta class m'a l'air correcte, peut-etre devrais-tu faire une classe abstraite, et une class d'abstraction de sgbd.
0
Rejoignez-nous