2009-02-14 74 views
2

當我開發我的WebIDE時,我不斷提出我無法回答自己的問題。這是因爲該項目應該幫助其他人創建他們「通常」創建的內容,但速度更快(即儘可能自動化)。有鑑於此,我的問題是如何實現PHP後端?Howto:PHP/Javascript通訊

這就是我所做的。我喜歡創建客戶端JavaScript可以調用的「函數」。通常,我發送一個名爲「action」的變量(通過POST和JSON),其中保存了我所調用的「函數」的名稱(以及我希望發送的任何參數)。 PHP代碼,然後,看起來是這樣的:

if(issset($_POST['action'])) { 
    //function foo(arg1,arg2) 
    if($_POST['action'] == 'foo') { 
     $arg1 = $_POST['arg1']; 
     $arg2 = $_POST['arg2']; 
     //do stuff 
    } 
} 

我仍然可以參考我在PHP創建其他真正的功能,但我發現,這是組織的一切的好方法,容易在這兩個JavaScript來實現和PHP。

你是做什麼的?

編輯1:好的,根據前兩個問題的答案,我不認爲我很好地解釋自己。

我在問你如何創建一個PHP後端。這個想法是,你有用JavaScript編寫的AJAX客戶端(或者別的什麼,它並不重要,),然後它會用POST或GET數據調用你的後端PHP。根據這些數據,你的後端將做它需要做的事情(也許它只是簡單地更新數據庫,甚至可能還會返回信息:它並不重要)。

現在的問題是:你如何告訴它該怎麼做?你通過POST/GET發送了什麼,你如何在後端解釋它?

回答

-1

我做的事情非常相似。你需要的是一個JSON對象來傳遞給JavaScript。完成PHP後,您可以撥打json_encode將對象傳回前端。從那裏你可以用Javascript做更多的事情,或者根據你的需要進行格式化。

有一個類似的問題在這裏的更多信息: Best way to transfer an array between PHP and Javascript

編輯:閱讀你的編輯後,我覺得你在做什麼是好的。當你發送來自Javascript的AJAX請求包含一個像「action」這樣的變量,或者你喜歡的任何東西。從那裏你可以通過一個case和switch語句來查看動作是什麼。

-3

我通常把php函數寫成普通函數。

fn1(arg1, arg2){ 
//do stuff here 
} 
fn2(arg3){ 
//do stuff here 
} 

我將函數名稱傳遞給名爲action的變量。然後執行以下操作:

foreach($_POST as $key => $value) 
$$key = $value; 

分配與參數同名的創建變量。

然後用一個開關情況下調用像這樣適當的功能:

switch($action){ 
case 'fn1':fn1(arg1,arg2); 
break; 
case 'fn2':fn2(arg3); 
break; 
} 

這是你在找什麼?

編輯:您可以使用PHP SOAP and XML-RPC extension開發一個webservice,如果您在SOAP請求中指定了函數名稱,那麼該函數將自動執行(您不必編寫switch-case或if)。我已經在Java中使用它,但我不確定它在PHP中的工作原理。

+2

-1:信任用戶輸入沒有任何驗證和解決register_globals東西是嚴重的安全問題。不要以任何方式將其用於生產代碼。 – Karsten 2009-11-17 20:31:49

0

現在的問題是:你怎麼告訴 它該怎麼做?你通過 POST/GET發送了什麼,你如何在你的後端解釋它 ?

選擇您自己的約定。例如,在告訴動作的JSON數據中使用「動作」值,然後添加更多參數。如果您想查看其他網站的功能,您可以在Firefox中使用Firebug擴展窺探各種網站的Ajax消息。

例如JSON的POST數據可能是:

{ 
    action: "create", 
    fields: { 
     firstname: "John", 
     lastname: "Doe", 
     age: 32 
    } 
} 

爲了您能與新創建的記錄的ID回覆。

要刪除的記錄:

{ 
    action: "delete", 
    keys: { 
     id: 4654564 
    } 
} 

在你可以有一個開關一樣簡單的PHP的AJAX處理程序:

$jsonData = Services_Json::decode($_POST['json']); 
switch ($jsonData->action) 
{ 
    case "save": 
     if (validate_json_data($jsonData->fields)) 
     { 
      UsersPeer::create($jsonData->fields); 
     } 
     break; 
    case "delete": 
     /* etc */ 
} 

// return a json reply with 
$jsonReply = new stdClass; 
$jsonReply->status = "ok"; 
$jsonReply->statusMessage = "Record succesfully created"; 
echo Services_Json::encode($jsonReply); 
exit; 

的Javascript,說原型阿賈克斯。如果「狀態」不是「OK」等,請求響應者功能將在特別創建的DIV中輸出錯誤消息...等等...

+0

我也是這樣做的,但是我將我的javascript POST定位到了URL映射而不是JSON,並且儘量發送儘可能簡單的HTTP POST內容。通過這種方式,您可以從非Ajax觸發器中使用相同的代碼。 (如表單提交) – SchizoDuckie 2009-02-15 00:53:10

0

你需要組織功能?它被稱爲'班'。

/// todo: add error processing 
$name=$_GET['action']; 
$args=json_decode($_GET['args']); /// or just subarray, doesn't matter 

/// 'Action' is constant here but in reality you will need more then one class for this 
/// because you will want modules in your framework 
if(method_exists('Action',$name)) 
    call_user_func_array(array('Action',$name),$args); 
else { /* incorrect parameters processing */ } 

/// Ajax-available functions are here 
class Action 
{ 
    public static function action1() 
    { 
     echo 'action1'; 
    } 
    public static function action2() 
    { 
     echo 'action2'; 
    } 
} 
0

我使用一個處理我的路由的首頁控制器。如果你設置了mod-rewrite,你可以有非常乾淨的端點,其中你的url的第一部分引用控制器(class),然後後面的部分將引用裏面的方法,然後是傳遞給方法的參數。

http://domain.com/class/method/param1/param2

2

我所有的數據發送給後端的一大GET陣列。

actionpage.php行動=交&參數[參數1] =值&參數[參數2] =數值

如果你的print_r($ _ GET),在PHP端你會看到:

array(
    "action" => "create", 
    "parameters" => array("parameter1"=>"value1","parameter2"=>"value2") 
) 

這樣做可以讓你遍歷你的參數。你可以說在pap

if($_GET['action'] == 'create'){ 
     foreach($_GET['parameters'] as $key=>$value){ //something