2012-06-26 38 views
0

我有一個JavaScript客戶端將參數傳遞給服務器功能(我正在使用ExtJS Direct)。有時客戶端發送一個對象,有時它會發送一個對象數組。確保PHP變量的最佳方式是一個數組

目前我使用這個EnsureArray功能,保證參數是一個數組,然後我做foreach

// Wraps a non array variable with an array. 
function EnsureArray(&$aVar) 
{ 
    if (!is_array($aVar)) 
     $var = array($aVar); 
} 

function Destroy($aRecords) 
{ 
    // $aRecords might be a single object or an array of objects. Ensure it's wrapped as an array.   
    $this->EnsureArray($aRecords); 

    foreach ($aRecords as $aRecord) 
    { 
     sql("UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1"); 
    }   

    return array(
     'success' => true, 
    ); 
} 

有沒有竅門,更合適的方法,一條線是可以這樣做?

編輯:自發布此問題後,我發現ExtJS有an option發送包裝在數組中的所有記錄。

+5

最好的方法是什麼標準化的客戶端應該發送... :) – deceze

+0

我與此完全一致。 – Izhaki

+1

並考慮修復sql注入 – Venu

回答

4

你可以嘗試以下,而不是功能:

$aRecords = is_array($aRecords) ? $aRecords : array($aRecords); 
+0

如果它應該是一個數組的數組! – CommaToast

0

這可能是最好的方法tbh,如果你不會強制你總是被髮送一個數組。

0

我會做功能Destroy需要數組作爲它的參數:

function Destroy(array $aRecords) { ... } 

客戶端應該然後還總是發送陣列。如果無論出於何種原因,這是不可能的,那麼從客戶端接收(非)數組並將它傳遞給Destroy()的代碼需要負責將它作爲數組傳遞,因爲它是(不合規)客戶和標準化功能。

還有的可能會是每一個可能的行動客戶端可以調用一個端點,所以你甚至不需要弄清楚數據是否是一個數組或沒有,你只是知道。即:

// someaction.php 

include 'destroy.php'; 
$data = json_decode($_POST['data']); 
Destroy($data); 

但:

// anotheraction.php 

include 'destroy.php'; 
$data = json_decode($_POST['data']); 
Destroy(array($data)); 

如果客戶端無法正常發送不同的格式,以同樣的動作,固定客戶。

+0

感謝您的回覆。這是非常豐富的。由於我使用的是ExtJS Direct Package,而且所有的服務器調用都是在一個相當複雜的MVC框架內自動完成的,所以我寧願不修補ExtJS,尤其是Direct包。 Sencha的傢伙有時對他們如何實施事情有充分的理由。我會提供開發人員考慮使呼叫保持一致。我會接受最適合原始問題的答案。儘管如此,非常感謝。 – Izhaki

-1

簡單地強制轉換的變量數組:

function Destroy($aRecords) 
{ 
    foreach ((array)$aRecords as $aRecord) 
    { 
     sql("UPDATE Groups SET deleted = true WHERE id = $aRecord->id LIMIT 1"); 
    }   

    return array(
     'success' => true, 
    ); 
} 

http://php.net/manual/en/language.types.type-juggling.php

+0

當處理一個變量是一個數組或一個原始類型的變量時,這是一個很好的方法,但是它會對象失敗。根據[doc](http://php.net/manual/en/language.types.array.php#language.types.array.casting),「如果一個對象被轉換爲一個數組,那麼結果就是一個數組其元素是對象的屬性。「另外,'(array)null'是空數組,它可能或可能不是你想要的。 – Tgr

相關問題