Php AJAX调用和JSON数据

Php AJAX调用和JSON数据,php,json,kohana,Php,Json,Kohana,你好 我正在学习创建对PHP脚本的AJAX调用 基本上,我想找到处理AJAX调用的最佳解决方案。在这个问题上,您可以找到我的客户端代码部分 基本上,我想在这里验证我的知识,如果我错了,可以从中得到一些如何正确使用的技巧 所以。。。我正在使用KohanaPHP框架(但也将学习ZendFramework)。我使用以下代码创建了一个测试控制器: public function __construct() { if (request::is_ajax()) { $this-&g

你好

我正在学习创建对PHP脚本的AJAX调用

基本上,我想找到处理AJAX调用的最佳解决方案。在这个问题上,您可以找到我的客户端代码部分

基本上,我想在这里验证我的知识,如果我错了,可以从中得到一些如何正确使用的技巧

所以。。。我正在使用KohanaPHP框架(但也将学习ZendFramework)。我使用以下代码创建了一个测试控制器:

public function __construct() 
{
    if (request::is_ajax()) {
        $this->auto_render = FALSE;
        header('content-type: application/json');
    }
}

public function index()
{
    $result['success'] = 1;

    $test_model = new Test_Model;
    $items = $test_model->get_test_rows();
    foreach($items as $item):
        $rows[] = $item;
    endforeach;     
    $result['rows'] = json_encode($rows);

    if (request::is_ajax()) {
        echo json_encode($result);
    }
}
现在我得到了一些与此代码相关的问题。让我问问他们

1) 在上面提到的线程中,我被告知我不必使用
$.parseJSON()函数,我可以使用
数据。行[0]名称
。不幸的是,它不起作用。因为这不是什么大问题,我可以使用
$.parseJSON()
但是我想知道我的PHP代码中是否有任何bug

2) 我正在努力学习良好的实践和技术,并且我正在努力不违反MVC规则。我有一个与MVC相关的问题。是否可以在控制器中使用
echo()
?您可能会注意到我正在使用它返回JSON编码的数据。

1)
jQuery.ajax
函数足够聪明,可以解析JSON响应,只要您告诉它您正在返回JSON编码的对象。以下是后端Kohana如何告诉前端jQuery他们正在控制器中用JSON说话:

$this->request->headers['Content-Type'] = 'application/json';
2) 使用
echo
没有什么错,但由于您使用的是Kohana,建议从控制器内部将响应返回到浏览器客户端的方法是:

$this->request->response = json_encode($result);
在代码中:

$result['rows'] = json_encode($rows);

if (request::is_ajax()) {
    echo json_encode($result);
}
我认为应该是:

$result['rows'] = $rows;

if (request::is_ajax()) {
    echo json_encode($result);
}
我不知道is_ajax的目的是什么,但这可能是一个不必要的检查。但可能发生的情况是,您对行进行编码,然后对整个结果集进行编码。因此,在进行解析时,您需要对数组的行索引再次进行解析JSON

回答问题(2):是的,在控制器中进行
echo
通常是不好的。我甚至可以说,在控制器中构建任何类型的字符串都是不好的


然而,在所有输出都是json的情况下,我认为只需
echo json_encode($results)就更简单、更简洁了echo json(…)之外什么都不做

is_asjax函数有什么用?在我看来,根据是否接收到Ajax调用,您的页面返回不同的结果似乎有点可疑。而是考虑一个名为“格式”的变量,值为“JSON”、“XML”等。不幸的是,当我使用<代码> $ $->请求>响应= JSONYEnEnCODE($结果);<代码>脚本不返回任何内容。显然,我在KO文档中找不到任何东西。对不起,
$this->request->response
是为Kohana 3.x准备的。。您正在使用Kohana 2.x,它仍然使用
echo
进行输出..不必道歉。我进行了一项研究,在KO3文档中找到了它。无论如何,我现在更喜欢使用版本2.3.4,因为我认为KO3会被修改很多次(根据版本2.xchangelog)。无论如何,谢谢。是的,我在发布这个问题后注意到了这一点;)在处理之前必须处理直接和ajax请求的控制器时,我使用了simliar模式。根据请求是否为ajax来选择如何输出,这对于保持控制器逻辑的干燥非常有帮助。