【问题标题】:AJAX call and JSON dataAJAX 调用和 JSON 数据
【发布时间】:2010-08-01 14:44:28
【问题描述】:

美好的一天!

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

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

基本上,我想在这里验证我的知识,如果我错了,请获得任何提示以使其正确。

所以...我正在使用 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(); 函数,而可以使用data.rows[0]name。不幸的是,它不起作用。这不是什么大问题,我可以使用$.parseJSON();,但我想知道我的 PHP 代码中是否有任何错误?

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

【问题讨论】:

  • is_asjax 函数有什么用?对我来说,您的页面根据是否接收 Ajax 调用返回不同的结果,这似乎有点可疑。相反,考虑一个名为“format”的变量,其值为“json”、“xml”等。

标签: php json kohana


【解决方案1】:

回答问题(2):是的,在控制器中echo 通常是错误的形式。我什至会说构建控制器的任何类型的字符串都是不好的形式。

但是,在所有输出都是 json 的情况下,我认为它更简单,更简洁 echo json_encode($results); 如果你真的想成为一个 MVC 纯粹主义者,你总是可以创建一个除了echo json(...);.

【讨论】:

    【解决方案2】:

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

    $this->request->headers['Content-Type'] = 'application/json';
    

    2) 使用 echo 没有任何问题,但由于您使用的是 Kohana,因此从控制器内部向浏览器客户端返回响应的推荐方法是:

    $this->request->response = json_encode($result);
    

    【讨论】:

    • 不幸的是,当我使用$this->request->response = json_encode($result); 时,脚本没有返回任何内容。显然,我在 KO 文档中找不到任何内容。
    • 抱歉,$this->request->response 适用于 Kohana 3.x .. 而您使用的是 Kohana 2.x,它仍然使用 echo 输出 ..
    • 无需抱歉。我进行了一项研究,并在 KO3 文档中找到了它。无论如何,我现在更喜欢使用 2.3.4 版本,因为我认为 KO3 将被多次更改(根据版本 2.x 更新日志)。无论如何,谢谢。
    【解决方案3】:

    在您的代码中:

    $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 的目的是什么,但这可能是不必要的检查。但是可能发生的事情是您对行进行编码,然后对整个结果集进行编码。因此,当涉及到解析并且您执行了 parseJSON 时,您将不得不为数组的行索引再次执行此操作。

    【讨论】:

    • 是的,我在发布这个问题后注意到了这一点;)
    • 在处理之前必须处理简单和 ajax 请求的控制器时,我使用了类似的模式。根据请求是否为 ajax 来选择如何输出对于保持控制器逻辑 DRY 非常有帮助。
    猜你喜欢
    • 2014-02-13
    • 2023-03-10
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多