insérer la valeur null date / heure dans mysql avec php provoquant 0000-00-00 / 00:00:00
je vois un couple de questions ici et d'ailleurs, que cette adresse dans certains cas, mais pas tout à fait ce dont j'ai besoin.
je suis en train de travailler avec un script qui stocke un tableau de valeurs pour faire une insertion ou mise à jour en fonction des changements.
certaines dates/horaires et certains sont nulles. je suis en train d'essayer avec $var=NULL, insertion insert into ... ('{$var}') et se 00:00:00 pour le moment si la valeur est null et de l'heure si l'heure est réglée.
d'insertion avec $var="NULL" et l'insérer dans ... ('{$var}') et se 00:00:00 si la valeur est null et de l'heure si l'heure est réglée.
si je supprimer les guillemets pour l'insertion ... ({$var}), il fonctionne si la valeur est null, mais si la date n'est pas null, il ne tient pas.
j'ai un autre champ de type VARCHAR je suis en train de faire la même chose avec et il fonctionne très bien. c'est à dire si il y a une chaîne, il est transmis sous la forme d'une chaîne de caractères et si elle est vide, je suis paramètre var=null. je suis à l'aide de citations sur la requête d'insertion et si c'est null, il va dans comme nulle et si pas null, la chaîne des inserts.
à l'aide d'une instruction conditionnelle va nécessiter un assez grand réécrire, donc je suis l'espoir de l'éviter.
des suggestions sur la façon de faire ce travail sans SI consolidés (si possible), pourrait aider.
grâce.
j'ai testé ce de plusieurs façons et je ne suis pas en mesure d'obtenir les résultats souhaités sans effectuer de la date/heure de champs de type VARCHAR, dont je n'ai pas envie de faire. voici la structure db, insérer des requêtes et des résultats.
id int(11) No None AUTO_INCREMENT
event_new_date_start date Yes NULL
event_new_time_start time Yes NULL
event_link varchar(150) latin1_swedish_ci Yes NULL
$event_new_date_start1 = 'NULL';
$event_new_time_start1 = 'NULL';
$event_link1 = 'NULL';
$event_new_date_start2 = '2011-04-04';
$event_new_time_start2 = '13:13';
$event_link2 = 'http://abc.com';
$event_new_date_start3 = NULL;
$event_new_time_start3 = NULL;
$event_link3 = NULL;
mysql_query("
insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
('{$event_new_date_start1}', '{$event_new_time_start1}', '{$event_link1}')
");
mysql_query("
insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
('{$event_new_date_start2}', '{$event_new_time_start2}', '{$event_link2}')
");
mysql_query("
insert into test_dates (event_new_date_start, event_new_time_start, event_link) values
('{$event_new_date_start3}', '{$event_new_time_start3}', '{$event_link3}')
");
1 0000-00-00 00:00:00 NULL
2 2011-04-04 13:13:00 http://abc.com
3 0000-00-00 00:00:00
quand j'ai changé la date/le temps des champs de type CHAR, il a travaillé comme prévu à l'aide de guillemets dans la requête.
4 NULL NULL NULL
5 2011-04-04 13:13 http://abc.com
6
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à l'aide de guillemets, puis vous dites que vous voulez une date à la chaîne
'NULL'
. MySQL ne peut pas analyser qu'à une date valide, donc il revient à0
.Lors du réglage de la valeur de
$var
, il est justeNULL
ou une chaîne de caractères entre guillemets si elle n'est pas null, alors il suffit d'utiliser({$var})
dans la requête au lieu de('{$var}')
.if (empty($var)) { $var = 'NULL'; } else { $var = "'" . mysql_real_escape_string($var) . "'"; }
. Vous pouvez le faire pour tout$var
, et pas seulement de la date, de sorte que vous pouvez le faire une fois. MySQL ne se plaint pas, même si vous insérez des entiers entre apostrophes ('123'
), de sorte que vous pouvez l'utiliser partout vraiment.rdineiu est bon, le problème, c'est que vous êtes d'insérer le mot "null". MySQL ne veut pas le comprendre et donc au lieu de donner un message d'erreur (comme beaucoup de DBs serait), il insère un temps de tous les zéros. Cela est particulièrement amusant en Java depuis d'essayer de lire cette valeur provoque la levée d'une exception.
La meilleure chose à faire est de passer à des requêtes SQL paramétrées à l'aide de DBO. Vous pouvez trouver un peu plus et quelques liens avec des cette question et la réponse sur le SI. Cela permettra non seulement de résoudre votre problème, mais il permettra de résoudre les (certains) d'injection SQL problèmes qui pourraient se produire avec d'autres valeurs de l'insertion et relire.
Sans le faire (ce qui, encore une fois, et la réponse est la bonne), vous pourriez faire l'insérer sans les guillemets ("({$var})"), et exécutez le jour par l'intermédiaire d'une fonction qui ajoute la nécessaire citations, si elle n'est pas null. Mais ce ne sera pas vous protéger si vous obtenez des valeurs de date directement auprès des utilisateurs, et vous aurez ce même problème si vous avez un champ de type chaîne que vous souhaitez accepter les valeurs null.
MySQL, souvent, n'est complètement stupide des trucs comme ça; voir cette liste utile de MySQL "pièges". Dans ce cas, je m'attends à ce que votre champ de date n'est PAS NULL et votre SQL mode de conformité n'est pas très stricte, ce qui provoque MySQL pour entrer une date par défaut de 0 au lieu de la valeur NULL est que vous avez réellement demandé de le faire. Changer votre schéma d'avoir votre champ de date par DÉFAUT NULL et cela devrait aller.
Notez que cela fonctionnera si vous faites le changement que les autres ont suggéré, par exemple, d'insérer la valeur NULL pas une cité 'NULL'.