【问题标题】:Setting variable's database value to NULL instead of empty string将变量的数据库值设置为 NULL 而不是空字符串
【发布时间】:2011-11-11 16:01:12
【问题描述】:

在我的 SQL 数据库中有很多这样的字段: 字段类型:文本空:是默认值:空

我的 INSERT 看起来像这样:

INSERT INTO tbl (col,col,col,...) VALUES ('val','val','val',...)

现在,我的 INSERT 语句值中的那些引号正在将 ''(空字符串)插入到数据库中,而我真正想要的是什么 (NULL)。

所以我尝试了

if (isset($_POST['title'])) {$newTitle = mysql_real_escape_string(trim($_POST['title']));} else {$newTitle = NULL;}

这只是插入'NULL' - 包含单词NULL的字符串。

我可以做些什么来确保我的 NULL 值被正确插入?

【问题讨论】:

    标签: php sql database insert null


    【解决方案1】:

    你所拥有的很好,但你需要将它与准备好的语句结合起来......

     // prepare the statement
        $stmt = $mysqli->prepare("INSERT INTO tbl (title, x,y,z) values (?,?,?,?)");
    
        $stmt->bind_param($newTitle, $x,$y,$z);
    
        $x = 'hello, world';
     // execute prepared statement
        $stmt->execute(); 
    

    如果 x 或 newTitle 为 NULL,则它们在 DB 中将为 NULL

    【讨论】:

    • 是的,Prepared statement 似乎是这里的解决方案。我想我会去了解他们。谢谢!
    【解决方案2】:

    您可以尝试在下面添加不带引号的 NULL 示例:

    INSERT INTO tbl (col,col,col,...) VALUES (NULL,'val','val',...)
    

    还要确保您想要纯 null 的列必须勾选 allowed NULL

    【讨论】:

    • 该列设置为接受NULL,所以我确定数据库是好的。我不希望该值始终为 NULL,除非没有输入任何内容,因此将 NULL 硬编码为值对我来说不是一个选项。问题的核心是我试图避免我的数据库中出现空字符串。当我的 INSERT 值包含在 ' 中(因为它们应该是每个 SQL 语法)时,我似乎只剩下 '' (空字符串)或 'NULL' (包含 NULL 的字符串)。
    • 使用 PHP,您有机会根据需要构建 SQL 字符串。对于每一列,只需检查值并在其周围加上引号,或改用NULL
    • 我认为我的解决方案是在这个,虽然我不熟悉 mysqli 和准备好的语句。看起来我将不得不找到一种方法在 VALUES ('val','val',...) 中添加 ';动态的。
    【解决方案3】:

    不要在 INSERT INTO 中指定字段或提供值。 如果您有 3 个字段,则 f1 f2 f3 而你

    INSERT INTO tbl (f1, f3) VALUES ('something', 'something')
    

    那么f2就不会被插入,默认为null。

    【讨论】:

    • 但如果输入了某些内容,我确实希望插入该值。否则我希望它设置为 NULL
    【解决方案4】:

    我使用 '0' 而不是 null。当您使用 if 语句时,您可以运行类似

    的查询
    if($row['f2'] == 0){...
    

    而不是 null :)

    【讨论】:

    • 这将字符串'0'排除在特定列的有效值之外...
    • 什么意思?它是 MySQL 和 PHP 的有效字符串。我一直使用 0 作为字符串。
    • 您建议不要将空列设置为NULL,而是设置为0。因此,所有值为0 的列都将被假定为空。但是,如果用户确实指定了 0 作为该字段的值,您的代码会认为该列是空的。
    • 是的,然后我取决于用户输入的内容。如果在这种情况下它是一个标题,那么标题可能不会被称为“0”。如果用户确实调用了标题“0”,那么一个简单的 if 语句可以阻止它被插入到数据库中并返回 false。
    • 但是为什么要将空字符串转换为零呢?数据库中的空字符串是有效的、正确的和广泛使用的。使用 NULL 代替是可能的,它们甚至可以节省一点空间。但是'0'''大,那为什么要使用呢?
    猜你喜欢
    • 2013-07-12
    • 2016-11-22
    • 2015-10-19
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多