2011-03-16 80 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).")");