2013-08-18 77 views
0

我有一個奇怪的時間將所有的字段名作爲PHP中MySQL Query的數組的鍵。所有的值都是從查詢到數組,而不是所有的鍵。我使用JSON對響應進行編碼並將其發送給Android客戶端。PHP沒有寫入MySQL中的所有數組的鍵查詢

以下是JSON Array中包含的JSON Objects之一的原始輸出。正如你所看到的,許多鍵只是數字。數字的順序也不與原始查詢對齊。

08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): { 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "STATE": "1", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "RECEIVER_ID": "29", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "LAST_MODIFIED": "2013-08-17  06:15:01", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "CREATED": "2013-08-07  15:51:25", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "UNIQUE_ID": "cef3fc71-073e-11e3-8ffd-0800200c9a66", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "3": "2", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "2": "29", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "1": "918fa7f5-073c-11e3-8ffd- 0800200c9a66", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "0": "2", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "7": "2013-08-07 15:51:25", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "6": "2013-08-17 06:15:01", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "DATA_RECORD_UUID": "918fa7f5-073c-11e3-8ffd-0800200c9a66", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "5": "cef3fc71-073e-11e3-8ffd-0800200c9a66", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "4": "1", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "ID": "2", 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): "IS_TEST": "2" 
08-18 05:41:49.130: I/GETJSON=ACCESSOR(JSON)(20407): }, 

我已經創造了一個記錄數組使用此項功能:

public function getRowArray($mysql_query_result){ 
    $result=array(); 
    while($row=mysql_fetch_array($mysql_query_result)){ 
     $result[]=$row; 
    } 
    return $result; 
} 

而且查詢結果來自於該塊,與預逃脫mysql_real_escape_string變量:

$ary=mysql_query("SELECT tRelations.ID,tRelations.DATA_RECORD_UUID,tRelations.RECEIVER_ID, 
    tRelations.IS_TEST,tRelations.STATE,tRelations.UNIQUE_ID,tRelations.LAST_MODIFIED, 
    tRelations.CREATED FROM tRelations 
      JOIN tUserData ON (tUserData.UNIQUE_ID=tRelations.DATA_RECORD_UUID) 
      JOIN tUsers ON (tUsers.ID=tUserData.USER_ID) 
     WHERE tUsers.ID=$user_id AND tRelations.last_modified>'$last_sync' 
     ORDER BY tRelations.ID ASC;") or die(mysql_error()); 


    if(mysql_num_rows($ary)>0){ 
     $array2= $this->getRowArray($ary); 

可能任何人都知道鑰匙爲什麼出現故障而不是全部被寫入?或者,其他人是否贊成將MySQL結果轉換爲JSON數組的其他方法?

回答

0

列的順序取決於選擇查詢的順序。

SELECT tRelations.ID,tRelations.DATA_RECORD_UUID,tRelations.RECEIVER_ID, 
    tRelations.IS_TEST,tRelations.STATE,tRelations.UNIQUE_ID,tRelations.LAST_MODIFIED, 
    tRelations.CREATED FROM tRelations 

它說:ID,DATA_RECORD_UUID,RECEIVER_ID,IS_TEST,州UNIQUE_ID並且它也將被以這種方式到陣列加入。您可以將其重新排列爲

SELECT tRelations.STATE,tRelations.RECEIVER_ID,tRelations.LAST_MODIFIED, 
    tRelations.CREATED,tRelations.UNIQUE_ID,tRelations.DATA_RECORD_UUID,tRelations.ID, 
    tRelations.IS_TEST FROM tRelations 

但是,按照該順序很難獲得其他字段。除非您可以使用tRelation.SOME_FIELD as '2'之類的別名,否則您可能必須自己填寫它們。

public function getRowArray($mysql_query_result){ 
    $order=array("STATE", "RECEIVER_ID", "LAST_MODIFIED", "CREATED", "UNIQUE_ID", "3", ....); 
    while($row=mysql_fetch_array($mysql_query_result)){ 
     $newRow = array(); 
     foreach($order as $value) { 
      $newRow[$value] = $row[$value]; 
     } 
     $result[]=$newRow; 
    } 
    return $result; 
} 

按行,並責令這實際上環行中所需列的順序。

在一個側面說明:

你的代碼是非常危險和脆弱的SQL注入。你不應該直接在SQL查詢中放置一個變量的內容!

$user_id = "Somestring with spaces"; 
$last_sync = "2013-08-07 15:51:25"; 
$ary=mysql_query("SELECT tRelations.ID,tRelations.DATA_RECORD_UUID,tRelations.RECEIVER_ID, 
    tRelations.IS_TEST,tRelations.STATE,tRelations.UNIQUE_ID,tRelations.LAST_MODIFIED, 
    tRelations.CREATED FROM tRelations 
      JOIN tUserData ON (tUserData.UNIQUE_ID=tRelations.DATA_RECORD_UUID) 
      JOIN tUsers ON (tUsers.ID=tUserData.USER_ID) 
     WHERE tUsers.ID=$user_id AND tRelations.last_modified>'$last_sync' 
     ORDER BY tRelations.ID ASC;") or die(mysql_error()); 

這將導致

SELECT tRelations.ID,tRelations.DATA_RECORD_UUID,tRelations.RECEIVER_ID, 
    tRelations.IS_TEST,tRelations.STATE,tRelations.UNIQUE_ID,tRelations.LAST_MODIFIED, 
    tRelations.CREATED FROM tRelations 
      JOIN tUserData ON (tUserData.UNIQUE_ID=tRelations.DATA_RECORD_UUID) 
      JOIN tUsers ON (tUsers.ID=tUserData.USER_ID) 
     WHERE tUsers.ID=Somestring with spaces AND tRelations.last_modified>'2013-08-07 15:51:25' 
     ORDER BY tRelations.ID ASC;" 

查詢時看到的缺陷?這是因爲「$ user_id」沒有被轉義。你應該總是使用mysqli_escape_string來逃避你的字符串。例如:

$ary=mysql_query("SELECT tRelations.ID,tRelations.DATA_RECORD_UUID,tRelations.RECEIVER_ID, 
    tRelations.IS_TEST,tRelations.STATE,tRelations.UNIQUE_ID,tRelations.LAST_MODIFIED, 
    tRelations.CREATED FROM tRelations 
      JOIN tUserData ON (tUserData.UNIQUE_ID=tRelations.DATA_RECORD_UUID) 
      JOIN tUsers ON (tUsers.ID=tUserData.USER_ID) 
     WHERE tUsers.ID=".mysqli_escape_string($user_id)." AND tRelations.last_modified>'".mysqli_escape_string($last_sync)."' 
     ORDER BY tRelations.ID ASC;") or die(mysql_error()); 

甚至更​​好:在與數據庫交互時使用PDO(PHP數據對象)。 PDO自PHP 5.1起支持,並允許與數據庫安全交互。它需要多一點代碼,但是會顯着提高PHP應用程序的可讀性和安全性。

+0

我已經在輸入變量上使用了escape_string,所以我不認爲這回答了我的問題。但是,謝謝。 –

+0

感謝您的編輯。字段出現在JSON對象中的順序不是有意的,並且是問題的一部分。我希望它以我在OP中的查詢中的順序出現,即從ID開始,而不是狀態。我不明白爲什麼它不是。 –

+0

通常你應該對JSON的順序太擔心,因爲與JSON的XML不同,沒有方案。當轉換爲對象或數組時,它的名稱不是按順序訪問的。但'json_encode'按照鍵值對的添加順序執行。 '$ json [「first」] = 1; $ json [「second」] = 2; json_encode($ json);'結果在'{「first」:1,「second」:2}'。這可能是mysql在生成行時在內部將字段添加到列表的方式 – Tseng

相關問題