我有可选的日期和时间表单字段,这些字段被组合成一个DATETIME-friendly字符串,然后发送到MySQL数据库。相关的MySQL列数据类型是DATETIME,默认值为NULL。当日期和时间字段完成时,它将正确保存;但是,当这些可选表单字段为空时,datetime将存储为0000-00-00 00:00:00而不是NULL。它需要存储为NULL,而我不知道为什么不是。
$Date_Query_Received1 = mysqli_real_escape_string($conn, $_POST['Date_Query_Received']);
$Date_Query_Received2 = implode("-", array_reverse(explode("/", $Date_Query_Received1)));
$Time_Query_Received1 = mysqli_real_escape_string($conn, $_POST['Time_Query_Received']);
$Time_Query_Received2 = $Time_Query_Received1.':00';
if (empty($_POST['Date_Query_Received']) || empty($_POST['Time_Query_Received'])) {
$Date_Query_Received = NULL;
$Time_Query_Received = NULL;
} else {
$Date_Query_Received = $Date_Query_Received2;
$Time_Query_Received = $Time_Query_Received2
}
$Date_Time_Query_Received = $Date_Query_Received.' '.$Time_Query_Received;
mysqli_query($conn, "INSERT INTO log (Date_Time_Query_Received) VALUES ('$Date_Time_Query_Received')";表单日期为DD/MM/YYYY格式,因此implode(...array_reverse(...))将转换为MySQL友好的DATETIME YYYY-MM-DD格式。同样的情况也适用于将':00‘附加到时间值,因为表单字段jQuery时间选择器是为hh:mm设置的--不需要秒。
也许这与SQL语句中围绕$Date_Time_Query_Received的引号有关;但是,如果没有这些引号,查询就会失败。
发布于 2016-01-20 20:19:25
因此,如果您查看您的查询,您将尝试将date列设置为字符串' ',这显然不会使MySQL高兴。不过,这是一个非常宽容的数据库, column,也就是0000-00-00 00:00:00。
那么,如何从PHP向数据库传递空值呢?尝试使用准备好的语句如下:
if (empty($_POST['Date_Query_Received']) || empty($_POST['Time_Query_Received'])) {
$Date_Time_Query_Received = NULL;
} else {
$Date_Query_Received2 = implode("-", array_reverse(explode("/", $_POST['Date_Query_Received'])));
$Time_Query_Received2 = "$_POST[Time_Query_Received]:00";
$Date_Time_Query_Received = "$Date_Query_Received2 $Time_Query_Received2";
}
$stmt = $conn->prepare("INSERT INTO log (Date_Time_Query_Received) VALUES (?)");
$stmt->bind_param("s", $Date_Time_Query_Received);
$stmt->execute();除了使传递空值更容易,您还比使用mysqli_real_escape_string()更有效地保护自己免受SQL注入攻击。
https://stackoverflow.com/questions/34905747
复制相似问题