无法在更新多行的 php 表单中保留空值

can't preserve null value in php form updating multiple rows

我有一个更新多行的表单。一个项目和日期是完成的。 COMPLETED 的默认值为空。在 php/mysql 我有一个表格来编辑列表。我可以更新 COMPLETED,但是如果我没有在表单中输入一个值,它不会保持为 NULL,它会插入一个日期 0000-00-00。这些功能需要有效日期或 NULL。相关代码如下:

形式:

echo '<form method="post">';            

while ($row=mysql_fetch_assoc($res) )
{   
    echo 'LIST_NUM : ' . $row["LIST_NUM"]. '<br/>';
    echo 'I did this : ' . $row["ITEM_NAME"]. '<br/>';
    echo 'on : <input type="text" name="COMPLETED['. $row["LIST_NUM"] .']" value='.$row["COMPLETED"].'><br/>'."\n";
    echo '<input type="hidden" name="LIST_NUM[]" value="'. $row["LIST_NUM"] .'">'."\n";
    echo '<input type="checkbox" name="delete[]" value="'. $row["LIST_NUM"] .'">'."\n";
    echo "<hr>\n";


}
echo '<input type="submit" name="submit" value="make it so">';
echo '</form>';

插入

foreach ( $_POST["LIST_NUM"] AS $LIST_NUM ) {

$ITEM_NAME =mysql_real_escape_string( $_POST["ITEM_NAME"][$LIST_NUM]);
$COMPLETED = mysql_real_escape_string($_POST["COMPLETED"][$LIST_NUM]);
$update = " UPDATE `UCKET`.`LIST` SET `COMPLETED` = '$COMPLETED' WHERE `LIST`.`LIST_NUM` =$LIST_NUM;";
mysql_query($update) or die( mysql_error());

table 允许 NULL,这是该字段的默认设置。我的直觉是表单字段正在传递一些东西,但我不知道如何允许它在用户输入日期时传递日期,而在表单中未输入任何值时传递 null。

谢谢

mysql_real_escape_string() returns 一个字符串(如果出错则为布尔值),因此您的 $COMPLETED 变量变为空字符串,即 !== NULL。此外, PHP 中的变量类型 NULL 将无法正确转换为您的查询的评估字符串(特别是因为您在查询中引用了 $COMPLETED )。您需要检查 $COMPLETED 是否为空字符串并相应地进行处理。可能是这样的:

if(empty($COMPLETED)) {
   $update = " UPDATE `UCKET`.`LIST` SET `COMPLETED` = NULL WHERE `LIST`.`LIST_NUM` =$LIST_NUM;";
} else {
   $update = " UPDATE `UCKET`.`LIST` SET `COMPLETED` = '$COMPLETED' WHERE `LIST`.`LIST_NUM` =$LIST_NUM;";
}

另一种(更好的)解决方案是使用准备好的语句,这样您就可以将 null 类型的 php 变量直接传递给数据库进行插入,而不是在查询字符串中评估 NULL。

if(empty($COMPLETED)) {
   unset($COMPLETED);
}

$stmt = $mysqli->prepare("UPDATE `UCKET`.`LIST` SET `COMPLETED` = ? WHERE `LIST`.`LIST_NUM` = ?;");

$stmt->bind_param('si', $COMPLETED, $LIST_NUM);

使用准备好的语句消除了对 mysql_real_escape_string() 的需要,因为变量直接传递到数据库服务器并作为查询参数处理。如果 unset($COMPLETED) 已经为 null,您可能甚至不需要取消设置,但这取决于您的表单是如何设计的。