Les Allergies
Alimentaires
Posez votre question Signaler

[PHP/MySQL/xhtml]Balise input de type hidden [Résolu]

remi13131 30Messages postés 23 décembre 2007Date d'inscription 19 août 2010Dernière intervention - Dernière réponse le 19 août 2010 à 12:32
Bonjour,
J'ai profité que ce soit les grandes vacances pour utiliser mon temps utilement, et j'ai donc étudier en autodidacte les bases de la combinaison gagnante xhtml / CSS / PHP / MySQL.
Je travaille actuellement sur un site-CV personnel, qui n'est pour le moment pas en ligne, mais qui reprend le même principe que les divers sites d'élèves ingénieur de ma future école (rentrée le 01 septembre :p) que j'ai pu rencontrer. (Si ça vous interresse, mon école est l'IG2I de Lens)
Or je souhaiterais réaliser une interface d'administration pour ce site, mais je ne veux pas d'une solution prémâchée dasn un tutoriel ultrcomplet. Je voudrais trouver une solution viable et totalement opérationnelle par moi même.
J'ai donc des problèmes... Pour la fonction de modification des "articles" sur mon site. Le principe que j'ai employé n'est pas forcément le plus simple :
1) on choisit le nom billet que l'on veut modifier dans une liste déroulante.
2) ce nom de billet est récupéré sur une page de traitement, une notification de confirmation "Vous allez modifier le billet tel nom de telle section" avec un bouton de formulaire, ce qui permet de transmettre en POST les autres info (contenu, id, section, etc.) par le biais d'un formulaire avec uniquement des input cachés contenant les infos sur le billet.
3) renvoyer ces infos sur la première page qui affiche alors un formulaire avec zone de titre, zone de contenu, et liste déroulante de section avec les infos du billet à modifier pré-inscrites.
4) les infos moddifiées sont renvoyées à la page de traitement qui update la bdd.
Or le probléme est à l'étape 2.
Puisque dans les billet que j'écris, je met du xhtml pour mettre en forme (balises de type br / ou alors des liens ou autre) j'ai des souci dans ma zone de formulaire cachée contenant le contenu du billet. Car l'attribut value se ferme dès qu'il rencontre une guillemet (logique). Je pourrai mettre htmlspecialchars mais alors toutes mes balises ne serviraient plus puisqu'elle seraient inactives.
Voilà, j'éspère avoir été assez clair pour que vous m'aidiez, et j'en profite pour remercier une nouvelle fois la communauté CCM vraiment SUPER !!
Merci d'avance !
Rémi
Lire la suite 

[PHP/MySQL/xhtml]Balise input de type hidden »

25 réponses
Réponse
+0
moins plus
oui je suis désolé, j'ai "rippé" en tapant le message et je ne sais comment mais ça l'a validé ^^, mais c'est corrigé !
Ajouter un commentaire
Réponse
+0
moins plus
Tu as essayé de faire appel à la fonction str_replace ?
http://fr.php.net/manual/fr/function.str-replace.php

afin d'échapper tes guillemets :
$contenu = str_replace('"', '\"', $contenu);


Si ton problème n'est que pour le contenu de value, ca devrait faire l'affaire.
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour ta réponse !

Oui, je pourrais faire appel à cette fonction, mais alors, imaginons que dans $contenu il y ait un lien avec un attribut href=" " .

Les guillemets vont être échappées mais ensuite il faudra qu'elles "reviennent" pour que le lien soit affiché dans l'article final.

Est-il alors possible de le faire avec cette fonction ?

Par avance merci !
Defouille- 18 août 2010 à 15:21
bah oui en inversant les paramètres ^^ :
$contenu = str_replace('\"', '"', $contenu);


Et le tour est joué ! :)
Ajouter un commentaire
Réponse
+0
moins plus
Ah ! c'est terrible comme fonction ça :) !
Je m'empresse d'essayer cela !!
Et puis, si ça ne marche pas, ben c'est qu'il y a encore une autre erreur ^^

Sinon, est-ce que cela t'interresserait que je poste le code de mes deux pages de modification de billet pour que tu me dise ce que tu en pense ?

(C'est mon premier vrai projet de site internet donc il faut que je prenne le maximum d'avis pour pouvoir prendre dès maintenant les bonnes habitudes !)
Defouille- 18 août 2010 à 15:32
Je peux te dire rapidement ce que j'en pense si tu veux ^^ (enfin si c'est pas trop long :p)
Ajouter un commentaire
Réponse
+0
moins plus
Alors voici pour la page "d'accueil" si je peut dire :

Edit : Oulala, j'ai supprimé le code car il s'affichait super mal sur le fofo...

Il est un peu trop large donc tu ne pourra pas voir correctement les incrémentations :/
maka54- 18 août 2010 à 15:56
utilise plutot des $_POST a la place des $_GET car ils sont visible depuis l'url
remi13131- 19 août 2010 à 09:41
Oui, je sais cela... Mais cette page est (pour l'instant) destinée à moi même, donc cela ne me gène pas. Si je construisais un site pour quelqu'un d'autre, bien entendu que je prendrais toutes mes précautions... Ou tout du moins le plus possible ^^ Merci Beaucoup de tes réponses ! C'est très sympa d'avoir un avis, ça permet de s'améliorer plus rapidemment !
Ajouter un commentaire
Réponse
+0
moins plus
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > 
    
<head> 
   <title>Rémi DI PAOLA</title> 
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
   <link rel="stylesheet" media="screen" type="text/css" title="Exemple" href="../design_defaut.css" /> 
</head> 
    
<body> 
    
   <?php  
      include("structure_php/En_tete.php"); 
      include("structure_php/Barre_navigation.php");  
      include("structure_php/Menu_site.php");  
   ?> 

<div id="corps"> 
                 
 <h3>Interface d'administration</h3> <p> <a href="creation_billet.php">| Creation de billet |</a>  <a href="modif_billet.php"> Modification de billet |</a> <a href="suppr_billet.php"> Suppression de billet |</a> 
            
      <h4>Modification de billet</h4><?php if (isset($_GET['mod']) and $_GET['mod']==1) 
                                        { 
                                        echo "Le billet à été modifié avec succès"; 
                                        $_GET['mod']=0; 
                                        } 
                                    ?> 
  
 <?php  

    try 
{ 
 $bdd = new PDO('mysql:host=localhost;dbname=site_personnel', 'root', ''); 
} 
catch(Exception $e) 
{ 
        die('Erreur : '.$e->getMessage()); 
} 

     
    $billet = $bdd->query('SELECT ID, section, titre, contenu FROM billets ORDER BY titre'); 
     
  ?> 
  <form method="post" action="modif_billet_traitement.php?mod=0"> 
         
        <p> 
         
  titre du billet : <select name="titre"> 
<?php  
        while ($donnees = $billet->fetch()) 
        { 
          echo '<option value="' . $donnees['titre'] . '">' . $donnees['titre'] . '</option>';           
        } 

   ?>  
                    </select> 
                     
                 <input type="submit" value="Valider" />    
        </p> 
   
  </form>   

<?php  
        if (isset($_GET['mod']) and $_GET['mod']=2) 
        { 
   ?> 
    
   <form method="post" action="modif_billet_traitement.php?mod=2"> 
            
              <p> 
                  Titre du billet : <input type="text" name="titre" value="<?php echo $_GET['titre'] ?>" /> <br /><br /> 
                   
                  Contenu du billet : <br /> 
                   
                  <textarea name="contenu" rows="15" cols="70"> 
                   
                  <?php echo $GET['contenu'] ?> 
                   
                  </textarea><br /><br /> 
                   
                  Section du billet : <select name="section"> 
                                              <option value="accueil">Accueil</option> 
                                              <option value="presentation">Présentation</option> 
                                              <option value="experiences">Expériences</option> 
                                              <option value="divers">Divers</option> 
                                              <option value="liens">Liens</option> 
                                              <option value="contact">Contact</option> 
                                       </select> <br /><br /> 
                   
                  <input type="hidden" name="ID" value="<?php $_GET['id'] ?>" /> 
                  
                   
                  <input type="submit" value="Valider" />               
                   
              </p> 
  
         </form> 
    
<?php             
          
         }        
  

$billet->closeCursor(); 

?>    
  
  
  


       </div> 

    <?php include("structure_php/Pied_de_page.php"); ?> 

</body> 

</html> 



EDIT : Bon voilà finalement ça va à peu près l'affichage donc je l'ai mis quand même, mais je ne t'en voudrais pas de ne pas le lire c'est pas super là...
C'est la page d'acceuil de modification là.
Defouille- 18 août 2010 à 16:08
En regardant vite fait on peut dire que j'ai 3 conseils à te donner ^^

D'abord, toujours utiliser de l'encodage utf-8 dans tes pages et dans ta base (a part si tu es contrain et forcé par un être plus puissant que toi à l'utilisation d'un autre encodage :p)
Ca permet de moins se poser de question si tu fais de l'AJAX, et d'éviter beaucoups de problèmes d'encodage (qui sont souvent très chiants...).
charset=iso-8859-1 => charset=utf-8


Ensuite pour la sécurisation des variables que tu récupères dans $_GET ou $_POST je te conseille d'apprendre à utiliser la fonction filter_input.
Une fois connue et maitrisé elle te permet de récupérer tout tes champs en toute sécurité, sans te prendre la tête.
Article en anglais : utilisation $_GET et $_POST sécurisé
http://www.phparch.com/2010/07/08/never-use-_get-again/
fonctions filter_input :
http://fr.php.net/manual/fr/function.filter-input.php

Enfin détail, je te conseille de ne jamais mettre d'espace ou de majuscule dans tout les fichiers de tes projets, pour éviter des erreurs de chemins.
<?php include("structure_php/Pied_de_page.php"); ?>


Ce sont des conseils pas forcément "important" pour que ton projet fonctionne, mais ça peut te faire aller plus vite et etre vraiment pratique.


(je vais regarder l'autre page :p)
remi13131- 19 août 2010 à 09:45
Okay pour l'UTF-8 et filter_input, j'avoue n'en avoir jamais entendu parler !
Pour la majuscule, c'est une erreur de ma part car je connnais cette "règle" et parfois en tapant rapidemment ça ne vient pas tout seul ^^
Ajouter un commentaire
Réponse
+0
moins plus
Et voilà la page de traitement :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   
<head>
   <title>Rémi DI PAOLA</title>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
   <link rel="stylesheet" media="screen" type="text/css" title="Exemple" href="../design_defaut.css" />
</head>
   
<body>
   
   
<div id="corps">
                
 <?php 

    try
{
	$bdd = new PDO('mysql:host=localhost;dbname=site_personnel', 'root', '');
}
catch(Exception $e)
{
        die('Erreur : '.$e->getMessage());
}

    if ($_GET['mod']=0)
    {    
    $billet = $bdd->prepare('SELECT ID, titre, contenu, section FROM billets WHERE titre= ? ');
              $billet->execute(array($_POST['titre']));      
    
                       $donnees = $billet->fetch();
                       
                       $billet->closeCursor();
                       
                       header('Location: modif_billet.php?mod=2&amptitre='.$donnees['titre'].'&ampcontenu='.$donnees['contenu'].'&ampsection='.$donnees['section'].'&ampid='.$donnees['ID']);                        
    }
    
    
    if ($_GET['mod']=2)
    {
    $billet = $bdd->prepare('UPDATE billet SET section = :section, titre = :titre, contenu = :contenu, date_heure = now() WHERE ID = :id');
          $billet->execute(array(
                               'section' => $_GET['section'],
                               'titre' => $_GET['titre'],
                               'contenu' => $_GET['contenu'],
                               'id' => $_GET['id']
       
                                  ));
     }
     
    $billet->closeCursor();   
                               
    header('location: modif_billet.php?mod=1');
     
  ?>
  
       </div>

    <?php include("structure_php/Pied_de_page.php"); ?>

</body>

</html>

remi13131- 19 août 2010 à 11:18
Oui... C'est une solution mais j'ai peur que cela nuise un peu à la compréhension du code en relecture !

Au fait, je viens de penser, mon code ne manquerait pas un peu de commentaires ? J'en ai zéro zéro, sauf dans le CSS...
Defouille- 19 août 2010 à 11:59
La page est pas très longue, et relativement compréhensible. Donc ça va encore, après c'est sur que quand tu as des fichiers de plusieurs milliers de lignes il vaut mieux commenter :).
remi13131- 19 août 2010 à 12:32
d'accord d'accord !
Je viens de tester str_replace().
En fait, le problème venait aussi des balises dedans, je m'explique :

j'avait avant la ligne de code :
<input type="hidden" name="contenu" value="<?php echo $donnees['contenu'] ; ?>" />

Or, ce texte qui devrait être caché s'affichait à la moindre présence de guillemets ( " ) dans la variable $donnees['contenu'].
J'ai appliqué str_replace, mais en fait la présence de fermeture de de balise (>) fait aussi tout bugguer ^^ Donc je suis en train de construire la fonction avec un array.

Je vais bien voir ^^ Je te donnerai des nouvelles !!
Ajouter un commentaire
Réponse
+0
moins plus
Merci d'avoir pris le temps pour moi defouille !

Je vais tenter ta solution, elle va certainement m'aider beaucoup !

Merci encore !

Au plaisir de se recroiser, que ce soit virtuellement ou réellement ^^

(ça me fait réellement plaisir car tu es le premier à qui je montre mon code et je pensais qu'il n'était pas si net que cela !)

Au revoir, je met en résolu !
Ajouter un commentaire
Ce document intitulé « [PHP/MySQL/xhtml]Balise input de type hidden » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?