2011-11-23 146 views
1

縮短目標:通過$ .POST將變量傳遞給PHP文件(get.php),並將get.php傳遞給$ .POST變量再次傳遞給db.php。

我的問題

我想按照我的PHP代碼中的模型 - 視圖 - 控制器設計模式。

我有三個頁面:

  1. 的index.php - 圖形用戶界面(基本HTML和DIV標籤)
  2. get.php - 隱藏的PHP它通過AJAX服務代碼+ POST在index.php文件
  3. 的div
  4. db.php中 - 數據庫連接部分

explanation image http://oi44.tinypic.com/339sz6f.jpg 基本上,我想收到通過兩個POST請求

到目前爲止,我有index.php文件張貼到get.php並請求某些數據,這是通過返回和更新,通過AJAX和jQuery動畫響應。

這裏有一個代碼片段:

function get(div,id,opt_username) { 
$.post('get.php', { request: id }, 
function(response) { 
    // In this order, first fadeout div 
    $(div).fadeOut(600, function() { 

     // If we pass a username as optional parameter... 
     if (opt_username) { 
      //Prepend username onto response 
      response = "     Welcome " + username + response; 
     } 

     // Then get the response back HIDDEN 
     $(div).html(response).hide(function() { 
       // Once completed, parse with XFBML so everything renders 
       FB.XFBML.parse(document.getElementById(div)); 
       // Only after everything's parsed do we fade back in 
       $(div).fadeIn(1100, function() {}); 

     }); 
    }); 
}); 
}; 

現在我能做的POST請求get.php,但如果我嘗試做get.php內同樣的事情發佈到db.php中(執行數據庫操作),這似乎並不奏效。

我的目標

的index.php - >請求數據- > get.php - >請求數據庫連接- > db.php中- >返回數據- > get.php - >返回數據- > index.php

這將允許我使用另一個切換數據庫層。例如,我目前正在使用RDBMS,但我希望在將來切換到XML/RDFXML,這意味着我所要做的就是將db.php換成另一個,並且一切仍然可以工作,保持與MVC。

我的問題

  1. 首先,我實際上可以使一個POST到一個頁面,另一個 POST如果是這樣,爲什麼我會得到下面的錯誤?
  2. 我要對模型視圖控制器方法的正確途徑

進一步解釋

這裏是get.php代碼段(第二頁),它拋出一個錯誤:

$.post('db.php', { test: 2 }, 
    function(response) {}); 

錯誤拋出:

Parse error: syntax error, unexpected '.', expecting T_VARIABLE or '$' 

結論

我根本無法獲得的index.php張貼到get.php,又張貼到db.php中。

+0

您可以將答案發布爲實際答案並接受答案。 – NullUserException

回答

1

實現模型 - 視圖 - 控制器並不意味着您必須創建HTTP請求才能在這些圖層之間進行通信。只需使用includerequire即可包含該文件。通過擁有不同的文件已經存在分離。

+0

如果我爲數據庫連接創建了包含db.php的數據庫連接,那麼我前面的UI將顯示函數和代碼,我打電話來獲取數據庫信息不是嗎?因此,將UI放在前面,另一個PHP中的邏輯和最後一個PHP中的db連接的東西是好的,因爲在原始index.php中包含一些代碼意味着每個人都可以看到函數和方法很容易調用? – Jimbo

+0

@Jimbo:你是什麼意思「顯示」功能?這些功能對於Web客戶端是不可見的。程序員通過包含它們可能會看到它們。但這就是人們使用面向對象編程的原因,現在搞亂了全球範圍。 – CodeZombie

+0

那麼,如果我包含db.php,並且在這個PHP中是連接到數據庫的代碼,那麼有人可以轉到db.php並查看我的源代碼(數據庫位置,用戶名,正在發送的內容等)。就像我通過POST開展工作一樣,一切都隱藏了..對嗎? :)忘了補充一句:如果我這樣做了,那麼當我將來自RDBMS的DB'layer'技術改爲XML/RDFXML時,我將不得不打開我的index.php,並且處理所有事情,如果我有它自己的db.php,然後我可以切換db.php而不必觸摸我的視圖(index.php)或我的邏輯(get.php)。 – Jimbo

2

要做兩個post s嗎?

我不知道你的文件是什麼樣子,但現在我猜測他們都是普通的php文件,當你需要實現該頁面的功能時,你會爲每個頁面複製這些文件,所以我的答案會盡量適應,但正如我所說,我不知道你的文件實際是什麼樣子,所以這可能不適合你的工作方式。

這就是說,基於我的方式認爲你正在使用你的文件,這是我的建議。

而不是嘗試在頁面之間創建兩個帖子,爲什麼不只是將$ _POST數組傳遞給類中的方法?

例如(在僞代碼):

你的index.php(訊息通過AJAX來get.php):

<form action="/uses/ajax/to/post/to/get.php" method="post" name="data_form" id="data_form"> 
    <input type="text" name="data" id="data" /> 
    <input type="text" name="more_data" id="more_data" /> 
    <input type="submit" value="Post this data" /> 
</form> 

<script> 
    // Your ajax post code here 
</script> 

你get.php:

<?php 
$post_data = isset($_POST) ? $_POST : die('No post data was sent'); 

include($_SERVER['DOCUMENT_ROOT'] . '/Model_Object.php'); 

$Model_Object = new Model_Object(); 

// This would echo your response for the ajax 
echo $Model_Object->create_something($post_data); 

然後,您可以創建一個Model類(它包含在您的get.php中),而不僅僅是db.php:

Model_Object.php:

<?php 
class Model_Object { 
    public function create_something($post_data) { 
     $data = isset($post_data['data']) ? $post_data['data'] : ''; 
     $more_data = isset($post_data['more_data']) ? $post_data['more_data'] : ''; 

     // MySQL query here 
     $success = true; 

     if($success) { 
      return 'Completed'; 
     } 

     return 'Failed'; 
    } 

    public function create_something_else($post_data) { 
     return 'This can do a different MySQL query'; 
    } 
} 

這不是做的最好的辦法,但由於你自己的代碼解釋,並基於該方式,我認爲你的代碼工作,這可能是一個解決辦法爲你。

至於以正確的方式進行MVC方法,我不知道這是如何做到最好,但是當我從頭開始編寫MVC應用程序時,我設置了一個.htaccess文件將所有請求路由到根index.php,它將根據URI決定要創建哪個對象以及要執行哪個Controller中的哪個方法。

該方法可能包含一些代碼來顯示視圖,或創建一個與數據庫交互的對象。

如果要創建一個Model,那麼它會將任何相關信息傳回Controller,並且Controller將從那裏做它需要做的事情。

例如,如果我去/my_controller/my_action那麼index.php文件將創建My_Controller對象(如果它存在),並且如果它存在嘗試在該對象中執行一個名爲my_action的方法。

我希望這對你有一些幫助,如果我誤解了,我很抱歉。

+0

我很欣賞你發佈這篇文章所花費的時間和精力,所以非常感謝。然而,我真正想要的是能夠POST到一個頁面,POST到另一個頁面,該頁面一直返回到開頭。使用課程遠離我以後的工作,但我會將你的標記作爲一個有用的答案。 – Jimbo