【问题标题】:$.post with data returns a HTTP 500 error带有数据的 $.post 返回 HTTP 500 错误
【发布时间】:2011-12-15 16:31:35
【问题描述】:

我目前正在使用框架 CodeIgniter 开发一个项目。我使用 jQuery 1.7.1,我想用数据实现 ajax 调用以添加发布消息。

奇怪的是该函数工作并返回警报消息而没有额外的数据。但是带有数据的函数返回 HTML 500 错误(在 chrome 的控制台中)。

请求的页面只不过是一个 php 脚本回显“它可以工作!”。

有效的代码:

$.post("/ajax/add_post_to_profile",
            function(data) {
                alert("Data Loaded: " + data);
});

不起作用的代码:

$.post("/ajax/add_post_to_profile", { msg: "My test msg!"},
            function(data) {
                alert("Data Loaded: " + data);
        });

更新:

这里是处理请求页面的codeigniter控制器:

class PostController extends CI_Controller {

    public function __construct(){
        parent::__construct();
    }

    public function addPostToProfile() {     
        echo 'It works!!!';
    }
}

更新 2:

我已经使用放置在应用根目录中的新文件请求测试了该功能。然后它就像一个魅力。

看起来 CodeIgniter 控制器正在阻止 POST 请求之类的......

更新 3:

我发现这是 CodeIgniter 的 CSRF 安全。当我关闭它时它工作。 我在互联网上搜索了保留 CSRF 的解决方案,但我发现的代码不起作用:(。

<script>
    $('#ajax_test').click(function() {
        $.post("/ajax/add_post_to_profile", { msg: "My test msg!", csrf_token_name: "<?php echo $this->security->get_csrf_hash(); ?>"},
            function(data) {
                alert("Data Loaded: " + data);
        });
    });
</script>

【问题讨论】:

  • 1) 您的代码在浏览器中的实际呈现方式,以及 2) 您是否检查过您的网络服务器日志以尝试找到服务器错误的解释?
  • 你在这个 /ajax/add_post_to_profile 里面有什么?
  • 1) 如果您的意思是这样,请求的页面将正确呈现。 2)错误日志没有显示任何错误,访问日志显示500错误。
  • @RicardoArruda 我用控制器代码更新了问题。
  • -1 未提供有关您如何实际调用类和方法的关键信息

标签: jquery codeigniter


【解决方案1】:

检查您的site_urladd_post_to_profile 文件肯定有问题。否则jquery函数没有问题

【讨论】:

  • 我已经尝试添加 site_url 辅助函数,但它只是给出了同样的错误。
【解决方案2】:

如果你使用 CSRF 安全,你应该序列化你的表单数据!

$('#ajax_test').click(function() {
    ...
    data: jQuery('#theForm').serialize(),
    ...

【讨论】:

  • 为什么我必须这样做?如果我正确理解了来自 jQuery (api.jquery.com/serialize) 的信息,那么它只会创建一个包含表单所有元素的字符串(field1=val1&field2=val2 等)
  • 因为 Codeigniter 添加了一个隐藏在表单中的输入,您应该传递它以使其正常工作。
  • 我已经通过将令牌名称添加为带有令牌哈希的帖子字段来解决此问题。
【解决方案3】:

只是对 vars 的快速更新,它只是尝试过,非常感谢;)

<script>

   var csrf_token_name = "<?php echo $this->security->get_csrf_token_name(); ?>";
   var csrf_hash = "<?php echo $this->security->get_csrf_hash(); ?>";

    $('#ajax_test').click(function() {
        $.post("/ajax/add_post_to_profile", { msg: "My test msg!", csrf_token_name:csrf_hash},
            function(data) {
                alert("Data Loaded: " + data);
        });
    });
</script>

现在该功能在启用 CSRF 的情况下可以正常工作!感谢大家的帮助!

【讨论】:

  • 您可以通过我的回答以更好的方式实现同​​样的目标。
  • @Chumillas: 你能告诉我表单标签的语法吗?我有同样的问题试图解决它。
  • @ram
    如果你想使用 CI 语法,请按照这个 url Codeigniter form_open
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2017-06-07
  • 1970-01-01
相关资源
最近更新 更多