如果变量为空,则PHP / mySQL INSERT为NULL

时间:2017-05-07 12:04:10

标签: php mysql null

我想检查来自$_POST的变量是否为空,并将NULL插入我的数据库。

但是当我这样做时,我总是得到一个名为NULL的String,而不是我数据集中的真正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()错误代码:1136错误:0

什么错了?或者,有什么更好的方法来检查空输入并向DB添加NULL?

PS:数据库单元格有STANDARD:NULL

2 个答案:

答案 0 :(得分:6)

如果要在MySQL中插入NULL值,则必须传递空变量。不是null的字符串。从PHP的角度来看,它仍然是一个字符串,但不是从MySQL的角度来看。

if(!empty($_POST['comment'])){
    $comment = "'".$_POST['comment']."'";
}else{
    $comment = "NULL";
}

您还可以使用三元运算符

将其缩短为单行
$comment = !empty($_POST['comment']) ? "'".$_POST['comment']."'" : "NULL";

然后,因为你应该按照你应该的方式在注释字符串本身周围分配引号,因为你或者想要传递一个空值,你需要从查询中删除变量周围的单引号。否则这会打破它,因为你得到''comment''

$sql = "INSERT INTO table (comment) VALUES (".$comment.")";

当然,这假设列comment允许空值。否则它将失败,在这种情况下,您应该插入空字符串或更改列以接受空值。

还应该注意,此查询非常容易受到SQL注入的影响,您应该使用支持预准备语句的API(例如PDO或MySQLi),并利用这些API保护您的数据库免受这类攻击。

答案 1 :(得分:1)

这里有些不对劲。首先,您使用字符串连接而不是预准备语句。这使您可以打开SQL注入。我建议你立即停止这个项目,并在学习使用PDO和准备好的陈述后返回。

其次,'NULL' != null您需要将其指定为null

最后但并非最不重要的是,通常不需要在postvars中显式检查null,然后再次传递null。如果列类型允许为null,则不传入非null值。 null无论如何都将存储在其中