Mysql ne me met pas la valeur par defaut

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mysql ne me met pas la valeur par defaut

Re: Mysql ne me met pas la valeur par defaut

par diabless6 » 27 mars 2010, 17:09

Mdr :D

Effectivement, ça marche !

Ya tellement de choses à retenir qu'il n'est pas difficile d'oublier le quart des choses que l'on a appris.

Heureusement quand même qu'il y a des alternatifs aux oublis !

Merci pr la soluce :wink:

Re: Mysql ne me met pas la valeur par defaut

par Calimero » 27 mars 2010, 16:15

Eh bien tu sais quoi... #-o

Parfois une question apparemment anodine sur un sujet qu'on croit maîtriser sur le bout des doigts, pour l'avoir fait un grand nombre de fois, te force à chercher et à remettre tes acquis en question. Et après une petite recherche je me suis rendu compte que j'ignorais jusqu'à aujourd'hui un truc important. :priere:

Voici la page de manuel qui m'a éclairé, dont je te recommande la lecture ( la partie qui nous intéresse est au début ) : http://dev.mysql.com/doc/refman/5.0/fr/insert.html

Il existe apparemment une autre façon de faire ce que tu veux en SQL avec MySQL, le mot-clé SQL DEFAULT, qui est semble t-il conçu exprès pour ça. Cela semble même être une solution très élégante pour toi (et le manuel ne précise pas de restrictions associées à ce mot-clé, contrairement à tout ce que je t'avais dit jusqu'ici, donc on peut légitimement croire que ça va mieux marcher pour toi).

Pour tester, essaye tout simplement de remplacer NULL par DEFAULT dans le dernier code que je t'ai donné (la logique reste exactement la même, on change juste le mot-clé), et dis-nous si ça marche :)

Re: Mysql ne me met pas la valeur par defaut

par diabless6 » 27 mars 2010, 15:24

Bon alors j'ai fait ça :
$mail=$_POST["mail"];

//requêtes
if(!empty($mail))
{$mail = "'".$mail."'";}
else{$mail='\N';}  ou NULL c'est pareil
$requete="INSERT INTO personne VALUES('$id','$nom','$prenom',$mail)";


La condition fonctionne bien.
Mais Mysql me renvoi cette erreur : Erreur d'insersion 1048 : Column 'mail' cannot be null
La colonne ne peut être de type null !

Image

Et si je change la valeur en type null dans Mysql, c'est toujours pareil, la valeur par defaut inscrite dans Mysql ne s'affiche pas.

J'y perds mon latin #-o

Je sens que je vais régler ce problème avec le PHP ça sera plus simple... :roll:
if(!empty($mail))
{$mail;}
else{$mail="à remplir";}
$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";
C'est tout simple comme ça :mrgreen:

Re: Mysql ne me met pas la valeur par defaut

par Calimero » 26 mars 2010, 15:27

if(!empty($mail))
{$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";}
else{$mail=NULL;$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";}
Je pense que ce n'est pas la bonne tournure :mrgreen:
Alors, c'est pas si mal que ça, tu es très bien partie :) il y a juste deux autres petites choses à savoir :

- Le NULL de MySQL n'est pas le même que celui de PHP. (car PHP et MySQL communiquent à travers un flux de texte, le langage SQL, et dans un flux de texte un NULL php n'a aucune représentation particulière), ce qui fait que tu devrais écrire
$mail=NULL; // pas bon
$mail='NULL'; // mieux : c'est une chaîne de caractères, c'est ce qu'il nous faut pour mysql
- Un NULL pour MySQL, c'est là le piège, ne doit pas être entouré de guillemets (puisque ce n'est pas une chaîne de caractères - pas du point de vue de MySQL en tout cas). Il faut donc supprimer les guillemets autour de $mail dans ta requête.

Voilà, si tu fais tout ça, tu vas avoir ta valeur par défaut (puisque tu es passée en NOT NULL) à chaque insertion. La prochaine étape sera de faire en sorte que ton code sache gérer le remplissage ou non du champ mail de ton formulaire (et envoie le NULL si il n'est pas rempli, ou sa valeur entourée de guillemets sinon).
if(!empty($_POST["mail"])) {
  $mail = "'".$_POST["mail"]."'"; // On ajoute les apostrophes ici, elles sont nécessaires si on doit passer autre chose que NULL
  // Attention : il faudrait aussi gérer la sécurité avec mysql_real_escape_string().
} else {
  $mail='NULL';
}

// Ici on a supprimé les guillemets qui sont ajoutés en cas de besoin juste au dessus.
$requete="INSERT INTO personne VALUES('$id','$nom','$prenom',$mail)";

Re: Mysql ne me met pas la valeur par defaut

par diabless6 » 26 mars 2010, 13:16

Bonjour,

Alors oui, ça m'a donné des idées pas très PHP d'ailleurs :D , mais ce que j'essaie ne fonctionne pas :(
ALTER TABLE `personne` CHANGE `mail` `mail` VARCHAR( 20 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL DEFAULT 'a remplir !'
if(!empty($mail))
{$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";}
else{$mail=NULL;$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";}
Je pense que ce n'est pas la bonne tournure :mrgreen:

Re: Mysql ne me met pas la valeur par defaut

par Calimero » 25 mars 2010, 23:36

Bonjour,

Sachant que ta requête est actuellement construite comme ceci :
//$id="\N"; ne semble pas obligatoire
$nom=$_POST["nom"];
$prenom=$_POST["prenom"];
$mail=$_POST["mail"];
//requêtes
$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";
Cela signifie que ta requête, vue par MySQL, donnera quelquechose comme :
INSERT INTO personne VALUES('valeur_id','valeur_nom','valeur_prenom','valeur_mail')
En imaginant que tu n'aies rien mis dans le champ mail de ton formulaire, cela devient :
INSERT INTO personne VALUES('valeur_id','valeur_nom','valeur_prenom','')
Et ce n'est pas bon car ça donne une chaîne vide (délimitée par deux apostrophes successives), et pour mysql une chaîne vide est une valeur comme une autre. Pour déclencher le remplissage du champ avec la valeur par défaut, il y a deux façons de faire, au choix :

- Envoyer à mysql un NULL au lieu d'une chaîne vide (c'est le plus facile à faire par rapport à ton code). Il y a une condition pour que ça marche cependant : il faut que ton champ soit déclaré de type NOT NULL.

- Ne pas inclure le champ dans la liste des champs à remplir à l'insertion, cad dans la première partie de la requête insert. Cette seconde option est un peu plus lourde à gérer pour toi. Néammoins c'est la seule possibilité si ton champ est de type NULL.

Est-ce que tout ça te parle un peu ? :)

Mysql ne me met pas la valeur par defaut

par diabless6 » 25 mars 2010, 23:20

Bonsoir,

Je suis dans la continuité de mon apprentissage, et surtout avec Mysql là.
<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" enctype="application/x-www-form-urlencoded">
<fieldset>
<!--Insertion de donnée Mysql-->    
<legend>Insertion de donnée dans la BDD</legend>
<label>Nom:</label><input type="text" name="nom" size="40" maxlength="30"/>
<label>Prénom:</label><input type="text" name="prenom" size="40" maxlength="30"/>
<label>Mail:</label><input type="text" name="mail" size="40" maxlength="30"/>
</fieldset>
<input type="reset" name="reset" value="Reset"/>
<input type="submit" name="envoi" value="Envoyer"/>
</form>
<?php
include("mysqlconnex.inc.php");
if(!empty($_POST["nom"]) && !empty($_POST["prenom"]) )
{
//$id="\N"; ne semble pas obligatoire
$nom=$_POST["nom"];
$prenom=$_POST["prenom"];
$mail=$_POST["mail"];
//requêtes
$requete="INSERT INTO personne VALUES('$id','$nom','$prenom','$mail')";
$id_con=connexMysql("isis_bdd","paramconnex");
$result=mysql_query($requete,$id_con);
if(!$result)
     {
        echo'Erreur d\'insersion '.mysql_errno().' : '.mysql_error();
     }
else
    {
        echo'Enregistrement reussie ! votre Id:'.mysql_insert_id().'<br/>';
    }
mysql_close($id_con);//déplacé mauvaise position dans le livre (après $result)
}
else {echo'Formulaire à compléter !<br/>';}

?>

</body>
</html>
<!--Affichage des données triées de la BDD-->
<?php

$id_con=connexMysql("isis_bdd","paramconnex");
//requête
$requete="SELECT * FROM personne ORDER BY nom ASC";
$result=@mysql_query($requete,$id_con);
if(!$result)
{
    echo'Lecture impossible !';
}
else
{
    $nbcol=mysql_num_fields($result);
    $nblig=mysql_num_rows($result);
    echo"nombre colonnes = $nbcol (Id,nom,prenom,mail)<br/>";
    echo"nombre lignes = $nblig (entrées actuellement)<br/>";
    echo"Contenu :<br/>";
    while($tab_result=mysql_fetch_array($result,MYSQLI_ASSOC))
    {
        foreach($tab_result as $col=>$val)
        {
        echo"<ul><li>$col = $val</li></ul>";
        
        }
        echo"-----------------";
    }
}
mysql_free_result($result);
?>
Si je ne met pas de mail, mysql devrait me marquer "à remplir !", mais il me marque rien du tout:
* id = 10

* nom = eee

* prenom = eeeee

* mail =

Image

Merci