Requête préparée en insert et colonne "not null"

Requête préparée en insert et colonne "not null" - PHP - Programmation

Marsh Posté le 20-04-2007 à 00:23:53    

Salut :)
 
J'ai un truc qui me rend fout depuis tout à l'heure.
 
Mysql 5, pdo, requête préparée pour un insert multiple, si sur un attribut de type not null je lui colle rien ou un truc interdit il me colle une valeur par défaut alors qu'il y en a pas de définie. Cette valeur semble en lien avec le type int=>0, varchar=>chaine vide
 
Je précise que cette même requête ne passe sans requête préparée vu que la valeur pour l'int en question est signée et que donc par exemple ça donne '-' sans chiffre.
 
Pourquoi? Un moyen de pallier à ce vilain défaut?

Reply

Marsh Posté le 20-04-2007 à 00:23:53   

Reply

Marsh Posté le 20-04-2007 à 16:51:59    

Alors en fait, après un repos nocturne, j'ai dit une petite bêtise hier :D
 
C'est un float, et après retest, en lui donnant un null ça bloque bien, en revanche vu qu'il est signé, si je lui balance une chaine concaténée avec le signe et null ça me fou 0, normal me direz vous une fois casté :whistle:
 
Donc je vais faire autrement et tester la valeur avant mais y'a t-il quand même un moyen qu'en requête préparée, pdo ne cast pas la valeur passée?

Reply

Marsh Posté le 20-04-2007 à 18:34:19    

leflos5 a écrit :

Alors en fait, après un repos nocturne, j'ai dit une petite bêtise hier :D
 
C'est un float, et après retest, en lui donnant un null ça bloque bien, en revanche vu qu'il est signé, si je lui balance une chaine concaténée avec le signe et null ça me fou 0, normal me direz vous une fois casté :whistle:
 
Donc je vais faire autrement et tester la valeur avant mais y'a t-il quand même un moyen qu'en requête préparée, pdo ne cast pas la valeur passée?


Anormal si tu bosses en mode ANSI NULL, puisque la présence de n'importe quel côté de n'importe quel oppérateur donne comme résultat NULL selon la norme ANSI (fonctionnement similaire au symbol INFINI mathématique).

Reply

Marsh Posté le 20-04-2007 à 18:35:25    

sinon, pour le coup du cast implicite, vu que PHP n'utilise pas de variables typées, à mon avis c'est rapé.
 
par contre, je suis étonné que null + "" retourne 0 une fois casté en nombre :heink:

Reply

Marsh Posté le 21-04-2007 à 02:50:49    

Non c'est +null ou -null, me suis peut être mal exprimé :whistle:
 
C'est justement en pensant à ça que j'ai testé et vu que (float)-null donne 0 :D
 
Donc j'en déduis que pdo cast implicitement, pas php mais bien pdo :)
Puisque en requête à l'ancienne ça plante (c'est moi qui dirige :d ) mais en préparé je passe la valeur à pdo et là visiblement il transforme le truc (normal vu qu'il doit au moins nettoyer la valeur en l'échappant), mais rapproche t-il le type de l'attribut pour faire un cast implicite :??:
 
 
Après test, concernant php:
(float)-null => null soit 0 mais en fait null n'est pas de type null  :ouch: (==null mais !===null)
(float)null- => ça donne rien dans le null :D

Reply

Marsh Posté le 21-04-2007 à 03:00:18    

Hé bé, php c'est vraiment, de la merde...
Dans le même temps  

Code :
  1. $var = 0;
  2. if(empty($var))


 
Renvoie true, j'ai jamais pris de cours de prog, mais c'est un peu con non?


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 21-04-2007 à 03:23:23    

en PHP, ne fais jamais confiance au nom d'une fonction pour savoir ce qu'elle fait, sauf si elle contient "real", et si t'as dla chance ... :o


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 21-04-2007 à 04:13:27    

Shinuza a écrit :

Hé bé, php c'est vraiment, de la merde...
Dans le même temps  

Code :
  1. $var = 0;
  2. if(empty($var))


 
Renvoie true, j'ai jamais pris de cours de prog, mais c'est un peu con non?


0 c'est pas rien  :o  
Empty ça veut dire ce que ça veut dire, donc rien, un poil de cul, un null, 0 c'est pas rien, c'est un poil de cul, un null ou un 0  :kaola:  
 
Pour parler concrètement, t'as un verre, il est propre ou a déjà servi (je passe le cas du verre mal lavé  :o ), il est propre (vide de chez vide) ou a servi (vide mais déjà utilisé). Null c'est pas vide, ça a servi, mais y'a plus rien  :whistle:

Reply

Marsh Posté le 21-04-2007 à 09:56:22    

leflos5 a écrit :

Non c'est +null ou -null, me suis peut être mal exprimé :whistle:
 
C'est justement en pensant à ça que j'ai testé et vu que (float)-null donne 0 :D
 
Donc j'en déduis que pdo cast implicitement, pas php mais bien pdo :)
Puisque en requête à l'ancienne ça plante (c'est moi qui dirige :d ) mais en préparé je passe la valeur à pdo et là visiblement il transforme le truc (normal vu qu'il doit au moins nettoyer la valeur en l'échappant), mais rapproche t-il le type de l'attribut pour faire un cast implicite :??:
 
 
Après test, concernant php:
(float)-null => null soit 0 mais en fait null n'est pas de type null  :ouch: (==null mais !===null)
(float)null- => ça donne rien dans le null :D


c'est nul ton truc :D
 
oui, PDO fait, et doit faire, un cast implicite de ta valeur vers le type attendu (même normalement, il ne devrait accester que le type choisi en entrée, mais vu qu'en PHP les variables sont pas typables...)
par contre qui dit "cast implicite" ne veut pas dire "n'importe quoi".
et là, PHP et/ou PDO font un bon mic mac.
 
anyway : teste tes variables avant de les envoyer, ce sera plus simple ;)

Reply

Marsh Posté le 21-04-2007 à 09:59:11    

sinon, pour le coup du "isempty", j'ai une pierre à rajouter.
 
Vu le nom de la fonction, c'est maxim pompé sur VB, et en VB, IsEmpty(variable) retourne effectivement true pour un type de valeur.
 
IsNull() => Teste la valeur (type de valeur uniquement) et retourne true si c'est le néant total.
IsObject() => Teste si la valeur est un pointeur vers un objet.
IsEmpty() => Teste si la valeur est un pointeur vers un objet non instancié ou un Array() sans éléments.
 
 
=> Du coup, un IsEmpty() devrait planter sur un type de valeur, car il n'est pas fait pour ça. Par contre, un vu qu'un type de valeur ne pointe pas sur un objet instancié, ni un tableau rempli de valeurs... bah il est tout naturel de retourner true ;)


Message édité par MagicBuzz le 21-04-2007 à 10:04:26
Reply

Marsh Posté le 21-04-2007 à 09:59:11   

Reply

Marsh Posté le 21-04-2007 à 10:00:39    

IsSet() mais ça je sais plus dans quel langage c'est, indique si la variable à sa valeur par défaut ou non (types de valeur uniquement).

Reply

Marsh Posté le 21-04-2007 à 12:02:55    

Isset en php vérifie qu'une variable existe, quelque soit sa valeur genre
 
--fuck.php?you
 

Code :
  1. if(isset($_GET['you']))


 
Renverra true, et
 

Code :
  1. if(empty($_GET['you']))


 
Renverra true également
 
Après pour les autres languages je sais pas :D
 

leflos5 a écrit :

0 c'est pas rien  :o  
Empty ça veut dire ce que ça veut dire, donc rien, un poil de cul, un null, 0 c'est pas rien, c'est un poil de cul, un null ou un 0  :kaola:  
 
Pour parler concrètement, t'as un verre, il est propre ou a déjà servi (je passe le cas du verre mal lavé  :o ), il est propre (vide de chez vide) ou a servi (vide mais déjà utilisé). Null c'est pas vide, ça a servi, mais y'a plus rien  :whistle:


Allo? Je sais bien, je dis justement que dire que 0 est empty c'est con.
Tu peux transporter un tableau de valeur ou tu veux avoir des zéros, mais ou tu peux avoir du vide, et la t'es baisé, obligé d'utiliser un truc trivial pour simuler un comportement intélligent


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 21-04-2007 à 13:51:45    

Ah putain j'avais pas fait gaffe à ton code  :ouch: J'aurais jamais dit que ça retournerait vrai...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed