PHP/mySQL INSERT NULL 如果变量为空

标签 php mysql null

我想检查 $_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/

相关文章:

PHP 二进制数据 - 不依赖于机器

javascript - 只有 office 版本更改问题

PHP Socket 帮助理解

php - 关于如何使用mysql和php从数据库显示成员信息的问题?

c++ - 如何将整个结构设置为空?

php - 查询结果的输出显示的行数多于应有的行数

Php删除语法

php - 使用随机组件优化和索引查询

Objective-C:为什么在 respondsToSelector: 之前检查 nil?

java - 为什么同时使用CheckForNull和NotNull?