无法在更新多行的 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,您可能甚至不需要取消设置,但这取决于您的表单是如何设计的。
我有一个更新多行的表单。一个项目和日期是完成的。 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,您可能甚至不需要取消设置,但这取决于您的表单是如何设计的。