2013-08-31 22 views
0

數組我有一個JSON看起來像這樣:在PHP爆從Json的

{ 
"num_found": 407343, 
"results": [ 
    { 
     "speaker_state": "LA", 
     "speaking": [ 
      "ABC", 
      "DEF", 
      "GHI" 
     ], 
     "speaker_party": "D", 
    }, 

等。我正試圖將這些數據解析到MySQL數據庫中。我改編了以下php代碼:

<?php 

$hostname_ndb = "localhost"; 
$database_ndb = "senate"; 
$username_ndb = "root"; 
$password_ndb = "root"; 
$ndb = mysql_pconnect($hostname_ndb, $username_ndb, $password_ndb) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_select_db($database_ndb); 

$url = "http://xxx.yyy/text.json"; 
$json = file_get_contents($url); 

$out = json_decode($json, true); 

foreach($out["results"] as $results) { 
$speaker_state = $results['speaker_state']; 
$speaking2 = $results['speaking']; 
$speaking = implode('', $speaking2); 
$date = $results['date']; 

mysql_query("INSERT INTO speeches (speaker_state, speaking, date) VALUES('$speaker_state', '$speaking','$date')") or die (mysql_error()); 

} 

?> 

數組中有一個數組,它似乎是問題。該腳本不起作用,數據不存儲在數據庫中。該腳本返回錯誤「您的SQL語法錯誤;請查看與您的MySQL服務器版本相對應的手冊,以便在第1行的'speaking,date'附近使用正確的語法。

PHP日誌顯示通知: 「PHP注意:Array對/Applications/MAMP/htdocs/json.php串轉換上線46」。在php日誌

的var_dump($ speaking2)返回:

array(3) { [0]=> string(713) "XXX" [1]=> string(891) "ZZZ" [2]=> string(1189) 

和等等。 你會如何建議我修改這個腳本以使其工作?

+0

1.這是一個通知,而不是一個錯誤2.什麼顯示'var_dump($ speaking2)' –

+0

我更新了我的問題與更多的信息。 – user1029296

+0

脫離主題,但請注意'mysql_xx()'函數已被棄用,並且不鼓勵使用它們。您應該考慮切換到更好的受支持的數據庫API,例如PDO庫。 – Spudley

回答

3

您的SQL語法有錯誤;檢查對應於你的MySQL服務器版本正確的語法使用附近的手冊「說,到目前爲止,」在1號線

這樣做的原因錯誤是,你正在使用date爲字段名。

date是SQL中的保留字,因此如果將其用作字段名稱或表名稱,將會導致錯誤。

理想情況下,你不應該在你的數據庫表或字段名中使用SQL保留字,但是如果你這樣做了,你需要在back-ticks中包裝名字,以便mySQL接受它們。 (事實上​​,它通常建議好的做法,以做到這一點的所有字段名和表名,不是強制性的,但好的做法)

所以您的查詢應該是這樣的:

INSERT INTO `speeches` (`speaker_state`, `speaking`, `date`) VALUES ('$speaker_state', '$speaking','$date') 

我還要指出你似乎沒有逃避你的輸入數據。您應該使用mysql_real_escape_string()來轉義您放入查詢的任何變量(即$speaker_state,$speaking$date)。不這樣做可能會導致錯誤,並在您的網站容易被黑客攻擊。 (請注意,mysql_xxx()函數已被棄用;理想情況下,您應該使用一組不同的數據庫函數,在這種情況下,將會有不同的方法來轉義變量,但按照事實,您需要使用mysql_real_escape_string()

PHP通知:Array對字符串的轉換在/Applications/MAMP/htdocs/json.php上線46

這是完全不相關的到MySQL錯誤。它可能仍然是一個仍然需要研究的問題,但這不是你所問的SQL錯誤的原因。

如果不知道哪一行是第46行,我不能確定,但​​可能發生的情況是傳入的JSON字符串爲要放入SQL字符串的三個變量之一生成一個數組。你將它們視爲字符串,但其中一個不是字符串。這可能會導致數據損壞,所以您應該查看它。除非看到實際的JSON字符串,否則我什麼都不能告訴,但是您應該使用print_r()var_dump()來檢查變量的內容。

希望有所幫助。

+0

非常感謝您的回答。我添加了後括號。現在的錯誤是:「你的SQL語法有錯誤;查看與你的MySQL服務器版本相對應的手冊,以獲得正確的語法,以便使用接近的健康狀況,擴展訪問高等教育以及我們國家的獸醫的關注」第1行「,這是作爲變量」說話「的一部分的文本的一部分。你確定「說」是一個數組的事實在MySQL查詢中不是問題嗎? – user1029296

+0

@ user1029296。如果你在* content *裏面得到了一個MySQL錯誤,那麼這就進一步證明你沒有正確地轉義東西。你應該這樣做。 ('mysql_real_escape_string'或(更好)'mysqli_real_escape_string'是你的朋友在這裏。) – TRiG

+1

這個錯誤的原因是因爲你沒有遵循我的關於轉義輸入變量的建議。該文本包含一個引號字符,**必須**被轉義。 – Spudley