缩短目标:通过$ .POST将变量传递给PHP文件(get.php),将get.php传递给$ .POST,将变量再次传递给db.php。
我的问题
我正在尝试在PHP代码中遵循模型 - 视图 - 控制器设计模式。
我将有三页:
explanation image http://oi44.tinypic.com/339sz6f.jpg 基本上,我希望通过两个POST请求
收到回复到目前为止,我将index.php POSTING到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() {});
});
});
});
};
现在我可以对get.php执行POST请求,但如果我尝试在get.php中执行相同的操作以发布到db.php(以执行数据库操作),这似乎不起作用。
我的目标
index.php - > 请求数据 - > get.php - > 请求数据库连接 - > db.php - > 返回数据 - > get.php - > 返回数据 - > index.php
这将允许我用另一个切换数据库层。例如,我目前正在使用RDBMS,但我希望将来切换到XML / RDFXML,这意味着我所要做的就是将db.php转换为另一个,所有内容仍然有效,并保持与MVC。
我的问题
进一步说明
以下是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 :(得分:2)
你有做两个post
吗?
我不知道你的文件是什么样的,但是现在我猜它们都是常规的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
对象以及该Controller
中要执行的方法。
该方法可能包含一些代码来显示视图,或者创建一个Model
对象来与数据库进行交互。
如果要创建Model
,那么它会将任何相关信息传回Controller
,而Controller
会从那里完成所需的操作。
例如,如果我转到/my_controller/my_action
,则index.php文件将创建My_Controller
对象(如果存在),如果存在,则尝试在该对象中执行名为{{1}的方法}。
我希望这对你有所帮助,如果我误解了,我很抱歉。
答案 1 :(得分:1)
实现模型 - 视图 - 控制器并不意味着您必须创建HTTP请求以在这些层之间进行通信。只需使用include
或require
包含该文件即可。通过使用不同的文件已经存在分离。