2011-11-23 142 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