无法在 PHP 形式中保留空值更新多行



我有一个更新多行的表单。项目,日期为。COMPLETED的默认值为null。在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());

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

感谢

mysql_real_eescape_string()返回一个字符串(如果出错,则返回布尔值),因此$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);

使用prepared语句消除了对mysql_real_eescape_string()的需要,因为变量直接传递到数据库服务器,并作为查询的参数进行处理。如果它已经为null,则可能不需要取消设置($COMPLETED),但这取决于表单的设计方式。

最新更新