在返回00-00-0000 / 0的DATE或tinyint字段中插入NULL

时间:2014-07-18 09:36:30

标签: php mysql

有谁能告诉我如何正确插入NULL?我似乎无法使其发挥作用。

我的HTML表单填充了$ product_lights_total和$ product_releasedate。当它们在数据库中为NULL时,我选择要编辑的产品,在HTML表单中这些选项显示为空/空白,但是当我提交表单时没有更改,刷新后这些字段变为0和00-00-0000。

我有一堆varchar(xx)列,我与本例中的列一起更新,有时使用与下面相同的方法为NULL,并且它工作正常。那些留空。我把它们从这个例子中移除了以保持尺寸不变。

// First, grab the info needed to populate my HTML form for the selected product
if (isset($_GET['id'])) {
    $id = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
    $get_item_stats = mysqli_query($link, "SELECT * FROM products WHERE id='$id'");
}
$row = mysqli_fetch_assoc($get_item_stats);
if (!$row) {
    $error = 'Error.';
    $link = '.';
    include 'error.php';
    exit();
}
if ($row['lights_total'] == NULL) {
    $product_lights_total = NULL;
} else $product_lights_total = $row['lights_total'];
if ($row['releasedate'] == NULL) { 
    $product_releasedate = NULL; 
} else $product_releasedate = $row['releasedate'];

// if the form is submitted, insert the values present in the form
if(isset($_POST['submit'])) {
    $lights_total = mysqli_real_escape_string($link, $_POST['lights_total']);
    $releasedate = mysqli_real_escape_string($link, $_POST['releasedate']);

    $edit_item = "UPDATE products SET lights_total='$lights_total', releasedate='$releasedate' WHERE id='$productid'";
    $result = mysqli_query($link, $edit_item);
    if (!$result) {
        $error = 'Error.';
        include 'error.php';
        exit();
    }
    else
        // do stuff
}

编辑以显示表格结构:

releasedate DATE DEFAULT NULL,
lights_total tinyint(4) DEFAULT NULL

如果我在mysql中选择这些值,它们将返回NULL(假设它们在我的初始数据库填充中插入了它们)。它们只使用上面的PHP代码从NULL更改。

4 个答案:

答案 0 :(得分:0)

检查日期列的数据类型,它可能是日期或日期时间,它不会取空值。您可以执行以下操作之一 或者为该列设置默认值 或将数据类型更改为varchar 或尝试在表结构中允许null值 希望这有帮助:)

答案 1 :(得分:0)

*强调文本*首先,您应该实际检查POST数据中的值以确保它们具有预期值 - mysqli_real_escape_string()将提供一些SQL注入攻击保护,但不是全部。如果在检查后它是有效的"空白" value,然后插入NULL

要做到这一点,

UPDATE products SET lights_total=NULL, releasedate='$releasedate' WHERE id='$productid'";

没有NULL上的引号

或者,改为使用变量:

$lights_total = "NULL";
UPDATE products SET lights_total=$lights_total, releasedate='$releasedate' WHERE id='$productid'";

在这种情况下引用NULL

答案 2 :(得分:0)

PHP NULL将在您的查询中添加为''。您需要稍微更改一下代码:

$product_lights_total = $row['lights_total'] == NULL 
    ? "NULL" 
    : "'".$row['lights_total']."'";
$product_releasedate = $row['releasedate'] == NULL 
    ? "NULL" 
    : "'".$row['releasedate']."'";

//...

$edit_item = "
    UPDATE products 
    SET lights_total = $lights_total, 
        releasedate  = $releasedate
    WHERE id = $productid";

//...

答案 3 :(得分:0)

您未插入null,实际插入了''

这是因为当转换为字符串时,PHP null是空字符串,并且您在MySQL引号中包装该空字符串。

可以解决它:

"... releasedate = ".($releasedate ? "'".$releasedate."'" : "null")." ..."

但实际上你应该使用预备语句 - 将null传递给它,你将插入null,没有麻烦。