CodeIgniter表单提交后在控制器中POST为空

14

我正在使用Codeigniter。我创建了一个HTML表单,将数据发送到控制器。

这个表单之前可以正常工作,但是突然间就停止把数据发送到控制器了。

HTML:

<form name="frm_search" id="frm_search" method="post" action="http://ip/free/index.php/taskdetails/tabOne/1/ShibNo/asc/">
<input  id="order1" name="order1" value="26" type="text" >
<input  id="item1" name="item1" value="" type="text" >
</form>
  1. 我尝试在浏览器中检查数据发布情况,它显示了我在输入框中输入的数据。

输入图像描述

  1. 在我的index.php文件中,我放置了以下代码以查看是否已发布:
echo "CONTENT_TYPE: " . $_SERVER['CONTENT_TYPE'] . "";
$data = file_get_contents('php://input');
echo "DATA: <pre>";
var_dump($data);
var_dump($_POST);
echo "</pre>"; 
exit; 

RESULT:

CONTENT_TYPE: application/x-www-form-urlencoded

string 'order1=26&item1='

array (size=23)
'order1' => string '26' (length=2)
'item1' => string '' (length=0)

但是在控制器中打印$_POST时,我会得到以下结果:

Array
(
    [order1] => 
    [item1] =>
)
3. 我的.htaccess代码如下:
RewriteEngine on

RewriteCond $1 !^(index\\.php|resources|robots\\.txt)

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php/$1 [L,QSA]
有人能告诉我问题出在哪里吗?为什么当数据传递到控制器时,它变成了null。应用程序成功运行了一年多,但突然出现了这个问题。
提前感谢您的帮助。如果需要更多信息,请告诉我。
注意:我发现一旦页面加载完成,如果我通过Chrome的检查元素编辑输入名称为其他名称,则数据会成功提交。
即:如果我将名称从order1更改为neworder,则提交时数据将提交给控制器。不知道为什么?
更新:我发现有一些奇怪的东西。在浏览器的set-cookie中,它就像是一整页的垃圾。
每次调用页面时,我都会启动一个新会话,但我不会终止现有会话。这是个问题吗?
即使我销毁旧会话并启动新会话,我也会在浏览器中获得set-cookies。它必须是一个...但在我的情况下,浏览器中有6个以上的set cookies。

你的页面上是否有一些正在运行的jQuery代码,例如 $('#order1').val(''); 或类似的代码? - MonkeyZeus
你尝试过启用分析器以查看提交的数据吗?在你的控制器方法开头添加 $this->output->enable_profiler(TRUE); 以启用分析器。 - Gentle153
1
@TomPHP,请问您能否展示完整的视图文件以及控制器吗?这种问题是否是由于输入字段重名引起的?此外,这是一个ajax请求吗? - StreetCoder
嗯,某些东西正在运行时修改您的$_POST数组,而CodeIgniter默认情况下不会这样做。显然我们无法审查您数千行的代码,但我们也不能盲目猜测原因... - Narf
像往常一样发布.. @Abdulla - DonOfDen
显示剩余18条评论
3个回答

5
根据CI Github的问题https://github.com/bcit-ci/CodeIgniter/issues/242,这可能是RewriteRule方面的.htaccess问题:

如果使用Apache服务器,则应启用mod_rewrite,否则重定向将正确进行但$_POST为空。

&

如果您的URL末尾没有斜杠,服务器会发送301重定向,这会影响POST数据。您的问题可能与此有关。
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

尝试更改为:

RewriteRule ^(.*)$ index.php/$1 [PT,L]

(来自: 在CodeIgniter中无法获取表单提交的值) 或者尝试设置:

sudo a2enmod rewrite

希望能帮到你!

尝试从config.php中删除基本URL中的www.,可以参考这里提供的解决方案(非常相似的问题): http://stackoverflow.com/questions/28143654/codeigniter-post-variable-empty 或者也可以查看这个链接的解答:http://stackoverflow.com/questions/14201815/codeigniter-post-data-empty - JP. Aulet
我仍然认为这可能是一个.htaccess / 路由问题,你的控制器名称是什么?函数呢?你能粘贴文件夹结构或更多代码(config.php、route.php等)吗? - JP. Aulet

1
根据我的研究,这个问题是一种不可接受的类型,但我不知道为什么会发生这种情况,或者在Codeigniter中是否有一些限制针对这种问题。

如果您在配置中描述了基本URL,记住URL末尾不包括斜杠:

http://ip/free/index.php

在您的HTML文件中,表单标签上的操作应该描述为这样。请记住,在最后使用斜杠:
http://ip/free/index.php/taskdetails/tabOne/1/ShibNo/asc/

这是一个问题,因为“斜杠”改变了路径,导致无法将任何数据传递给控制器。
在这种情况下,如果您没有在基本URL的末尾使用斜杠,则在HTML表单上也不要使用它,以使其正常工作。
如果您遇到此类问题,则可以尝试一次这个方法,可能会有所帮助。

1

我遇到了相同的错误,并像上面的答案一样解决了。

.env文件中的baseURL在生产环境中必须包含类似以下内容:

https://www.yourwebsite.com.br/ CodeIgniter 4


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接