【问题标题】:can't preserve null value in php form updating multiple rows无法在更新多行的php表单中保留空值
【发布时间】:2016-06-07 23:52:23
【问题描述】:

我有一个更新多行的表单。一个项目和日期已完成。 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());

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

谢谢

【问题讨论】:

  • 答: 将您的列更改为 NULL 作为其默认值。您还可以将三元运算符与前者结合使用。如果你不能改变它的当前状态,或者只是一个三元运算符。

标签: php forms null edit


【解决方案1】:

mysql_real_escape_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);

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

【讨论】:

  • 我很高兴能帮上忙,欢迎来到 StackOverflow。如果这完全回答了您的问题,您会考虑将其标记为您问题的答案吗?谢谢!
猜你喜欢
  • 2015-10-20
  • 2010-11-04
  • 2011-06-29
  • 2015-10-26
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
相关资源
最近更新 更多