无法在Codeigniter中获取表单提交的值

5

我尝试了一个简单的表单提交,但我无法在控制器中使用 $this->input->post$_POST[] 方法获取表单数据。我的视图部分如下:

<html>
<head>
    <title> Feedback page</title>       
</head>
<body>

    <?php echo form_open('feedback/save'); ?>       
    <p>
        <label>name: </label>
        <?php echo form_input('name'); ?>

    </p>
    <p>
    <label>Email: </label>
        <?php echo form_input('email'); ?>
    </p>
    <p>
    <label>Feedback: </label>
        <?php echo form_textarea('feedback'); ?>
    </p>
    <p>
        <?php echo form_submit('submit','Submit'); ?>
    </p>

    <?php echo form_close(); ?>

</body> 

</html>

控制器部分是

<?php
class Feedback extends CI_Controller {

function __construct() {
    parent::__construct();      
    $this->load->model("MFeedback");

}
function index() {

    $this->load->view('home/feedback_view.php');
    //print "loaded";


}

function save() {
    print "called";     
    print_r($this->input); 
    $name = $this->input->post('uname');
    $email = $this->input->post('email');
    $feedback = $this->input->post('feedback');
    print $name . $email . $feedback;
    $this->index();
}

}
?>

我不确定这里出了什么问题,或者是否有配置设置需要检查一下?

11个回答

7
我已经找到了问题所在,实际上是由于重写规则引起的。请确保您有如下的重写规则:
RewriteEngine On
RewriteRule ^(application) - [F,L] 
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]

在CodeIgniter的根目录下。

/application中还是在/中? - LIGHT

4
请看这个链接:http://codeigniter.com/user_guide/libraries/form_validation.html#validationrules 当我开始使用CI时,我遇到了类似的问题。您需要为表单设置至少一个验证规则,然后检查提交的表单是否符合该规则。然后,您可以像上面所做的那样访问提交的表单数据。
虽然我已经有一段时间没有使用CI了,但是像下面这样做应该可以解决您的问题: (取自上面的链接)
    $this->load->library('form_validation');

    $this->form_validation->set_rules('uname', 'Username', 'required');
    $this->form_validation->set_rules('email', 'Password', 'required');
    $this->form_validation->set_rules('feedback', 'Feedback', 'required');
    $this->form_validation->set_rules('email', 'Email', 'required');

    if ($this->form_validation->run() == FALSE)
    {
                    // Here is where you do stuff when the submitted form is invalid.
        $this->load->view('myform');
    }
    else
    {
                    // Here is where you do stuff when the submitted form is valid.
            print "called";     
            print_r($this->input); 
            $name = $this->input->post('uname');
            $email = $this->input->post('email');
            $feedback = $this->input->post('feedback');
            print $name . $email . $feedback;
            $this->index();

    }

希望这能在某种程度上帮助你... :)

个人观点:CI的表单验证不值得麻烦。我个人使用自己的框架,CI的方式最终会违反DRY原则,即使有良好的规划。虽然这可能解决他的问题。:p - Aren

3

你的 URL 地址应该和 config->config.php->$config['base_url'] 相同,如果你的 URL 地址是这样的:

http://www.test.com

那么你的配置应该是这样的:

$config['base_url'] =  'http://www.test.com/';

1

我和你一样遇到了同样的问题,过去半个小时都无法解决。我尝试了你的解决方案,但没有帮助。但你是对的,这与路由有关。

我还将其他变量传递给我的操作,例如:

domain/controller/action/value1/value2

当我提交表单数据到:

domain/index.php/controller/action/value1/value2

它解决了这个问题。我猜如果你在结尾传递值,那么POST变量的工作就不如预期。我知道它应该可以正常工作,我也猜它确实可以。认为这是设置.htaccess的问题。


1

使用 form action='domain/index.php?/controller/function name/parameter1/parameter2'

例如,您的域名是abc.com,控制器是get,函数名称为value,要传递给函数的参数为ab,则只需按以下方式编写表单操作。

<form action='http:/abc.com/index.php?/get/value/a/b' method='post' >

我是这样解决我的问题的。希望它能对你有用。 谢谢

1

感谢提供的想法,我解决了我的问题。我遇到了同样的问题。我的代码在WAMP中运行良好,但是当我转移到LAMP时,出现了各种奇怪的问题,其中之一是无法获取任何表单提交值。

根据上面的建议:

我使用了form_open(index.php/controller/method)而不是form_open(controller/method),它立即起作用。

然而,我的index.php被删除了,在地址栏中也没有显示。就像我说的那样,这很奇怪...


0
$data = array('id' => 'email',
 'name' => 'email',
 'class' => 'form-control');

echo form_input($data);

快速提醒:如果您使用数组设置输入等,请不要忘记在数组中包括名称 => 'your_desired_post_variable_name',因为这是我的错误,我只给了它一个 ID,并想知道为什么我的 POST 数组为空!不要犯同样的错误! ;)


0

首先,在您的视图中,您已指定一个输入的名称为name,但在您的控制器中,您正在寻找uname 的 post。

其次,我不记得CodeIgniter是否对 $_POST 执行相同的操作,但它肯定会销毁 $_GET 数组。如果您要获得所有post输入的关联数组,则可以调用以下内容:

$this->input->post();

第三,非常罕见的情况下,您的输入可能会被XSS过滤阻止,您可以像这样调用它来防止发生这种情况(仅用于检查目的,以查看问题所在,请勿在生产中使用)

$this->input->post(NULL, FALSE);

如果出现一般性错误,这些调用将返回FALSE,您应该使用===运算符进行测试,因为它只匹配FALSE,而==也会匹配NULL
其次,您应该使用一个简单的HTML表单快速测试,看起来您正在使用表单助手构建您的表单,但使用一个直接的HTML表单进行快速测试也不会有什么坏处。
除此之外,您需要提供更多关于您的环境/配置/生成的HTML等信息,以便我们找出问题所在。您真的没有给我们太多可以使用的信息。

实际上,没有任何技巧起作用。我可以看到 $_POST 为空,所以无论是 uname 还是 name 都无关紧要,但我已经解决了这个问题。 - Ananth Duari
CI_Input 对象([ip_address] => [user_agent] => Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0 [_allow_get_array] => 1 [_standardize_newlines] => 1 [_enable_xss] => 1 [_enable_csrf] => [headers:protected] => Array() [security] => CI_Security 对象([_xss_hash:protected] => ea1f1a23ff5349cfe8470d3ff9cc382e [_csrf_hash:protected] => 7108f2252e604139ed5b64c99959adb8 [_csrf_expire:protected] => 7200 [_csrf_token_name:protected] => ci_csrf_token [_csrf_cookie_name:protected] => ci_csrf_token [_never_allowed_str:protected] =>...) - Ananth Duari
=> 数组([document.cookie] => [已删除] [document.write] => [已删除] [.parentNode] => [已删除] [.innerHTML] => [已删除] [window.location] => [已删除] [-moz-binding] => [已删除] [] => --> [ <![CDATA[ ) [_never_allowed_regex:protected] => 数组([javascript\s*:] => [已删除] [expression\s*((|&#40;)] => [已删除] [vbscript\s*:] => [已删除] [Redirect\s+302] => [已删除]))[uni] => CI_Utf8 Object() - Ananth Duari
不确定这是否有帮助,是否有任何PHP设置或Apache设置会限制表单的提交? - Ananth Duari
我还在错误日志中不断收到以下信息: [Fri Jul 22 19:12:37 2011] [error] [client 127.0.0.1] File does not exist: /var/www/vidyarti/feedback [Fri Jul 22 19:12:44 2011] [error] [client 127.0.0.1] File does not exist: /var/www/vidyarti/feedback, referer: http://localhost/vidyarti/feedback/ - Ananth Duari
注意:您应该通过编辑问题将更新发布在底部。这样可以获得更好的格式。 - Aren

0

我曾经遇到过同样的问题,以下是对 .htaccess 的添加,帮助我解决了这个问题。

<Limit GET POST>
order deny,allow
deny from all
allow from all
</Limit>
<Limit PUT DELETE>
order deny,allow
deny from all
</Limit>

0

确保你的路由文件设置为 $routes->post() 或者 $routes->add() - 这个问题困扰了我!(CI4)


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