Вмъкване в mysql от php записва поле за дата като 00:00:00 вместо NULL

Получавам чрез POST следните променливи, понякога трябва да е дата, а понякога трябва да е нула (например ако това събитие все още не се е случило)

$hora_entrada = $_POST['hora_entrada'];
$salida_comida = $_POST['salida_comida'];
$regreso_comida = $_POST['regreso_comida'];
$hora_salida = $_POST['hora_salida'];

така че присвоявам NULL на променливите, ако POST е празен:

if ($hora_entrada == '') {$hora_entrada = "NULL";}
if ($salida_comida == '') {$salida_comida = "NULL";}
if ($regreso_comida == '') {$regreso_comida = "NULL";}
if ($hora_salida == '') {$hora_salida = "NULL";}

сега искам да вмъкна стойностите в mysql таблица:

UPDATE  `nomina`.`registro_tiempo` SET  
`hora_entrada` =  '$hora_entrada',
`salida_comida` =  '$salida_comida',
`regreso_comida` =  '$regreso_comida',
`hora_salida` =  '$hora_salida',
WHERE  `registro_tiempo`.`id_tiempo` ='$id_tiempo';
") or die (mysql_error());

проблемът е, че когато променливата е NULL, записът казва 00:00:00 и аз искам да го запазя NULL

Опитах се да присвоя NULL по тези два начина без успех:

$variable = NULL;

$variable = "NULL";

ЗАБЕЛЕЖКА: Полетата на MySql имат стойност NULL като предварително определена.

¿Знаете ли друг начин да направите това? Ще оценя вашата помощ


person yenssen    schedule 27.07.2012    source източник
comment
покажи DESC 'registro_tiempo' моля.   -  person Peon    schedule 27.07.2012
comment
Почти съм сигурен, че кавичките около 'NULL' са това, което го прави. Но трябва наистина, наистина, наистина да прочетете за атаките с инжектиране на SQL!   -  person lc.    schedule 27.07.2012
comment
Колона за време = NULL =› '00:00:00'   -  person Snow Blind    schedule 27.07.2012


Отговори (5)


Причината е, че 'NULL' и NULL са две различни неща за SQL. Вие вмъквате 'NULL' (литералния низ NULL), когато трябва да вмъквате NULL (предварително определената NULL стойност)

UPDATE  `nomina`.`registro_tiempo` SET  
`hora_entrada` =  'NULL',
`salida_comida` =  'NULL',
`regreso_comida` =  'NULL',
`hora_salida` =  'NULL',
WHERE  `registro_tiempo`.`id_tiempo` ='$id_tiempo';
") or die (mysql_error());

Трябва да бъде

UPDATE  `nomina`.`registro_tiempo` SET  
`hora_entrada` =  NULL,
`salida_comida` =  NULL,
`regreso_comida` =  NULL,
`hora_salida` =  NULL,
WHERE  `registro_tiempo`.`id_tiempo` ='$id_tiempo';
") or die (mysql_error());

За да направите лесна корекция е да поставите логика, която да обвие съдържанието с кавички, ако не е NULL:

<?php
$var = $var != "" ? "'" . $var . "'" : "NULL";
$sql = "INSERT INTO MyTable VALUES ('$id', $var)";
?>

И не забравяйте да избегнете съдържанието си (особено ако е предоставено от потребителя!) Вижте http://php.net/manual/en/security.database.sql-injection.php

РЕДАКТИРАНЕ:

<?php
// If the variable is not null/empty, wrap quotes around it. Otherwise, store as NULL
$hora_entrada = $_POST['hora_entrada'] != "" ? "'" . $_POST['hora_entrada'] . "'" : "NULL";
$salida_comida = $_POST['salida_comida'] != "" ? "'" . $_POST['salida_comida'] . "'" : "NULL";
$regreso_comida = $_POST['regreso_comida'] != "" ? "'" . $_POST['regreso_comida'] . "'" : "NULL";
$hora_salida = $_POST['hora_salida'] != "" ? "'" . $_POST['hora_salida'] . "'" : "NULL";

// You should also mysqli_real_escape_string them
$hora_entrada = mysqli_real_escape_string($hora_entrada);
$salida_comida = mysqli_real_escape_string($salida_comida);
$regreso_comida = mysqli_real_escape_string($regreso_comida);
$hora_salida = mysqli_real_escape_string($hora_salida);

"UPDATE  `nomina`.`registro_tiempo` SET  
`hora_entrada` =  $hora_entrada,
`salida_comida` =  $salida_comida,
`regreso_comida` =  $regreso_comida,
`hora_salida` =  $hora_salida,
WHERE  `registro_tiempo`.`id_tiempo` ='$id_tiempo';
") or die (mysql_error());
?>
person justderb    schedule 27.07.2012
comment
Да разбирам. Проблемът е, че искам да вмъкна стойността от променлива. salida_comida = '$променлива', връща 00:00:00 salida_comida = $променлива, връща Имате грешка във вашия SQL синтаксис; и т.н... - person yenssen; 27.07.2012
comment
Можете ли да echo целия си SQL низ и да го публикувате? - person justderb; 27.07.2012
comment
Никога преди не съм чувал за mysqli_real_escape_string, в момента чета ръководството. Отговорът изглежда много интересен. Ще опитам. - person yenssen; 27.07.2012

Ако колоната ви е настроена да позволява NULL стойности, когато искате да вмъкнете NULL, тя не може да бъде в кавички.

Тоест вашата заявка изглежда така в момента:

INSERT INTO `table` (datecol) VALUES('NULL');

но трябва да изглежда така:

INSERT INTO `table` (datecol) VALUES(NULL);

Можеш да използваш:

$variable = "NULL"; // for null values
// and
$variable = "'2012-07-01'"; // for actual date values
person drew010    schedule 27.07.2012

Предполагам, че използвате тип данни в колона TIME, документацията ясно посочва, че когато обектът TIME е невалиден, той по подразбиране е 00:00:00.

http://dev.mysql.com/doc/refman/5.5/en/time.html

Може да искате да добавите булева колона „validDate“ и да я зададете на false, когато е зададена NULL дата.

person Nir Cohen    schedule 27.07.2012

Първо проверете дали $_POST е зададен и след това задайте null

$hora_entrada = $_POST['hora_entrada'];    
if (isset($hora_entrada) && empty($hora_entrada)) {
    $hora_entrada = null;
}
person Justin John    schedule 27.07.2012

person    schedule
comment
За да добавите низ в php, използвате . не + - person justderb; 27.07.2012