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 :

Sauvegarde de données


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut Sauvegarde de données
    Bonjour à tous,

    J'ai un problème de sauvegarde côté PHP d'une partie de mes éléments qui ont une variable commune. Je souhaiterais modifier un titre, une image, un lien et son titre et enregistrer la modification en bd dans ma table qui a la structure suivante :
    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
     
    / Structure de la table `newsletter`
    CREATE TABLE IF NOT EXISTS `newsletter` (
      `newsletter_id` int(11) NOT NULL AUTO_INCREMENT,
      `url_lien` varchar(255) NOT NULL,
      `titre_url_lien` varchar(255) NOT NULL,
      `titre` varchar(255) NOT NULL,
      `description` text NOT NULL,
      `image` varchar(255) NOT NULL,
      PRIMARY KEY (`newsletter_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
    // Contenu de la table `newsletter`
    INSERT INTO `newsletter` (`newsletter_id`, `url_lien`, `titre_url_lien`, `titre`, `description`, `image`) VALUES
    (1, 'http://link-j-en-profite', 'J''en profite', 'Item 1', 'Incenderat autem audaces usque ad insaniam homines ad haec, quae nefariis egere conatibus, Luscus quidam curator urbis subito visus: eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.', 'image_01.jpg'),
    (2, 'http://link-contact', 'Contact', 'Item 2', 'Incenderat autem audaces usque ad insaniam homines ad haec, quae nefariis egere conatibus, Luscus quidam curator urbis subito visus: eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.', 'image_02.jpg'),
    (3, 'http://link-a-propos', 'A propos', 'Item 3', 'Incenderat autem audaces usque ad insaniam homines ad haec, quae nefariis egere conatibus, Luscus quidam curator urbis subito visus: eosque ut heiulans baiolorum praecentor ad expediendum quod orsi sunt incitans vocibus crebris. qui haut longe postea ideo vivus exustus est.', 'image_03.jpg');
    Le code HTML est le suivant :
    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
    36
    37
    38
    39
    40
    41
     
    <div>
      <h4 class="row-edit" data-type="title" data-id="<?=$row['newsletter_id']; ?>"><?=$row['titre'];?></h4>
      <p class="row-edit" data-type="image" data-id="<?=$row['newsletter_id']; ?>"><img src="<?=$row['image'];?>"></p>
      <p class="row-edit" data-type="text" data-id="<?=$row['newsletter_id']; ?>><?=$row['description'];?></p>
      <div ><a href="<?=$row1['url_lien']; ?>" class="row-edit" data-type="link" data-id="<?=$row['newsletter_id']; ?>"><?= $row['titre_url_lien']; ?></a></div>
    </div>
    <!-- Modale -->
    <div class="edit" id="edit-title">
      <div class="edit-box" style="">
        <div class="edit-box-title">Edit Link</div>
        <div class="edit-box-content">
          <div class="edit-box-content-text">Title</div>
          <div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input title"/></div>
          <div class="edit-box-content-text">URL:<span>(full address including    http://)</span></div>
     
          <div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input url"/></div>
        </div>
        <div class="edit-box-buttons">
          <div class="edit-box-buttons-save">Save</div>
          <div class="edit-box-buttons-cancel">Cancel</div>
        </div>
      </div>
    </div>
    <div class="edit" id="edit-link">
      <div class="edit-box" style="">
        <div class="edit-box-title">Edit Link</div>
        <div class="edit-box-content">
          <div class="edit-box-content-text">Title</div>
          <div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input title"/></div>
          <div class="edit-box-content-text">URL:<span>(full address including    http://)</span></div>
     
          <div class="edit-box-content-field"><input type="text" class="edit-box-content-field-input url"/></div>
        </div>
        <div class="edit-box-buttons">
          <div class="edit-box-buttons-save">Save</div>
          <div class="edit-box-buttons-cancel">Cancel</div>
        </div>
      </div>
    </div>
    <!-- Fin Modale -->
    Le code JS :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    console.clear();
    (function hover_edit(){
        var big_parent;  
      $(".row-edit").hover(
        function() {
            $(this).append('<span class="row-edit-hover"><i class="fa fa-pencil" style="line-height:30px;"></i></span>');
        }, 
        function() {
            $(this).children(".row-edit-hover").remove();
        }
      )
      $("a").click(function(e) {e.preventDefault()});
      $("body").on('click', ".row-edit-hover i", function(e) {
            e.preventDefault();
            big_parent = $(this).parent().parent();
     
           //edit title
           if(big_parent.attr("data-type")=='title'){
               $("#edit-title .title").val(big_parent.text());
               $("#edit-title").fadeIn(500);
               $("#edit-title .edit-box").slideDown(500);
           }    
           //edit link
           if(big_parent.attr("type")=='link'){
              $("#edit-link .title").val(big_parent.text());
              $("#edit-link .url").val(big_parent.attr("href"));
              $("#edit-link").fadeIn(500);
              $("#edit-link .edit-box").slideDown(500);
           }
           $(".edit-box-buttons-save").click(function() {
               var toSave = {};
               $(this).parents('.edit').fadeOut(500).children().slideUp(500);
               [#red]big_parent.text($("#edit-title .title").val());[/#]
               big_parent.text($("#edit-text .text").val());
               big_parent.attr("href",$("#edit-link .url").val());
               big_parent.attr("src",$("#edit-image .image").val());
               toSave = {
                    'id'   : big_parent.data('id'),
                    'url'  : big_parent.attr('href'),
                    'img' : big_parent.attr('src'),
                   [#darkred] 'text' : big_parent.text()[/#]
               }
               console.info(toSave);
               $.post("page-update.php", toSave, function(response) {
                    if(response.status) {
                        $("#msg").removeClass('danger');
                        $("#msg").addClass('success').html(response.msg);
                    } else {
                        $("#msg").removeClass('success');
                        $("#msg").addClass('danger').html(response.msg);
                    }
                 }, 'json');
            });
        });
    })();
    Le code PHP :
    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
    36
    37
    38
     
    // page-update.php
    function update_newsletter($url,$img,$text,$id){
      $sql = "UPDATE newsletter SET url_lien = :url, titre_url_lien = :text, titre = :text, description = :text,  image = :img WHERE newsletter_id = :id";
      $datas = array(":url"=>$url, ":img"=>$img, ":text"=>$text, ":id"=>$id);
      return queryExec($sql,$datas);
    }
    function queryExec($sql,$datas){
     global $db;
     try {
        $req = $db->prepare($sql);
        $res = $req->execute($datas);
        $result = array(
               'status'=> $res,
               'msg'=>'Saisie enregistrée avec success !',
               'debug'=>array("requete"=>$sql, "datas"=>$datas)
              );
      } catch (Exception $e) {
        //erreur dans la requete
        $result = array(
               'status'=>false,
               'msg'=>'Erreur ! '.$e->getMessage(),
               'debug'=>array("requete"=>$sql, "datas"=>$datas)
         );
      } 
       return $result;
    }
    if($id){
       $msg = update_newsletter($url,$img,$text,$id); 
    } else {
      //pas d'ID
      $msg = array( 'status'=>false,
           'msg'=>"Erreur ! ID de ligne vide !",
           'debug'=>$_POST
       );
    }      
    // send data as json format
    echo json_encode($msg);
    J'ai une même variable texte pour le titre et le titre du lien : $text = isset($_POST['text']) ? $_POST['text'] : "";. Après sauvegarde la console m'affiche ceci :
    {"status":true,"msg":"Saisie enregistrée avec success !","debug":{"requete":"UPDATE newsletter
    SET titre = :text WHERE newsletter_id = :id","datas":{":text":"",":id":"11"}}}. Pourtant je récupère bien mon élément dans la popup mais il enregistre un champ vide. Et c'est idem pour le titre du lien. Merci pour votre aide.
    Cordialement,

  2. #2
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    quelque part dans ton code tu dois avoir un "étage" qui sécurise les valeurs présente dans GET et POST. idéalement avec filter_input.

    A ta place de mettrait des var_dump en entree et sortie de cet étage pour voir ce que javascript envoie effectivement au serveur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $text = isset($_POST['text']) ? $_POST['text'] : "";
    ça te protege d'aucune injection de balises et de script

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Re,

    @gene69 merci d'avoir pris le temps de me répondre.
    Un var_dump($text) me renvoi ceci :
    string '' (length=0)
    {"status":true,"msg":"Saisie enregistrée avec success !","debug":{"requete":"UPDATE newsletter SET titre = :text WHERE newsletter_id = :id","datas":{":text":"",":id":"11"}}}

    Je pense que le problème est au niveau de la récupération de la variable pour la passer en $_POST. En javascript je récupère les valeurs de mes variables textes, le titre, le titre du lien et la description de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    big_parent.text($("#sim-edit-title .title").val());
    big_parent.text($("#sim-edit-text .text").val());
    Et ensuite dans mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    toSave = {
          ..........
     
          'text' : big_parent.text()
    };
    Est-ce que ce n'est pas dû au fait la fonction text() ne sait pas quel contenu récupérer ? Puisqu'elle est utilisée pour plusieurs élément, du coup elle met le champ vide. Par exemple : pour l'image et le lien la sauvegarde marche très bien. Pour la variable je l'ai échapée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $text = isset($_POST['text']) ? htmlspecialchars($_POST['text']) : "";

  4. #4
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    salut


    bon pour moi htmlspecialchar n'est pas adapté à une époque ou php prépare autre chose que du html (on prepare du json ou du pdf qui ne s'échappe pas tout a fait pareil). pour moi il ne faudrait pas hésiter a faire le travail en 2 fois. la premiere enlever les caracteres nuisibles binairement et tout ce qu'on ne veux jamais voir (par exemple des ../../../ dans des chemins ou valider que le mail saisi est bien un mail. Apres tu refais une passe spécifique quand tu affiches du html pour que le &gt; s'affiche correctement html 5 n'est pas autant impitoyable que xhtml. je chipotte parce que tu as un code assez bien écrit

    passons.

    je seche un peu pour dire vrai.
    je ne comprends pas le $('body').parent().parent();
    je ne comprends pas du tout ou tu as mis le var_dump(); coté php
    je suis curieux de la valeur de console.info(toSave)/console.log(toSave); dans la console de débug du navigateur.

    apres je suis aussi curieux que tu verifies les parametres qu'on voit transiter dans l'appel ajax sur le volet réseau, comme ça on sera sur de quel coté est l'erreur.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Re @gene69,

    Pour répondre à tes questions :
    Cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    big_parent = $('body').parent().parent();
    n'est pas celle que j'ai écrit dans mon précédent code.
    J'ai écrit ceci dans mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    big_parent = $(this).parent().parent();
    , le $(this) correspond à tous les éléments à l'intérieur du body qui ont la classe : .row-edit-hover i d'ou la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $("body").on('click', ".row-edit-hover i", function(e){}
    .

    Le var_dump(); était sur la variable $titre sur laquelle j'ai fait mon test qui a renvoyé le résultat de la console suivant :

    "status":true,"msg":"Saisie enregistrée avec success !","debug":{"requete":"UPDATE newsletter
    SET titre = :text WHERE newsletter_id = :id","datas":{":text":"",":id":"11"}}}
    Object {id: 11, url: "", img: "", text: ""}

    Il n'y a pas de message d'erreur puisque la requête renvoie un message de success. C'est juste comme elle ne récupère pas les contenu, elle enregistre un champ vide.

    Cdlt,

  6. #6
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    salut,

    donc si on verifie la valeur des entrées php, est ce que la valeur vide vient de là?
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var_dump($_POST);
    //....
    $text = isset($_POST['text']) ? htmlspecialchars($_POST['text']) : "";
    var_dump($text);

    ensuite je suis toujours pas assez fort pour faire sans la sortie de la console JS du navigateur (ctrl+Maj+K sous firefox)

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    console.info(toSave);

Discussions similaires

  1. [VB.NET] Comment sauvegarder des données ?
    Par Aspic dans le forum VB.NET
    Réponses: 14
    Dernier message: 15/07/2007, 15h47
  2. Sauvegarde de données dans fichier csv
    Par issou dans le forum C
    Réponses: 1
    Dernier message: 22/12/2005, 08h36
  3. [debutant][XML] sauvegarde de donnée provenant de textbox
    Par moust dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 28/06/2005, 15h22
  4. sauvegarde des données des tables
    Par tomm dans le forum Bases de données
    Réponses: 18
    Dernier message: 27/04/2004, 21h29
  5. [Kylix] Sauvegarde de donnée utilisateur....
    Par Eclypse dans le forum EDI
    Réponses: 1
    Dernier message: 11/05/2002, 17h21

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