0

这是非常令人沮丧的!我试图向我的本地 Web 应用程序发送一个简单的 ajax 帖子,但参数为空。为了调试它,我打开了提琴手,但同样的结果正在发生!

我有这个控制器

class Site extends CI_Controller {

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

} //etc

有了这个功能

    public function hello() {
    var_dump($_SERVER['REQUEST_METHOD']);
    var_dump($_SERVER['REQUEST_URI']);
    $hello = $this->input->post("hello");
    echo "hello is $hello";
}

现在我尝试在 Fiddler 中测试这个,我去 Composer,选择一个新的 Post 请求并放入 body hello=wtsgppp。

这是 fiddler 中 hello 函数的结果:

string(4) "POST"
string(25) "/cmd/index.php/site/hello"
hello is 

如您所见, hello 是空的。非常感谢任何帮助!

让事情变得更烦人 - 一旦我将 fiddler 中的 http 请求更改为 GET 并在 url 字符串中添加 hello(并将控制器更改为 echo get 而不是 post),它就可以工作了!那么为什么能得到工作而post却没有呢?

4

2 回答 2

5

PHP 不会填充$_POST数组,除非它在标头中看到已知的内容类型。

在您的 Fiddle 请求中,尝试添加以下 HTTP 标头:

Content-Type: application/x-www-form-urlencoded

这是因为 PHP 解码原始 POST 正文并将其注入$_POST变量(这是 CI 查看的内容)的方式取决于将请求发送到服务器的方式。

编辑:如果您也没有在 XHR/AJAX 帖子中看到它,请确保您也设置了Content-Type标题。jQuery(和大多数 JS 库)会自动为您执行此操作,但如果您不使用库,则必须自己执行此操作:

request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

于 2013-02-06T14:12:42.483 回答
0

你的input标签有名称属性吗?

我应该<input type="text" name='hello'></input>

于 2013-02-06T14:14:24.510 回答