2011-06-26 174 views
0

我仍然混淆有關問題的REST概念。我有一個服務它就像這裏問題的REST概念

include '../includeall.php'; 
$query = Q_GET_FACT_GIVEN_TABLE; 

$i = 0; 
$queryall = null; 
if (isset($_GET['year'])) { 
    $year = $_GET['year']; 
    $queryall[$i++] = "f.year=" . $year; 
} 

if (isset($_GET['period_id'])) { 
    $period_id = $_GET['period_id']; 
    $queryall[$i++] = "f.period_id=" . $period_id; 
} 

if (isset($_GET['month_id'])) { 
    $month_id = $_GET['month_id']; 
    $queryall[$i++] = "f.month_id=" . $month_id;] 
} 

if (isset($_GET['var_in_cat_id'])) { 
    $var_in_cat_id = $_GET['var_in_cat_id']; 
    $queryall[$i++] = "f.var_in_cat_id=" . $var_in_cat_id; 
} 

if (isset($_GET['reg_id'])) { 
    $reg_id = $_GET['reg_id']; 
    if ($reg_id == "prop") 
     $queryall[$i++] = "substring(reg_id,-2)='00' AND reg_id<>'0000'"; 
    else 
     $queryall[$i++] = "f.reg_id=" . $reg_id; 
} 

if (isset($_GET['id_prop'])) { 
    $idprop = $_GET['id_prop']; 
    $queryall[$i++] = "substring(reg_id,1,2)='$idprop' AND substring(reg_id,-2)<>'00'"; 
} 

if (isset($_GET['data_source_id'])) { 
    $data_source_id = $_GET['data_source_id']; 
    $queryall[$i++] = "f.data_source_id=" . $data_source_id; 
} 

for($i=0;$i<count($queryall);$i++){ 
    $queryi=$queryall[$i]; 
    $query.=" AND ".$queryi; 
} 

$query.=" ORDER BY reg_id,month_id"; 

$database = new Database(); 
$queryResult = $database->query($query); 
$resultArray = Utils::convertToJSON($queryResult); 
?> 

我的上面的實現代碼可以稱爲Web服務? 它包含在輸出中的JSON實現作爲用戶在某個url上的請求。 如果它可以分類爲Web服務我有什麼樣的服務? 它可以作爲RESTfull網絡服務調用.. 請幫我..

+0

對不起 - 忽略了上帝的份上那... – calumbrodie

+1

SQL注入! –

+0

在PHP中,您可以使用'[]'運算符將一個元素附加到數組中,而不需要將$ i ++放到任何地方。此外,還有['foreach'](http://php.net/foreach)循環,它總是很方便知道。 –

回答

1

那麼,你可以認爲它是一個Web服務,但它的接口沒有REST方面。我會稱之爲...搜索功能。

REST(代表性狀態傳輸)表示HTTP方法定義你採取行動。例如,DELETE HTTP請求實際上會導致刪除,並且PUT將寫入資源。如上所述,您的應用程序由搜索功能組成,因此不適用。

在PHP中,可以判斷在從$_SERVER['REQUEST_METHOD']請求中使用的HTTP方法。

順便說一下,您不應該初始化$queryall爲空,但array()。您也可以處置$i和只寫$queryall[] = ...而不是$queryall[$i++]

而且,你不應該通過連接輸入字符串來構造數據庫查詢,因爲這樣的代碼使您的應用程序容易受到SQL injections。使用prepared statements可以避免SQL注入漏洞。

+0

非常感謝..我終於明白知道了。所以,如果我想實現我的服務RESTfull概念。我必須設計支持DELETE PUT或其他http請求的服務。感謝我的代碼的建議。我真的是一個Java編碼器。如果你不介意,你能給我一個修改方法來獲得RESTfull概念嗎? – mrhands

+0

@ user816180要使REST適用,您的應用程序必須管理某種類型的數據,並允許用戶添加,編輯和刪除所述數據。然後,你可能會有'switch($ _ SERVER ['REQUEST_METHOD']){case'PUT':write();打破;大小寫:'DELETE':delete();打破; ...}'。順便說一句,正如@OndřejMirtes指出的那樣,你的代碼也容易受到SQL注入的攻擊。當用戶輸入「'時會發生什麼; DROP DATABASE; - 在'year'字段中? – phihag

+0

奧克感謝您的建議。我只是在PHP新手 – mrhands