5

我通过 POST 收到以下变量,有时它必须是日期,有时它必须为空(例如,如果该事件尚未发生)

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

因此,如果 POST 为空,我将 NULL 分配给变量:

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 值为 Predetermined。

¿ 你知道其他方法吗?我会感谢你的帮助

4

5 回答 5

3

原因是'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());
?>
于 2012-07-27T18:47:27.973 回答
1

如果您的列设置为允许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
于 2012-07-27T18:48:00.850 回答
0

首先检查 $_POST 是否设置,然后分配 null

$hora_entrada = $_POST['hora_entrada'];    
if (isset($hora_entrada) && empty($hora_entrada)) {
    $hora_entrada = null;
}
于 2012-07-27T18:51:43.447 回答
0

我假设您使用 TIME 列数据类型,文档明确指出当 TIME 对象无效时,它默认为 00:00:00。

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

您可能想要添加一个布尔列“validDate”,并在设置 NULL 日期时将其设置为 false。

于 2012-07-27T18:50:03.667 回答
0
$hora_entrada = "'".$_POST['hora_entrada']."'";
$salida_comida = "'".$_POST['salida_comida']."'";
$regreso_comida = "'".$_POST['regreso_comida']."'";
$hora_salida = "'".$_POST['hora_salida']."'";

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

"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());
于 2012-07-27T18:50:08.100 回答