IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Retour chariot non affiché dans un textarea [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut Retour chariot non affiché dans un textarea
    Salut,

    J'ai un petit soucis que je n'arrive pas à régler :

    Dans ma base de données j'ai le texte d'articles avec des retours chariot.

    Lorsque je veux afficher ce texte dans un textarea pour le modifier, l'article est regroupé sur une seule ligne.

    Lorsque j'utilise nl2br(), des <br> sont affichés aux positions des retours chariot mais ne sont, bien entendu, pas interprétés.

    Détails curieux, lorsque je modifie mon article directement dans phpmyadmin les retours à la ligne sont bien interprétés dans mon textarea...

    Problème d'encodage dans de l'insert ? J'ai tout en UTF-8
    Il y a t'il "retour chariot" et "retour chariot" ?

    Des idées ?

    Merci

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Pas de traitement sur ta chaîne à l'INSERT au SELECT ou en JS ?

    Quand je teste les différents retours à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php foreach ( array("aaa\r\nbbb", "aaa\rbbb", "aaa\nbbb") as $string ) : ?>
     
    <textarea><?php echo $string ?></textarea>
     
    <?php endforeach ?>
    J'ai à chaque fois :

    (FF et Chrome sous WinXP)

    Donc pas de raison que ça bloque pour toi.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Non pas de traitement pour l'insertion..., j'utilise Zend.

    J'arrive pas à comprendre...

    Avec nl2br() il me transforme bien les retours à la ligne donc ils existent bien...

  4. #4
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Bonsoir Khleo,

    Peux-tu nous montrer ton code qui affiche le textearea stp ?
    et ta requête avec zend ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Ca commence par un insert en ajax :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $.ajax({
    	type: 'POST',
    	url: '/profil/enregistrerbillet/',
    	data: "txt="+encodeURIComponent($("#TA").val())+
    	"&titre="+encodeURIComponent($("#TitreAventure").val())+
    	"&CodeBillet="+$("#EnregistrerBillet").attr("data-ref")+
    	"&xmlinteret="+encodeURIComponent($("#ASInteret").attr("data-xml"))+
    	"&xmlprofil="+encodeURIComponent($("#ASProfil").attr("data-xml"))+
    	"&publier="+publier+
    	"&date="+$("#Annee").val()+"-"+$("#Mois").val()+"-"+$("#Jour").val(),
    	dataType: 'text',
    	success: function (result)
    	{
    	    ...
    	}
    });

    Ensuite mon action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public function enregistrerbilletAction () {
     
    	$session = new Zend_Session_Namespace('user');
     
    	if ($session->CodeUser)
    	{
     
    		$table_billet = new Application_Model_TBillet;
     
    		$billet->date = $this->getParam("date");
    		$billet->UserID = $session->CodeUser;
    		$billet->CodeBillet = $this->getParam("CodeBillet");
    		$billet->titre = $this->getParam("titre");
    		$billet->txt = $this->getParam("txt");
    		$billet->interet = json_encode(simplexml_load_string('<xml>'.$this->getParam("xmlinteret").'</xml>'));
    		$billet->profil = json_encode(simplexml_load_string('<xml>'.$this->getParam("xmlprofil").'</xml>'));
    		$billet->publier = $this->getParam("publier");
     
     
    		if (intval($billet->CodeBillet) == 0)
    		{
    			$this->view->result = $table_billet -> enregistrerBillet($billet);
    		}
    		else
    		{
    			$this->view->result = $table_billet -> majBillet($billet);
    		}
     
    	}
    	else
    	{
    		$this->view->result = 'error';
    	}
     
    }
    Mes modèles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public function enregistrerBillet ($pObjBillet) {
     
    	$ajouterBillet = $this->createRow();
     
    	$ajouterBillet->DateBillet = $pObjBillet->date;
    	$ajouterBillet->UserID = $pObjBillet->UserID;
    	$ajouterBillet->TitreBillet = $pObjBillet->titre;
    	$ajouterBillet->TxtBillet = $pObjBillet->txt;
    	$ajouterBillet->JSONInteret = $pObjBillet->interet;
    	$ajouterBillet->JSONProfil = $pObjBillet->profil;
    	$ajouterBillet->Publie = $pObjBillet->publier;
     
    	return $ajouterBillet->save();
     
    }
     
    public function afficherBillet ($pRef, $pUser = 0) {
     
    	$query = "
    	SELECT DateBillet, UserID, TitreBillet, TxtBillet, JSONInteret, JSONProfil, JSONCommentaire, Publie
    	FROM billet
    	WHERE CodeBillet = ".intval($pRef)." AND (Publie = 1 OR UserID = ".intval($pUser).")";
     
    	return $this->getAdapter()->fetchRow($query, null, Zend_Db::FETCH_OBJ);
     
    }
    Et j'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function newstoryAction () {
     
        [....]
     
        $billet = $table_billet -> afficherBillet ($CodeBillet, $session->CodeUser);
     
        [...]
     
        $this->view->result = '[...] <textarea id="TA" style="width:662px; height:375px; padding:5px; font-family: monospace;">'.htmlspecialchars($billet->TxtBillet).'</textarea> [...]';
     
    }

  6. #6
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Ok, donc aucun traitement avec zend_form, aucun ajout de fonction lors de l'insert et pas d'utilisation de l'aide de vue escape().

    Il me semble que la seul chose que te fait zend par défaut, c'est de protéger tes données des injections sql. Donc normalement, ton texte html devrait passer dans la BD.

    Après, je ne connais pas la fonction encodeURIComponent() qui si j'ai bien compris te fait juste un encodage.

    Sinon vu que pour l'affichage tu utilises htmlspecialchars() ça peut jouer, as-tu une balise meta pour le charset ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" >
    Sinon peut-être le charset côté instanciation Zend_Db

    Config.ini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resources.db.params.charset = "utf8"

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    Après, je ne connais pas la fonction encodeURIComponent() qui si j'ai bien compris te fait juste un encodage.
    Oui, c'est pour éviter que des & contenu dans les variables viennent poser problèmes.

    Sinon vu que pour l'affichage tu utilises htmlspecialchars() ça peut jouer, as-tu une balise meta pour le charset ?
    oui :

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    Sinon peut-être le charset côté instanciation Zend_Db
    oui :

    resources.db.params.charset = "utf8"

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Détails curieux, lorsque je modifie mon article directement dans phpmyadmin les retours à la ligne sont bien interprétés dans mon textarea...
    Cela laisse penser qu'il y a un traitement avant le INSERT qui fait sauter les retours à la ligne.
    Dans phpMyAdmin les retours à la ligne apparaissaient ?

    Et sur ta page quand tu fais "afficher la source" tu vois les retours à la ligne dans le textarea ?

  9. #9
    Membre averti Avatar de Njörd
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 190
    Points : 390
    Points
    390
    Par défaut
    Ok, après test, j'ai le même souci que toi.

    La balise <textarea> ne semble pas comprendre les <br />, du coup il faut les traduire en \n

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $string = 'BOnjur <br /> au revoir <br /> hello <br /><br />';
    $string = str_replace('<br />', "\n", $string);
    echo '<textarea id="TA" style="width:662px; height:375px; padding:5px; font-family: monospace;" value="'.htmlspecialchars($string)
    En gros, je fais l'inverse de nl2br()

  10. #10
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 519
    Points : 311
    Points
    311
    Par défaut
    J'ai trouvé...

    Je compresse mon html en sorti en faisant un str_replace("array("\t", "\n")", "", )Forcement, ça marche beaucoup moins bien...

    Merci en tout cas

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    Dans le premier post tu dis avoir tout en utf-8, je te rappelle que str_replace n'est pas compatible avec unicode. En compressant ainsi ton html tu prends le risque de casser le code

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Spip] Tableau non affiché dans la partie "Articles les plus récents"
    Par Gigi95 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 7
    Dernier message: 27/09/2007, 12h27
  2. Google Analytics sur une page non affichée dans un navigateur
    Par Fdescamps dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/06/2007, 08h18
  3. [AJAX] retour chariot non gardé
    Par cisco112 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/04/2007, 15h10
  4. [Débutant] Objets non affichés dans ma fenêtre
    Par G_angel dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 30/01/2007, 13h03
  5. Retour a la ligne dans un textarea quand le mot est trop long
    Par avogadro dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/11/2006, 15h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo