我想检查 $_POST
中的变量是否为空并将 NULL 插入到我的数据库中。
但是当我按照自己的方式操作时,我总是在我的数据集中得到一个名为 NULL 的字符串,而不是真正的 NULL。
我是这样尝试的:
if(isset($_POST['folge'])){
$comment = !empty($_POST['comment']) ? "'".$_POST['comment']."'" : null;
$sqlstring = "INSERT INTO eventstest (comment) VALUES (".$comment.")";
echo $sqlstring;
if ($mysqli->query($sqlstring) === TRUE) {
printf("Table myCity successfully created.\n");
}else{
printf("Errorcode: %d\n", $mysqli->errno);
printf("Error: %d\n", $mysqli->error);
}
如果我发送表单而不对“评论”页面进行输入,则输出为:
INSERT INTO eventstest (comment) VALUES ()Errorcode: 1136 Error: 0
怎么了?或者检查空输入并将 NULL 添加到 DB 的更好方法是什么?
PS: 数据库单元有STANDARD: NULL
最佳答案
如果你想插入一个NULL
值到MySQL中,你必须在SQL查询中传递一个空值,而不是null的字符串。从 PHP 的角度来看,它仍然是一个字符串,但从 MySQL 的角度来看就不是了。
if (!empty($_POST['comment'])) {
$comment = "'".$mysqli->real_escape_string($_POST['comment'])."'";
} else {
$comment = "NULL";
}
您还可以使用三元运算符将其缩短为一行
$comment = !empty($_POST['comment']) ? "'".$mysqli->real_escape_string($_POST['comment'])."'" : "NULL";
然后,因为您在注释字符串本身周围分配了引号,正如您应该做的那样,因为您也想传递一个空值,所以您需要从查询中删除变量周围的单引号。否则这也会破坏它,因为您会得到 ''comment''
。
$sql = "INSERT INTO table (comment) VALUES (".$comment.")";
当然,这假定列 comment
允许空值。否则它将失败,在这种情况下,您应该插入空字符串或更改列以接受空值。
还应注意,此查询会受到 SQL 注入(inject)攻击,您应该使用支持准备语句的 API - 例如 PDO 或 MySQLi,并利用它们来保护您的数据库免受此类攻击。在 MySQLi 中使用准备好的语句看起来像这样。如果 $_POST['comment']
为空,请查看我们如何为 bind_param()
中的值提供 PHP null
。
// Set MySQLi to throw exceptions on errors, thereby removing the need to individually check every query
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
if (isset($_POST['folge'])) {
// $comment = !empty($_POST['comment']) ? $_POST['comment'] : null; // Ternary operator
$comment = $_POST['comment'] ?? null; // Null coalescing operator, since PHP 7
$sql = "INSERT INTO eventstest (comment) VALUES (?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("s", $comment);
$stmt->execute();
$stmt->close();
}
关于PHP/mySQL INSERT NULL 如果变量为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43831252/