2011-03-16 74 views
25

我正在努力处理一些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列可能会或可能不会是空

回答

50

这是使用预处理语句一个例子真的可以节省您一些麻烦。

在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。你会为自己节省一个痛苦的世界。

+3

辉煌的,感谢我现在是一个mysqli转换! – MattP 2011-03-17 10:40:40

+5

@MattP:请注意,PDO具有相同的行为。使用和主要是DB不可知的,mysqli提供更直接的访问MySQL API)。 – outis 2012-01-17 20:44:32

+0

另一个接近 - https://stackoverflow.com/a/20900661/4050261 – 2017-12-05 07:10:59

5

我想你需要引号包围你的{$row['null_field']},所以'{$row['null_field']}'

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

如果这是一个数字字段,你将不得不做一些上面的测试,如果在null_field没有价值,明确将其设置为null ..

+0

谢谢,我将不得不增加一些额外的测试,并明确设置的空值,它是更合乎逻辑,该字段为空,而不是空字符串的应用程序。 – MattP 2011-03-16 18:04:15

+0

不幸的是,如果要插入的值为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

4

对于领域,其中NULL是可以接受的,您可以使用var_export($var, true)输出stringinteger,或NULL文字。请注意,您不会用引号括住输出,因为它们会自动添加或省略。

例如:

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