【问题标题】:PHP/MySQL Insert null valuesPHP/MySQL 插入空值
【发布时间】:2011-07-16 19:37:52
【问题描述】:

我正在为一些 PHP/MySQL 代码而苦苦挣扎。我正在从 1 个表中读取,更改一些字段然后写入另一个表,如果插入并且其中一个数组值为 null 时,我希望它在数据库中插入 null (该字段允许 null 值),则不会发生任何事情。有点像这样:

$results = mysql_query("select * from mytable");
while ($row = mysql_fetch_assoc($results) {
    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', {$row['null_field']});
}

并非每一行都有一个空值,在我的查询中还有更多字段和 2 列可能为空,也可能不为空

【问题讨论】:

    标签: php mysql insert null


    【解决方案1】:

    这是一个使用准备好的语句确实可以为您节省一些麻烦的示例。

    在 MySQL 中,为了插入空值,您必须在 INSERT 时间指定它,或者将需要额外分支的字段省略:

    INSERT INTO table2 (f1, f2)
      VALUES ('String Value', NULL);
    

    但是,如果您想在该字段中插入一个值,您现在必须分支您的代码以添加单引号:

    INSERT INTO table2 (f1, f2)
      VALUES ('String Value', 'String Value');
    

    Prepared statements 会自动为您执行此操作。他们知道string(0) ""null 之间的区别并适当地编写您的查询:

    $stmt = $mysqli->prepare("INSERT INTO table2 (f1, f2) VALUES (?, ?)");
    $stmt->bind_param('ss', $field1, $field2);
    
    $field1 = "String Value";
    $field2 = null;
    
    $stmt->execute();
    

    它会为您转义您的字段,确保您不会忘记绑定参数。没有理由继续使用mysql 扩展。使用mysqli 而它是prepared statements。你会为自己拯救一个痛苦的世界。

    【讨论】:

    • @MattP:请注意,PDO 具有相同的行为。在确定一个之前比较每个 API(PDO 更易于使用并且很大程度上与 DB 无关,mysqli 提供对 MySQL API 的更直接访问)。
    【解决方案2】:

    我认为你需要在 {$row['null_field']} 周围加上引号,所以 '{$row['null_field']}'

    如果您没有引号,您偶尔会得到如下所示的插入语句:insert into table2 (f1, f2) values ('val1',),这是一个语法错误。

    如果是数值字段,则必须在上面做一些测试,如果null_field中没有值,显式设置为null..

    【讨论】:

    • 谢谢,我将不得不添加一些额外的测试并明确设置空值,在应用程序中字段为空而不是空字符串更符合逻辑。
    • 很遗憾,如果要插入的值为 NULL,则引用字段将不正确。不能在一个字符串中完成整个语句;将需要类似mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', " . (is_null($row['null_field']), "NULL", "'{$row['null_field']}'") . ")" 这样的东西,可以通过创建一个帮助函数function quotedValueOrNull( $value ) { return (is_null($value), "NULL", "'{$value}'"); } 来更容易阅读
    【解决方案3】:

    对于可接受NULL 的字段,您可以使用var_export($var, true) 输出stringintegerNULL 文字。请注意,您不会用引号将输出括起来,因为它们将被自动添加或省略。

    例如:

    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")");
    

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 2013-02-01
      • 2019-07-06
      • 2012-10-28
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多