由于不需要的301,$ this-> input-> post()始终返回FALSE

时间:2011-05-15 10:50:31

标签: php forms codeigniter post

我正在CodeIgniter中的注册页面上工作。 问题是,我的帖子数据没有通过。以下代码始终生成“失败”:

class Signup extends CI_Controller {

    function index()
    {    
        if ($this->input->post())
        {
            echo 'success'; 
        }
        else
        {
            echo 'fail';

            echo form_open('signup');

            echo form_input('username', 'Username');
            echo form_input('email_address', 'Email address');
            echo form_submit('submit', 'Create Acccount');

            echo form_close();
        }
    }

}

可能是什么问题?

为了使问题更加有趣,在我的本地主机上表单工作得很好。这是在远程服务器上失败的时候。


更新1:根据要求,这是服务器输出的内容:(我模糊了网址,我没有透露)

<form accept-charset="utf-8" method="post" action="http://www.url.com/signup">
<input type="text" value="Username" name="username">
<input type="text" value="Email address" name="email_address">
<input type="submit" value="Create Account" name="submit">
</form>

更新2:我看到localhost和远程服务器之间的行为有另一个区别:在提交表单后刷新(cmd R或F5)页面时,在本地主机上我的浏览器会问我再次发送表格。远程服务器上的同一页面不会从浏览器调用该问题,因此看起来某些重定向或网址问题会导致问题?


更新3:在远程服务器上,用户正被301重定向。(永久移动)我仍然不知道此重定向的来源。重定向有效地杀死了后期数据,因此它解释了为什么post()返回false。

那么,有谁知道为什么我会成为301的?


更新4:我将我的base_url设置为http://www.url.com而非http://url.com

,从而在CodeIgniter中重定向

更改后,它解决了问题! :)

4 个答案:

答案 0 :(得分:3)

问题可能是由远程服务器的301重定向(位置HTTP标头指令)引起的。如果您使用Firefox,可以使用插件TamperData进行检查。当然,您还可以查看在请求页面时是否重定向http://www.url.com/signup

如果HTTP标头Locationhttp://url.com/signup(没有www),那么最简单的解决方案是使用http://url.com/signup进行表单操作。请注意,如果表单位于同一服务器上,您也可以省略服务器地址。您可以改为使用/signup

答案 1 :(得分:2)

您使用的是哪个版本的CI? CI Reactor对$this->input->post()

进行了更改
  

输入类方法post()和get()   现在将返回一个完整的数组,如果   没有提供第一个参数。

我刚测试了一个类似的情况;我在localhost上使用了CI Reactor,在我的直播上使用了预反应器版本,并且得到了相同的结果。

$ _ POST确实包含数据。如果没有传递数组,预反应器$this->input->post不会返回任何内容:

$this->input->post()来电_fetch_from_array()

function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
{
    if ( ! isset($array[$index]))
    {
        return FALSE;
    }

然而,在反应堆中,这样做了:

    if ($index === NULL AND ! empty($_POST))
    {
        $post = array();

        // Loop through the full _POST array and return it
        foreach (array_keys($_POST) as $key)
        {
            $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
        }
        return $post;
    }

即使您没有指定索引,也可以获得帖子值。

答案 2 :(得分:0)

我从print_r()开始查看$ _POST / $ _ REQUEST superglobals以查看PHP是否看到了什么。这应该有助于缩小它以查看它是php还是CI问题。

答案 3 :(得分:0)

我有这个问题它是一个奇怪的解决方案我无法解释为什么但这里有效。不要使用html使表单使用codeigniters表单库。我尝试了两种方式,出于某种原因

$this->input->post('your_variable'); 

仅在使用表单类时才能使用,请参阅codeigniter userguide