谁能告诉我如何正确插入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(假设它们是在我的初始数据库填充中插入的)。
你不是在插入null
,你实际上是在插入…''
这是因为PHP null
,当转换为字符串时,是空字符串,并且您正在将空字符串包装在MySQL引号中。
你可以绕过它:
"... releasedate = ".($releasedate ? "'".$releasedate."'" : "null")." ..."
但实际上您应该使用准备好的语句-将null
传递给它,然后您将插入null
,没有问题。
检查日期列的数据类型,它可能是date或datetime,它不会取空值。你可以做以下其中一种为该列设置默认值或者将数据类型更改为varchar或者尝试在表结构中允许空值希望有帮助
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";
//...
*强调文本*首先,您应该实际检查POST数据中的值,以确保它们是预期的值—mysqli_real_escape_string()将提供一些防止SQL注入攻击的保护,但不是全部。如果,在检查它是一个有效的"空白"值后,则插入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