[英]PHP/mySQL INSERT NULL if variable is empty
我想检查$_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添加到数据库的更好方法是什么?
PS:数据库单元格有 STANDARD: NULL
如果你想在 MySQL 中插入一个NULL
值,你必须在 SQL 查询中传递一个空值,而不是空字符串。 从 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 注入攻击,您应该使用支持预准备语句的 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();
}
这里有几件事不对。 首先是您使用的是字符串连接而不是准备好的语句。 这让您对 SQL 注入持开放态度。 我建议你现在停止这个项目,在学习使用 PDO 和准备好的语句后回来。
其次, 'NULL' != null
您需要将其指定为null
最后但并非最不重要的一点是,通常不需要显式检查 postvars 中的 null,然后再次传递 null。 如果列类型允许 null 并且您没有传入非 null 值。 null 无论如何都会存储在其中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.