繁体   English   中英

PHP/mySQL INSERT NULL 如果变量为空

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM