PHP/MySQL插入空值
我正在努力处理一些PHP/MySQL代码。我正在从1表中读取,更改某些字段,然后写入另一个表,如果插入时没有任何反应,并且当我希望在数据库中插入null(该字段允许为空值)时,其中一个数组值为null。它看起来有点像这样:PHP/MySQL插入空值
$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列可能会或可能不会是空
这是使用预处理语句一个例子真的可以节省您一些麻烦。
在MySQL中,以便插入一个空值,则必须在INSERT
时指定,要么离开现场出这需要额外的分支:
INSERT INTO table2 (f1, f2)
VALUES ('String Value', NULL);
但是,如果你想插入一个值现场,你现在必须分支代码添加单引号:
INSERT INTO table2 (f1, f2)
VALUES ('String Value', 'String Value');
预处理语句会自动为你做的。他们知道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。你会为自己节省一个痛苦的世界。
我想你需要引号包围你的{$row['null_field']}
,所以'{$row['null_field']}'
如果你没有引号,你偶尔会得到一个如下所示的插入语句:insert into table2 (f1, f2) values ('val1',)
这是一个语法错误。
如果这是一个数字字段,你将不得不做一些上面的测试,如果在null_field没有价值,明确将其设置为null ..
谢谢,我将不得不增加一些额外的测试,并明确设置的空值,它是更合乎逻辑,该字段为空,而不是空字符串的应用程序。 – MattP 2011-03-16 18:04:15
不幸的是,如果要插入的值为NULL,则引用该字段将不正确。不能在一个字符串中执行整个语句;将会需要像'mysql_query(“insert into table2(f1,f2)values('{$ row ['string_field']}',”。(is_null($ row ['null_field']),“NULL”,“'' {$ row ['null_field']}'“)。”)“'通过创建一个辅助函数可以更容易地读取函数quotedValueOrNull($ value){return(is_null($ value),”NULL“,” '{$ value}'“);}' – ToolmakerSteve 2015-11-04 17:40:11
对于领域,其中NULL
是可以接受的,您可以使用var_export($var, true)
输出string
,integer
,或NULL
文字。请注意,您不会用引号括住输出,因为它们会自动添加或省略。
例如:
mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")");
辉煌的,感谢我现在是一个mysqli转换! – MattP 2011-03-17 10:40:40
@MattP:请注意,PDO具有相同的行为。使用和主要是DB不可知的,mysqli提供更直接的访问MySQL API)。 – outis 2012-01-17 20:44:32
另一个接近 - https://stackoverflow.com/a/20900661/4050261 – 2017-12-05 07:10:59