Aller au contenu

PHP/MySQL - variable vide à NULL


ggbce

Messages recommandés

Dans un formulaire que je dois remplir, j'ai des checkbox qui sont soumis à mon code PHP.

Je voudrais savoir comment faire si l'une de mes variables est vide que le INSERT INTO dans ma BD n'envoi pas une variable vide mais laisse mon champs à NULL ?

-------------------------

Exemple d'une partie du formulaire de mapage.php:

<form method="post" action="mapage.php">
<input type="checkbox" name="inform" value="inform" /> Informatique
<input type="checkbox" name="mecano" value="mecano" /> Mécanique
<input type="submit" value="Ajouter">
</form>

<?php
$groupe1 = $_POST['inform'];
$groupe2 = $_POST['mecano'];

mysql_connect('localhost', 'user', 'password') or die("Impossible de se connecter au serveur");
mysql_select_db('informatique') or die("Base de données inexistante");
$sql = "INSERT INTO matable(groupe1,groupe2) VALUES('$groupe1','$groupe2');";
mysql_query($sql) or die ("Erreur d'écriture dans la table");
print ("Ajouté avec succès !");
mysql_close();

Normallement si j'entre des valeurs manuellement dans ma table depuis PHPMyAdmin, si je n'entre rien dans un champs (demeure vide) le champs reste à NULL, mais si la valeur est envoyé par PHP... il envoi une valeur vide mais pas NULL. Il doit surement exister un moyen pour dire que la valeur est NULL si vide ?

Du genre:

if ($groupe1 == '')

{

$groupe1 = NULL;

}

ou dans le INSERT INTO un paramètre additionnel qui spécifie d'être à NULL si vide ?

Mais je ne suis pas encora assez avancé et je ne trouve pas en cherchant avec Google et dans le manuel PHP.

Merci à l'avance !

Lien vers le commentaire
Partager sur d’autres sites

Tu l'écris?

$groupe1 = $groupe1 == '' ? 'NULL':"'".mysql_real_escape_string($groupe1)."'";
$groupe2 = $groupe2 == '' ? 'NULL':"'".mysql_real_escape_string($groupe2)."'";

$sql = "INSERT INTO matable(groupe1,groupe2) VALUES($groupe1,$groupe2)";

Pas besoin du ';' à la fin d'une requête simple

Et aussi on protége toujours les variables POST/GET/COOKIE avant de les injecter dans une requête

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

J'ai essayé d'écrire simplement NULL comme Buldurien m'explique, mais ça ne donne pas le résultat escompté !!!

En réalité ça envoit vraiment à MySQL le texte NULL et non une entrée valant NULL.

Avez-vous une autre solution ?

Lien vers le commentaire
Partager sur d’autres sites

Oui, le champs dans ma base MySQL est de type NULL (et non NOT NULL).

Quand je créé directement une nouvelle entrée dans ma BD (depuis la ligne de commande ou depuis phpmyadmin) je vois bien le champs avec une valeur égale à NULL (écris en italique), mais si j'essai avec ta méthode ça envoi vraiment le texte du mot NULL dans le champs.

Lien vers le commentaire
Partager sur d’autres sites

Je croyais avoir trouvé la solution avec:

void unset ( mixed var , mixed var , mixed ... )

unset détruit les variables var . Notez qu'en PHP 3, unset retournait toujours TRUE (en fait, la valeur entière 1). En PHP 4 toutefois, unset n'est plus une véritable fonction : c'est une structure du langage, ce qui fait qu'elle ne retourne pas de valeur. Lire la valeur retournée par unset (dans une variable, par exemple), retourne une erreur d'analyse.

Exemple avec unset

<?php// Destruction d'une seule variableunset($foo);// Destruction d'un élément de tableauunset($bar['quux']);// Destruction de plusieurs variablesunset($foo1, $foo2, $foo3);?>

----------------------------------------------------

Mais j'ai toujours le même problème :zarb:

C'est comme si lors de l'envoi de la requête SQL pour insérer les données (INSERT), si la variable correspond à rien (vide ou NULL), la requête envoi quand même le vide, mais pas un NULL.

Voici ma requête SQL:

$sql = "INSERT INTO intranet (fullname,user_name,user_passwd) VALUES ('$fullname','$user_name','$user_passwd');";

rien de plus simple...

Lien vers le commentaire
Partager sur d’autres sites

Je réécris ton code en mettant en gras l'erreur (à supposer : fullname VARCHAR(xxx) NULL)

$sql = "INSERT INTO intranet (fullname,user_name,user_passwd) VALUES ('$fullname','$user_name','$user_passwd');";

Ca n'a strictement rien à voir avec le code que je t'ai donné.

Pour t'en rendre compte, echo $sql;

tu verras que NULL est écrit ainsi 'NULL'

Alors que cela devrait être à "VALUES(NULL, ..."

Lien vers le commentaire
Partager sur d’autres sites

heuuu je ne sais pas là non plus si j'ai bien compris ta question mais j'essaye de te trouver une solution : :p

pourquoi ne testes tu pas avant d'insérer dans ta base si ta variable du formulaire a bien affectée avec un truc du genre :

if (isset($fullname) || $fullname<>'')
 $sql = "INSERT INTO intranet (fullname,user_name,user_passwd) VALUES ('$fullname','$user_name','$user_passwd')";

else 
  $sql = "INSERT INTO intranet (user_name,user_passwd) VALUES ('$user_name','$user_passwd')";

je mexplik : si ta variable est affectée ou differente de RIEN :transpi: alors tu inseres bien tes bonnes valeurs, si c pas affecté ou alors qu'il n'y a rien, et ben tu inseres seulement dans user_name et user_passwd... tu verras qu'en procedant ainsi normalement ton fullname devrait rester à NULL... en esperant que ça t'aide...

Lien vers le commentaire
Partager sur d’autres sites

Salut am2d,

Ça peut régler 50% du problème... SI je créé un nouveau formulaire et que j'envoi les données de cette manière c'est ok ! Mais si je dois modifier ce champs par la suite (qu'il n'est pas à NULL, mais que je veux le remettre à NULL) ça ne marchera pas.

Lien vers le commentaire
Partager sur d’autres sites

Tu l'écris?

$groupe1 = $groupe1 == '' ? 'NULL':"'".mysql_real_escape_string($groupe1)."'";
$groupe2 = $groupe2 == '' ? 'NULL':"'".mysql_real_escape_string($groupe2)."'";

$sql = "INSERT INTO matable(groupe1,groupe2) VALUES($groupe1,$groupe2)";

Pas besoin du ';' à la fin d'une requête simple

Et aussi on protége toujours les variables POST/GET/COOKIE avant de les injecter dans une requête

euh... ce code fonctionne... :D :D

am2d : comme c'est super moche ta solution :|

Lien vers le commentaire
Partager sur d’autres sites

Quel version de MySQL et PHP utilises-tu ?

Moi c'est PHP 4.1.2 et MySQl 3.23.58. J'ai essayé ta formule et çe ne passe pas... peut être valide avec MySQL 4 et + ?

L'erreur lorsque j'utilise ta formule:

Fatal error: Call to undefined function: mysql_real_escape_string() in mapage.php on line 48

Et oui... finalement c'est la raison pourquoi çane marche pas:

8.80.50

mysql_real_escape_string()

Protège les caractères spéciaux d'une commande SQL

[ Exemples avec mysql_real_escape_string ] PHP 4 >= 4.3.0, PHP 5

Description

string mysql_real_escape_string ( string unescaped_string , resource link_identifier )

Z'avez-vous une autre solution (sauf bien sur me répondre de changer de version de PHP, ce qui n'est pas possible dans le moment) ?

Lien vers le commentaire
Partager sur d’autres sites

A propos d'injections sql, prenons la requête de am2d :

$sql = "INSERT INTO intranet (user_name,user_passwd) VALUES ('$user_name','$user_passwd')";

Imaginons que l'utilisateur rentre ça pour le password :

x'); DROP TABLE intranet; --

Plus de table intranet... :smack:

ggcbe : c'est mysql_real_escape_string qui pose problème (dispo seulement à partir de PHP 4.3). Remplace par mysql_escape_string.

Lien vers le commentaire
Partager sur d’autres sites

Merci Astero-H pour l'explication et j'ai ensuite lu ce que dit www.php.net au sujet de cette fonction.

Si je comprends bien, la fonction empêche l'utilisation de caractères comme ' afin de ne pas briser la chaîne envoyé à SQL... mais est-ce que ça peut aider au problème de vouloir envoyer une valeur valant NULL ?

Lien vers le commentaire
Partager sur d’autres sites

Bon j'ai essayé la formule mais en utilisant :

$groupe1 = $groupe1 == '' ? 'NULL':"'".mysql_escape_string($groupe1)."'";

Si j'envoi une valeur vide ' ' ça ne fait pas d'erreur... mais ça envoi en texte le mot NULL, et si j'écris une valeur dans le champs, ça ne passe pas... ça me retourne au die() de mysql_query().

nullbug.gif

Première ligne contenant un NULL écrit par une insertion manuelle depuis phpmyadmin ou en ligne de commande.

Lignes du centre où c'est vide, données envoyées par la page PHP sans la fonction si le champs est vide.

Dernière ligne contenant un NULL écrit par la page PHP avec la fonction mysql_escape_string() utilisée.

Lien vers le commentaire
Partager sur d’autres sites

NOTE: Les valeurs devant être à NULL si vide sont: inform, comptab, mecano, groupe4, global et groupe6.

Voici le résultat de la requête SQL (avec mysql_escape_string() et la ligne spécifiée ajoutés), ce qui créé d'ajouter le texte pur du mot NULL quand c'est vide:

UPDATE password_intranet SET fullname='Compte Test', user_name='test', user_passwd='test', ftpfolder='/serveur/ftp/jail', inform='NULL', comptab='NULL', mecano='NULL', groupe4='NULL', global='NULL', groupe6='NULL' WHERE id='52';

Voici le résultat de la requête SQL (sans la modification, comme d'origine) ce qui donne simplement une valeur vide et créé un champs vide non à NULL dans la BD:

UPDATE password_intranet SET fullname='Compte Test', user_name='test', user_passwd='test', ftpfolder='/serveur/ftp/jail', inform='', comptab='', mecano='', groupe4='', global='', groupe6='' WHERE id='52';

La requête était:

$sql = "UPDATE password_intranet SET fullname='$fullname', user_name='$user_name', user_passwd='$user_passwd', ftpfolder='$ftpfolder', inform='$inform', comptab='$comptab', mecano='$mecano', groupe4='$groupe4', global='$global', groupe6='$groupe6' WHERE id='$idm';";

Et voici la structure:

structure_mysql_null.gif

En espérant que ça vous aidera à m'aider !

Désolé Baldurien si je n'ai pas répondu à toutes tes questions la première fois.

Lien vers le commentaire
Partager sur d’autres sites

Oui donc, je sais pas ce que tu as fait :

UPDATE password_intranet SET fullname='Compte Test', user_name='test', user_passwd='test', ftpfolder='/serveur/ftp/jail', inform='NULL', comptab=[b]'NULL'[/b], mecano='NULL', groupe4='NULL', global='NULL', groupe6='NULL' WHERE id='52';

Tu insert à la chaîne NULL. Pas NULL (le mot clef).

UPDATE password_intranet SET fullname='Compte Test', user_name='test', user_passwd='test', ftpfolder='/serveur/ftp/jail', inform=NULL, comptab=NULL, mecano=NULL, groupe4=NULL, global=NULL, groupe6=NULL WHERE id='52';

Lien vers le commentaire
Partager sur d’autres sites

ps : heu certes oui c t quelques peu moche mais bon, (juste pour ma défense :-D) suffit de rajouter 2 ou 3 mysql_escape_string pr empecher les injections de code... c t juste une solution de depan vite pensée... :transpi: (bon d'accord je m'enfonce :-D )

Sinon j'espère que tu y seras finalement parvenu...

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...