Requête SQL : Valeur enregistrée dans la table : 0 alors que j'attends : NULL...

Résolu/Fermé
Recoh Messages postés 37 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 2 mars 2021 - 5 févr. 2021 à 17:05
Recoh Messages postés 37 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 2 mars 2021 - 5 févr. 2021 à 19:51
J'ai construit une page de formulaire de mise-à-jour de la base de données. J'essaye d'obtenir une valeur NULL mais à la résolution de ma requête, cela affiche un beau zéro ! J'ai testé la requête SQL, via phpmyadmin, et elle fonctionne bien avec un NULL comme voulu, mais dès que je l'exécute par php, la valeur 0 se substitue à la valeur NULL.
J'ai un retour dans la page de résultat qui affiche bien que sur la variable en question
NULL
est décrit.
Donc, je pense que c'est au moment où php remplace la valeur, qu'il comprend et renseigne un 0 dans la requête.
Partie du formulaire concerné :
<select name="menu">
    <option value="NULL">aucun</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>

Script php (avant le html), cela concerne uniquement la valeur
:menu
de la requête SQL :
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
try{
	$bdd =new PDO('mysql:host=sql.free.fr; XXXXXXXX);
	$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
	$sql = 'UPDATE produits SET label = :label, description = :description, prix = :prix, menu = :menu WHERE reference = :ref';	
	$sql_select = 'SELECT * FROM produits WHERE reference = :ref';
	$requete = $bdd->prepare($sql);
	$requete->bindParam(':label',$aa);
	$requete->bindParam(':description',$cc);
	$requete->bindParam(':prix',$bb);
	$requete->bindParam(':menu',$dd);
	$requete->bindParam(':ref',$ee);
	$datas = $aa = htmlspecialchars($_POST['label']);
	$datas = $bb = htmlspecialchars($_POST['prix']);
	$datas = $cc = htmlspecialchars($_POST['description']);
	$datas = $dd = ($_POST['menu']);
	$datas = $ee = ($_POST['reference']);
	$requete->execute();
	$requete = $bdd->prepare($sql_select);
	$requete->bindParam(':ref',$ee);
	$requete->execute();
	while ($row = $requete->fetch()) {
	}
	$requete = null;
	$bdd = null;
} catch (PDOException $e) {
	echo 'Erreur : ',$e->getMessage(),'<br />';
	die();
}
?>

J'ai essayé un
if
, un
do...while
, un
while
et essayé un
CASE...THEN
dans la requête SQL, alors qu'elle fonctionne mais sans trouver la bonne syntaxe... J'ai juste remarqué que la variable
NULL
sans les
'
s'enregistre bien comme NULL dans ma table alors qu'avec
'NULL'
, elle enregistre un 0. Je n'arrive pas à voir à quel moment les
'
sont rajoutés...
A voir également:

3 réponses

Recoh Messages postés 37 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 2 mars 2021
Modifié le 5 févr. 2021 à 17:21
J'ai modifié la colonne menu de ma table pour passer de INT(1) à TINYTEXT(4) mais le résultat est le même via le script php (j'ai laissé coché "NULL" dans les caractéristiques de la colonne menu) : 0 !
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié le 5 févr. 2021 à 17:24
Bonjour,

Ne pas confondre la valeur "NULL" qui est du texte ( et sera remplacé par un 0 si ton champ est de type numerique ( INT, BIGINT .. )
et la valeur NULL qui est bien.. la valeur NULL...

Donc, pour éviter les soucis
Dans ton html
<select name="menu">
    <option value="">aucun</option>
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>


Et côté PHP :
<?php
//---------------------------------------------------------------------------------------//
//affichage des erreurs PHP
//---------------------------------------------------------------------------------------//
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//---------------------------------------------------------------------------------------//
//connexion à la bdd
// Que je placerai dans un fichier à part et que tu pourrais ensuite
// inclure dans tes pages lorsque tu en as besoin
//---------------------------------------------------------------------------------------//
try{
 $bdd =new PDO('mysql:host=sql.free.fr'; XXXXXXXX);
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  } catch (PDOException $e) {
 echo 'Erreur : ',$e->getMessage(),'<br />';
 die();
}
//---------------------------------------------------------------------------------------//
// récupération PROPRE des variables AVANT de les utiliser
//  et on nomme ses variables intelligemment pour pouvoir les retrouver facilement..
// et la fonction htmlspecialchars ne s'utilise QUE POUR de l'AFFICHAGE .. JAMAIS pour l'enregistrement !
//---------------------------------------------------------------------------------------//
$label = !empty($_POST['label']) ? $_POST['label'] : NULL;
$prix = !empty($_POST['prix']) ? $_POST['prix'] : NULL;
$description = !empty($_POST['description']) ? $_POST['description'] : NULL;
$menu = !empty($_POST['menu']) ? $_POST['menu'] : NULL;
$reference = !empty($_POST['reference']) ? $_POST['reference'] : NULL;

try{
//update produits :
 $sql = 'UPDATE produits 
    SET label = :label
    , description = :description
    , prix = :prix
    , menu = :menu 
    WHERE reference = :ref'; 
 $requete = $bdd->prepare($sql);
 $requete->bindParam(':label',$label);
 $requete->bindParam(':description',$description);
 $requete->bindParam(':prix',$prix);
 $requete->bindParam(':menu',$menu);
 $requete->bindParam(':ref',$ref);
  $requete->execute();
  
} catch (PDOException $e) {
 echo 'Erreur : ',$e->getMessage(),'<br />';
 die();
}


//select
try{
  $sql = 'SELECT * FROM produits WHERE reference = :ref'; 
  $requete = $bdd->prepare($sql);
  $requete->bindParam(':ref',$ref);
  $requete->execute();
  $row = $requete->fetchAll(); // on stocke le resultat dans un array
} catch (PDOException $e) {
	echo 'Erreur : ',$e->getMessage(),'<br />';
	die();
}



Un peu de lecture au passage :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code

https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

.



0
Recoh Messages postés 37 Date d'inscription dimanche 19 juillet 2020 Statut Membre Dernière intervention 2 mars 2021
5 févr. 2021 à 19:51
C'est parfait ! J'ai pas pensé au "!" ...
Merci beaucoup, j'ai plusieurs livres sur php, mysql, etc., dommage qu'ils ne traitent pas du PDO en profondeur mais je vais m'en trouver un.
Je peaufine déjà ce que j'ai prévu avec ce petit site et je fais le point sur la sécurisation y des échanges avec sql.
Merci encore, tu vois qu'on peut faire un bond de 10 ans en avant !!
Bientôt php 7, 8...
:)

PS : J'hésite vraiment à utiliser mysqli_ puisque j'ai déjà commencé à utiliser PDO. Peut-être aurais-je dû commencer par mysqli_ ?
0