Renvoyer NULL avec UPDATE

Résolu
Bonjour à tous,

J'ai dans ma base un champ "action" dont la valeur par défaut est NULL
Pas de soucis pour les INSERT
Par contre, si je fais un UPDATE, je n'arrive pas à renvoyer la valeur NULL pour ce champ.
Le mieux que j'aie pu obtenir est un UPDATE `retours` SET `action` = 'NULL' ce qui fait entrer dans ma base la chaine de caratères "NULL" est non pas NULL.

Voici mon code pour la variable $action :

$action=$_POST["action"];
$action = $action == '' ? 'NULL':"'".mysql_real_escape_string($action)."'";


Merci d'avance pour votre aide, je crois que je patouille avec la fonction mysql_real_escape_string...

7 réponses

  1. Contributeur
    bonjour, montre nous le code qui prepare et fait l'UPDATE.
    tu dois obtenir:
    UPDATE retours SET action = NULL

     
    1
    1. Je sais bien, mais c'est là mon problème puisque j'obtiens
      UPDATE retours SET action = 'NULL'
      0
  2. Contributeur
    bonjour, montre-nous le code qui prépare et fait l'UPDATE.
    0
    1. Merci de ta réponse

      Le code pour préparer est dans mon premier message.
      Voici celui de la requête :

      $req="UPDATE `retours` SET `lr` = '$lr', `cial` = '$cial', `date` = '$date1', `client` = '$client', `dpt` = '$dpt', "
      ."`ref` = '$ref',`nolot` = '$nolot',`qte` = '$qte',`longu` = '$longu',`larg` = '$larg',`motif` = '$motif', "
      ." `action` = '$action',`matiere` = '$matiere',`msno` = '$msno',`traite` = '$traite',`nofacture` = '$nofacture',`erreur` = '$erreur',`nomerreur` = '$nomerreur', "
      ."`obs` = '$obs',`reprise` = '$reprise',`cloture` = '$cloture',`coutmatiere` = '$coutmatiere',`coutport` = '$coutport', "
      ."`montantavoir` = '$montantavoir',`noavoir` = '$noavoir',`nodossier` = '$nodossier', `dateavoir` = '$dateavoir',`montantprejudice` = '$montantprejudice',"
      ." `montantmatiere` = '$montantmatiere',`montantfourn` = '$montantfourn',`saisie` = '$saisie'"
      ." WHERE `id` = '$get'";

      0
      1. Contributeur
        et en retirant les apostrophes autour de $action dans le code de la requête?
        0
    2. La déclaration de la table accepte le Null pour ce champ ???
      0
      1. Oui tout à fait. La valeur par défaut est NULL
        0
      2. essaie peut être avec la fonction isnull

        peut être trop pressé 'NULL' est différent de NULL
        enlève les '' ...
        0
      3. @FallentreeSi j'enlève les ' ', ma requète ne fonctionne pas lorsque $_POST["action"] n'est pas vide...
        0
      4. Contributeur
        @isa--si tu enlèves les '', ta requete fonctionne-t-elle quand $_POST["action"] est vide?
        "ma requête ne fonctionne pas": message d'erreur, résultat inattendu?
        peux-tu partager ce que contiennent $action et $req quand $_POST["action"] n'est pas vide?
        0
    3. Contributeur
      tu peux tester avec cet exemple pour comprendre:
      $action1='NULL';
      $action2="'"."action"."'";
      
      echo "<br>";
      echo $action1;
      echo "<br>";
      echo $action2;
      echo "<br>";
      echo "'$action1'";
      echo "<br>";
      echo "'$action2'";
      echo "<br>";
      0
      1. Je reprends un peu ma demande pour que ce soit plus clair :

        Requete : UPDATE `retours` SET `action` = '$action'

        Je récupère $action par $action=$_POST["action"] 

        puis
        $action = $action == '' ? 'NULL':"'".mysql_real_escape_string($action)."'";


        Si $action est vide, je veux que le champ action de ma bdd soit NULL et non pas vide.

        Ce qui n'est pas le cas actuellement car ce que je génère est :
        UPDATE retours SET action = 'NULL'

        à la place de
        UPDATE retours SET action = NULL


        La question est donc comment faire dégager les '' de ma requête si $action est vide ?

        Je pense que le problème vient de ma fonction mysql_real_escape_string($action) que je ne maitrise pas.
        C'est là que j'ai besoin d'aide
        Merci d'avance
        0
        1. $action = $action == '' ? 'NULL' : "'" . mysql_real_escape_string($action) . "'";
          
          $req = 'UPDATE `retours` SET `action` = ' . $action;
          


          Si $action vaut 'toto', $req vaudra :
          UPDATE `retours` SET `action` = 'toto'


          Si $action est une chaine vide, $req vaudra :
          UPDATE `retours` SET `action` = NULL
          0
        2. @PitetJe pense que là on tient le bon bout...
          Je teste et je dis si ça marche

          Merci mille fois
          0
        3. @PitetCa ne marche pas avec
          $req = 'UPDATE `retours` SET `action` = ' . $action;

          Ca marche à priori avec :
          $req = 'UPDATE `retours` SET `action` =  $action;

          Cela te semble - t il cohérent ?
          0
        4. Modérateur
          Bonjour,

          Petite remarque en passant .....
          Dans tes précédents messages... tu utilisais mysqli_* ....
          Alors comment se fait-il que là .. tu aies des instruction mysql_* qui trainent ??
          0
        5. @jordane45Parce que je n'ai déjà pas compris grand chose à la fonction mysql_real_escape_string, alors la fonction mysqli_real_escape_string encore moins

          Les explications du manuel php sont obscures pour moi
          0
      2. Salut,

        Un exemple simple auquel devrait ressembler ton code :
        <?php
        
        if (isset($_POST['action'])) {
        	$action = empty($_POST['action']) ? 'NULL' : "'" . $_POST['action'] . "'"; 
        	//$action = empty($_POST['action']) ? 'NULL' : "'" . mysqli_real_escape_string($_POST['action']) . "'"; 
        	$req = 'UPDATE `retours` SET `action` = ' . $action;
        	var_dump($req);
        }
        
        ?>
        
        <form method="post" action="">
        	<input type="text" name="action">
        	<input type="submit">
        </form>
        


        Bonne journée,
        0
        1. Eh ben voilà... Simple et concis, ça marche...

          Merci mille fois
          Bonne soirée
          0