Partage
  • Partager sur Facebook
  • Partager sur Twitter

Conserver ancienne donnée avec une requête UPDATE

    8 octobre 2021 à 17:08:50

    Bonjour, voici mon soucis :

    Je fait un update dans une table nommée "police", dans cette table j'ai 2 colonne : type_police et prix.
    Quand je décide de modifier une ligne précise de la colonne type_police, sans entré des chiffre pour le prix, il me met une erreur Data truncate (ce qui est normal).

    Et, a contrario, quand je modifie une ligne précise de la colonne prix, sans entré un nouveau nom de police, la requête s'exécute mais la ligne de la colonne type_police est vide.

    Mon but : dans les 2 CAS, je veux garder la valeur du champ qui n'est pas modifier.

    Voici mon code :

    <?php 
        $police_id = $_POST['police_id'];
        $type_police_modif = $_POST['type_police_modif'];
        $prix_police_modif = $_POST['prix_police_modif'];
    
        $req = $pdo->prepare('UPDATE police SET type_police = :type_police, prix = :prix WHERE id = :police_id');
        $req->execute(array(
            'type_police' => $type_police_modif,
            'prix' => $prix_police_modif,
            'police_id' => $police_id));
        $req -> closeCursor();
    ?>



    -
    Edité par Krumy 8 octobre 2021 à 17:10:34

    • Partager sur Facebook
    • Partager sur Twitter
      8 octobre 2021 à 17:31:21

      Il faudrait ne pas faire figurer la colonne qui se retrouverait avec une valeur vide ('') en clause SET dans ce cas ou alors faire un UPDATE pour chaque colonne dont la nouvelle valeur n'est pas '' ...

      ... sauf que ça impliquerait plus de code et éventuellement de construire dynamiquement la requête (si on veut ne faire qu'un UPDATE) donc, AMHA, le plus simple, serait de binder NULL si la valeur est '' de façon à écrire en SET, colonne = COALESCE(:marqueur, colonne) et ainsi garder cette seule requête préparée. Le but étant de prendre la valeur actuelle de la colonne concernée si la valeur en POST est '' soit ne pas la modifier.

      $req = $pdo-&gt;prepare('UPDATE police SET
          type_police = COALESCE(:type_police, type_police),
          prix = COALESCE(:prix, prix)
          WHERE id = :police_id');
      $req-&gt;execute([
          'type_police' =&gt; $type_police_modif == '' ? NULL : $type_police_modif,
          'prix' =&gt; $prix_police_modif == '' ? NULL : $prix_police_modif,
          'police_id' =&gt; $police_id,
      ]);
      

      (ces foutus &gt; sont des >)

      Avec MySQL, on pourrait utiliser un simple IF et garder la chaîne vide plutôt qu'employer COALESCE et en "réécrivant" en PHP '' en NULL (ce qui donnerait colonne = IF(:marqueur = '', colonne, :marqueur) à la place de colonne = COALESCE(:marqueur, colonne) mais cette répétition du même marqueur nommé n'est possible qu'avec l'émulation).

      PS : toujours pour MySQL, ici, les fonctions COALESCE et IFNULL sont interchangeables

      D'ailleurs, comment tu te retrouves avec '' ? Parce qu'en général on remet les valeurs actuelles en value des input.

      -
      Edité par julp 8 octobre 2021 à 18:17:14

      • Partager sur Facebook
      • Partager sur Twitter
        8 octobre 2021 à 17:35:09

        autrement dit, 2 update différents (ou 3 du coup, dans le cas où on change les 2)

        ou récupérer les valeurs avant update, et remettre la valeur qui ne change pas dans le update

        • Partager sur Facebook
        • Partager sur Twitter
          8 octobre 2021 à 21:27:22

          Merci Julp pour cet exposé, je vais essayer demain.

          Et je me retrouve avec un '' car je ne met pas de valeur actuelle dans mes input.

          Umfred, j'ai penser au double update dynamique mais je pense que ça va poser un probleme de secu.

          • Partager sur Facebook
          • Partager sur Twitter
            11 octobre 2021 à 11:46:15

            $sql="UPDATE police SET ";
            if ($type_police_modif!='' AND $prix_police_modif!=0){
               $sql.="type_police = :type_police prix= :prix";
               $params=array($type_police_modif,$prix_police_modif);
            }elseif($type_police_modif=='' AND $prix_police_modif!=0){
               $sql.="prix= :prix_police_modif";
               $params=array($prix_police_modif);
            }elseif[$type_police_modif!='' AND $prix_police_modif==0){
               $sql.="type_police= :type_police_modif";
               $params=array($type_police_modif);
            }
            $sql.=" WHERE id= :police_id";
            $req->prepare($sql);
            $params[]=police_id;
            $req->execute($params);
            • Partager sur Facebook
            • Partager sur Twitter

            Conserver ancienne donnée avec une requête UPDATE

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown