我正在 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:根据要求,这是服务器输出的内容:(我遮盖了 URL,我没有披露)
<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:我看到本地主机和远程服务器之间的另一个行为差异:在提交表单后刷新(cmd R或F5)页面时,在本地主机上,我的浏览器要求我再次发送表单。远程服务器上的同一页面不会从浏览器调用该问题,因此看起来某些重定向或 url 问题导致了问题?
更新 3:似乎在远程服务器上,用户正在被 301 重定向。(永久移动)我仍然不知道这个重定向是从哪里来的。重定向有效地杀死了后数据,因此它解释了为什么 post() 返回 false。
那么,有谁知道我为什么要成为301'd?
更新 4:通过将我的base_url设置为 http://www.url.com 而不是 http://url.com,我在 CodeIgniter 中被重定向
改变之后,它解决了问题! :)
此问题可能是由来自远程服务器的 301 重定向(位置 HTTP 标头指令)引起的。如果您使用Firefox,则可以使用插件TamperData进行检查。当然,您也可以查看http://www.url.com/signup
在请求页面时是否被重定向。
如果 HTTP 标头Location
http://url.com/signup
(不带 www
),则最简单的解决方案是将 http://url.com/signup
用于表单操作。请注意,如果表单位于同一服务器上,您也可以省略服务器地址。您可以改用/signup
。
您使用的是哪个版本的 CI?CI反应器对$this->input->post()
进行了更改
输入类方法 post() 和 get() 现在将返回一个完整的数组,如果 未提供第一个参数。
我刚刚测试了类似的条件;我在本地主机上使用 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;
}
因此,即使您没有指定索引,您也会获得帖子值。
我会从print_r()'_POST/$_REQUEST超全局变量开始,看看PHP是否看到了任何东西。这应该有助于缩小范围,看看它是 php 还是 CI 问题。
我遇到了这个问题,这是一个奇怪的修复,我无法解释为什么,但这是有效的。不要使用 html 使表单使用代码点火器表单库。出于某种原因,我尝试了两种方式
$this->input->post('your_variable');
仅在使用表单类时有效,请参阅代码点火器用户指南