ggbce Posté(e) le 31 janvier 2006 Partager Posté(e) le 31 janvier 2006 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 More sharing options...
Baldurien Posté(e) le 31 janvier 2006 Partager Posté(e) le 31 janvier 2006 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 More sharing options...
ggbce Posté(e) le 4 mai 2006 Auteur Partager Posté(e) le 4 mai 2006 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 More sharing options...
Baldurien Posté(e) le 4 mai 2006 Partager Posté(e) le 4 mai 2006 Ton champ text est bien typé NULL? (ie: NULL peut être mis comme valeur) Regarde aussi la doc voir si y a pas des limitations de ce côté ci. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ggbce Posté(e) le 4 mai 2006 Auteur Partager Posté(e) le 4 mai 2006 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 More sharing options...
ggbce Posté(e) le 4 mai 2006 Auteur Partager Posté(e) le 4 mai 2006 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 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 More sharing options...
Baldurien Posté(e) le 4 mai 2006 Partager Posté(e) le 4 mai 2006 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 More sharing options...
am2d Posté(e) le 5 mai 2006 Partager Posté(e) le 5 mai 2006 heuuu je ne sais pas là non plus si j'ai bien compris ta question mais j'essaye de te trouver une solution : 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 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 More sharing options...
ggbce Posté(e) le 5 mai 2006 Auteur Partager Posté(e) le 5 mai 2006 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 More sharing options...
astero-H Posté(e) le 5 mai 2006 Partager Posté(e) le 5 mai 2006 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 am2d : comme c'est super moche ta solution Lien vers le commentaire Partager sur d’autres sites More sharing options...
Baldurien Posté(e) le 5 mai 2006 Partager Posté(e) le 5 mai 2006 Et toujours PENSEZ AUX INJECTIONS DE CODE LIES AUX VARIABLES GET/POST/COOKIE tss. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ggbce Posté(e) le 5 mai 2006 Auteur Partager Posté(e) le 5 mai 2006 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 More sharing options...
astero-H Posté(e) le 5 mai 2006 Partager Posté(e) le 5 mai 2006 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... 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 More sharing options...
ggbce Posté(e) le 5 mai 2006 Auteur Partager Posté(e) le 5 mai 2006 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 More sharing options...
Baldurien Posté(e) le 5 mai 2006 Partager Posté(e) le 5 mai 2006 Si tu prend mon exemple, et que tu mets à jour ta version de php (car bon...) ou utilise l'autre, ça devrait fonctionner. any way, fait un echo $sql; pour voir ce que tu fais... Lien vers le commentaire Partager sur d’autres sites More sharing options...
ggbce Posté(e) le 5 mai 2006 Auteur Partager Posté(e) le 5 mai 2006 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(). 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 More sharing options...
Baldurien Posté(e) le 5 mai 2006 Partager Posté(e) le 5 mai 2006 bon. Je vais pas le redire 500 fois, mais fais un echo $sql et affiche la requête, et regarde ce qu'elle fait. (et envoie la nous, qu'on voie) Et éventuellement avec structure de la table. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ggbce Posté(e) le 8 mai 2006 Auteur Partager Posté(e) le 8 mai 2006 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: 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 More sharing options...
Baldurien Posté(e) le 8 mai 2006 Partager Posté(e) le 8 mai 2006 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 More sharing options...
am2d Posté(e) le 9 mai 2006 Partager Posté(e) le 9 mai 2006 ps : heu certes oui c t quelques peu moche mais bon, (juste pour ma défense ) 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... (bon d'accord je m'enfonce ) Sinon j'espère que tu y seras finalement parvenu... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.