2014-05-24 124 views
-1

我的JSON是將PHP Web服務如何讀取JSON

{"users":[{"UserName":"user1","FullName":"Name One"}, 
{"UserName":"user2","FullName":"Name Two"}]} 

我的PHP是

<?php 
include '../inc/connect.php'; 
include '../inc/class/mysql.class.php'; 

$data = file_get_contents('php://input'); 
$array = json_decode($data, true); 

$rows = array();          
foreach ($array['users'] as $parentvalue) 
    foreach ($parentvalue as $key => $value) 
     $rows[] = "('" . $value . "', '" . $value . "')"; 

$values = implode(",", $rows); 

try 
{ 
    $count = mysql_query("INSERT INTO users (UserName, FullName) VALUES $values") or die(mysql_error()); 
} 
catch(PDOException $e) { //later 
} 
?> 

陣列的結構

Array 
(
[users] => Array 
    (
     [0] => Array 
      (
       [FullName] => Name One 
       [UserName] => user1 
      ) 
     [1] => Array 
      (
       [FullName] => Name Two 
       [UserName] => user2 
      ) 
    ) 
) 

而不是插入的數據:
** user1 - 姓名
** user2 - 姓名Tw Ø
到MySQL的

它插入
**用戶1 - USER1
**名稱一 - 一個命名爲
**用戶2 - user2的
**名稱的兩個 - 名稱的兩個

請幫忙!

+1

你至少應該確保'$ values'包含它應該包含的內容,然後插入它。 – Yang

+0

此外,你正在使用PDO與mysql_函數混合,這是不會工作的... –

+0

@PhilipAdler你到底在哪裏看到PDO? – Yang

回答

2

/******** EDIT(以下上一頁答案)*********/

這是我的新代碼。我根據您的意見修改了您的JSON結構。

//added addresses as an example (no the postcodes aren't real :P) 
$json='{ 
    "users":[ 
     {"UserName":"user1","FullName":"Name One"}, 
     {"UserName":"user2","FullName":"Name 2"} 
    ], 
    "addresses":[ 
     {"HouseNumber":"1","PostCode":"LS1 1PS"}, 
     {"HouseNumber": "23", "PostCode": "LS1 2PS"} 
    ] 
}'; 



$data=json_decode($json); 

//loop over each 'table' 
foreach ($data as $table_name=>$data_array){  
$table_name=mysql_real_escape_string($table_name); 

//loop over each 'row' in table 
foreach($data_array as $current_obj){ 
    $current_sql="INSERT INTO ".$table_name." SET "; 
    $row=array(); 

    //loop through 'row' data and get 'column' name and value. 
    foreach($current_obj as $name=>$value){ 
     $row[]='`'.mysql_real_escape_string($name).'` = "'.mysql_real_escape_string($value).'"'; 
    } 

    $current_sql.=implode(',',$row); 
    mysql_query($current_sql); 
    unset($current_sql,$name,$value); 
    } 
} 

現在,雖然此代碼將做你問我可能不會使用它自己。對於不同的表,我會在Web服務中使用不同的端點(並使用GET,POST,PUT等http請求來確定操作 - 請參閱REST Web服務) - 雖然它的工作量更多,但明確定義的操作使調試更容易,應用程序更安全(因爲你會確切地知道它在做什麼和該做什麼)。

至於認證,這是一個單獨的問題,我不能真正進入這裏。請不要以冒犯性的方式來表達我的意思,但如果您是開發新手,我會建議花更多的時間學習,然後再嘗試做好任何生產準備 - 保護您和您的客戶。

無論如何,我希望這會有所幫助。

問候

瑞安

/******* OLD答案 - 離開這裏CLARITY ****************/

我相信你不需要第二個循環。這是我(修改以滿足您的需要):

$json='{"users":[{"UserName":"user1","FullName":"Name One"},{"UserName":"user2","FullName":"Name 2"}]}'; 
$data = json_decode($json); 

$rows = array(); 

foreach ($data->users as $user_obj){ 
    $rows[]='("'.$user_obj->UserName.'","'.$user_obj->FullName.'")'; 
} 

$values = implode(",", $rows); 
echo "INSERT INTO users (UserName, FullName) VALUES ".$values; 

另外,我會建議你做準備的語句或至少是mysql_real_escape_string使用。

希望這有助於

瑞安:)

(詩我停下json_decode的對象轉換成數組,因爲它覺得它是有幫助的,知道什麼時候的數據結構應該是迭代的,當它不 - 如果你喜歡,隨時更換它。)

+0

嗨@Ryan!謝謝!它正在工作。但我希望如果可能的話,需要一個對象名稱的東西,這樣我就可以重用所有表上的所有插入的web服務。 – Raii

+0

'mysql_real_escape_string' - 好的,我會研究這一個。 '準備好的陳述' - 我不知道你的意思。大聲笑。對不起,我是一個新手! – Raii

+0

夠公平的,給我兩分鐘,我會再提供一些代碼。不要擔心成爲一個新手,我們都在那裏! mysql_real_escape_string或預準備語句只是通過轉義數據來保護數據庫免受SQL注入攻擊。我會將它們包含在我的更新中,以便您可以看到。 –

1

爲了便於閱讀,我略微改進了代碼。你會體會到的第一件事是,你這裏處理問題:一個是解析JSON響應,而第二個被插入記錄到表:

$json = '{"users":[{"UserName":"user1","FullName":"Name One"}, 
{"UserName":"user2","FullName":"Name Two"}]}'; 

$values = buildArray($json); 
insertValues($values); 


function buildArray($json) { 

    $result = array(); 
    $array = array_values(json_decode($json, true)); 

    foreach ($array as $index => $nestedArray) { 
     foreach($nestedArray as $index => $value) { 
      $result[] = $value; 
     } 
    } 

    return $result; 
} 



function insertValues(array $values) { 

    foreach($values as $index => $array) { 

     $query = sprintf("INSERT INTO `users` (`UserName`, `FullName`) VALUES ('%s', '%s')", 
      mysql_real_escape_string($array['UserName']), 
      mysql_real_escape_string($array['FullName']), 
     ); 

     if (!mysql_unbuffered_query($query)) { 
      return false; 
     } 
    } 

    return true; 
} 
+0

謝謝@djay!但我希望如果可能的話不需要對象名的東西,這樣我就可以重新使用webservice來處理所有表上的所有插入。 – Raii

+0

功能的一點是代碼重用性 – Yang

+0

但我不確定。你認爲使用對象就像是最佳實踐嗎?或者可能使用數組更有效率? – Raii