【问题标题】:$this->input->post() always returning FALSE, due to an unwanted 301由于不需要的 301,$this->input->post() 总是返回 FALSE
【发布时间】:2011-08-25 20:40:41
【问题描述】:

我正在 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)页面时,在本地主机上,我的浏览器询问我再次发送表格。远程服务器上的同一页面不会从浏览器调用该问题,因此看起来是一些重定向或 url 问题导致了问题?


更新 3: 似乎在远程服务器上,用户被 301 重定向。(永久移动)我仍然不知道这个重定向来自哪里。重定向有效地杀死了 post-data,因此它解释了为什么 post() 返回 false。

那么,有谁知道我为什么会被 301 处理?


更新 4: 通过将我的 base_url 设置为 http://www.url.com 而不是 http://url.com,我在 CodeIgniter 中被重定向

改了之后,问题就解决了! :)

【问题讨论】:

  • $this->input->post() 的定义是什么?
  • @Chris Rasys - 你是什么意思?
  • 这无法从您显示的 sn-p 中回答。安装 Xdebug 并逐步检查请求以找出问题所在。附带说明:控制器不应回显。
  • 如果你尝试会得到什么:$this-&gt;input-&gt;post("username")?
  • 如果你这样做var_dump($_POST)会发生什么?有什么吗?另外,您是否使用任何服务器控制面板的“预览”模式?

标签: php forms codeigniter post


【解决方案1】:

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

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

仅在使用表单类时有效,请参阅 codeigniter 用户指南

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 你找到了问题! :D 它给了我一个'301 永久移动'。很奇怪。为什么会这样?我有完全相同的代码并安装在本地主机和远程服务器上运行。
    • @Kriem 在不知道远程服务器配置的情况下,很难说,但我最好的猜测是在 httpd.conf 或 .htaccess 文件中重定向。例如,它可能是从 http://www.url.com/signuphttp://url.com/signup
    • @Kriem 你应该看看Location 标头。将其与请求的 URI 进行比较。
    • @Richard86 - 位置响应标头说:http://url.com/signup 就像请求的那样。
    • @Kriem 你确定你没有请求http://www.url.com/signup 而不是http://url.com/signup
    【解决方案3】:

    您使用的是哪个版本的 CI? CI Reactor 对$this-&gt;input-&gt;post()进行了更改

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

    我刚刚测试了一个类似的条件;我在 localhost 上使用 CI Reactor,在我的 live 上使用 pre-reactor 版本,并且得到了相同的结果。

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

    $this-&gt;input-&gt;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;
        }
    

    因此,即使您没有指定索引,您也会获得帖子值。

    【讨论】:

    • 我使用的是 Reactor 2.0.2。但老实说,我不确定您要解释什么。 :(
    • 在预反应器 CI 中; $this-&gt;input-&gt;post() 返回 false 如果没有传递给它; Reactor CI 改为返回整个 $_POST 数组。如果您在实时服务器上使用 pre-CI,它可能已经解释了您遇到的行为(因为它总是错误的)。但是当您使用 Reactor 时,我认为问题出在其他地方。输出分析器是否有任何亮点? $this-&gt;output-&gt;enable_profiler(true);
    • 这件事简直就是一场噩梦。 :S 探查器破坏了一切。我看不到输出。只是一张白页。我确实看到本地主机和远程服务器之间存在另一种不同的行为:提交表单后刷新页面时,在本地主机上,我的浏览器要求我再次发送表单数据。远程服务器上的同一页面不会从浏览器调用该问题。好像发帖被毁了?
    • 如果您得到一个空白页,请检查您的 apache 错误日志。至少对我来说,我可以在输出分析中看到 $_POST 数据,即使它仍然是 fails
    • 好像是301问题。
    【解决方案4】:

    我会从 print_r()'ing $_POST/$_REQUEST 超全局变量开始,看看 PHP 是否看到了什么。这应该有助于缩小范围,看看它是 php 还是 CI 问题。

    【讨论】:

    • $_REQUEST 没问题。 $_POST 为空。 (什么都没有)
    • CodeIgniter 不会删除$_POST中的内容吗?
    • @Jonas - 我不相信。
    猜你喜欢
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多