POST 由于未正确配置 htaccess 文件而无法正常工作

POST not working because of a not configured correctly htaccess file

我有一个结构良好且编码良好的表单,但是当我使用 post 将数据发送到我的控制器时..接收 post 数据的变量为空。我尝试向用户发送警报以查看问题是否出在输入字段上,并在接收数据的控制器变量上使用了 vardump,结果为 0。

在我意识到一切都很好之后..唯一不好的,也是我唯一不明白它是如何工作的是 .htaccess 文件。

PS:正确的 .htaccess 只是从 codeigniter 框架的 url 中删除了 index.php 文件!

所以恢复我如何从下面的传统 htaccess 文件中启用任何 "data request (post, get, etc..)" :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/ [L]

控制器代码[已编辑]

<?php
 defined('BASEPATH') OR exit('No direct script access allowed');

 class Login_Controller extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
        $this->load->helper('url'); //obligatory
        $this->load->database();
        $this->load->model('Login_model');
        $this->load->library('form_validation');
        $this->load->helper('form');
    }

    public function index()
    {
        //sending $data array of variables to view's or to model's
        $data = array('header_title' => 'Nova Democracia - Login');

        $this->load->view("login", $data);
    }

    public function login_validation(){

        $username = $this->input->POST('username');
        $password = $this->input->POST('password');

        //echo "username - " + $username;
        //echo "password - " + $password;
        //break;

        if($username != '' && $password != '')
        {
            $validate = $this->Login_model->validate($username, $password); 

            if($validate->num_rows > 0){

                $data = $validate->row_array();

                $nome  = $data['nome'];
                $apelido = $data['apelido'];
                $id = $data['id'];
                $username = $data['username'];
                $nivel = $data['nivel'];

                $sesdata = array(
                    'nome'  => $nome,
                    'apelido' => $apelido,
                    'username'     => $username,
                    'nivel'     => $nivel,
                    'id' => $id,
                    'logged_in' => TRUE
                );

                $this->session->set_userdata($sesdata);

        // access login for admin
                if($nivel == '0'){
                    redirect(base_url() . 'Admin_Controller');

        // access login for staff
                }elseif($nivel == '1'){
                    redirect(base_url() . 'Admin_Controller/1');

        // access login for author
                }elseif($nivel == '2'){
                    redirect(base_url() . 'Admin_Controller/2');
                }

            }else{
                echo $this->session->set_flashdata('msg','Username - '.$username.' or Password - '.$password.' is Wrong');
                redirect(base_url().'Login_Controller');
            }
        }else
        {
            echo $this->session->set_flashdata('msg','Os campos não podem estar em branco');
            redirect(base_url().'Login_Controller');
        }
    }

    function logout(){
        $this->session->sess_destroy();
        redirect(base_url().'Login_Controller');
    }
}

查看代码[已编辑]

<!DOCTYPE html>
 <html>
 <head>
    <title><?php echo $header_title; ?></title>
    <!-- include of site header css, js, links, metas, etc-->
    <?php $this->load->view('includes/header'); ?>
 </head>
 <body class="bg-gradient-success">
    <div class="container">

        <!-- Outer Row -->
        <div class="row justify-content-center">

            <div class="col-xl-10 col-lg-12 col-md-9">

                <div class="card o-hidden border-0 shadow-lg my-5" style="margin-bottom: 0 !important;">
                    <div class="card-body p-0">

                        <!-- Nested Row within Card Body -->
                        <div class="row">
                            <div class="col-lg-6 d-none d-lg-block bg-login-image" style="background-image: url('<?php echo base_url(); ?>assets/images/login_img/bg1.jpg');"></div>

                            <div class="col-lg-6">
                                <div class="p-5">
                                    <div class="text-center">
                                        <!-- <h1 class="h4 text-gray-900 mb-4">Eleições <?php echo date('Y'); ?></h1> -->
                                        <h1 class="h4 text-gray-900 mb-4 nexa_bold">Administração</h1>
                                    </div>

                                    <form class="user" method="POST" action="<?php echo site_url('index.php/Login_Controller/login_validation'); ?>">

                                        <div class="form-group">
                                            <input type="text" class="form-control form-control-user" name="username" id="username" aria-describedby="userHelp" placeholder="Nome">
                                            <span class="text-danger"><?php echo form_error('username'); ?></span>
                                        </div>

                                        <div class="form-group">
                                            <input type="password" class="form-control form-control-user" name="password" id="password" placeholder="Senha">
                                            <span class="text-danger"><?php echo form_error('password'); ?></span>
                                        </div>

                                        <div class="form-group">
                                            <div class="custom-control custom-checkbox small">
                                                <input type="checkbox" class="custom-control-input" id="customCheck">
                                                <label class="custom-control-label" for="customCheck">Lembrar</label>
                                            </div>
                                        </div>

                                        <input type="submit" id="buttao" name="submit" class="btn btn-success btn-user btn-block" value="Login">
                                        <?php echo '<p class="text-danger text-center mt-2">'. $this->session->flashdata('msg') .'</p>'; ?>

                                    </form>
                                    <hr>

                                    <div class="text-center">
                                        <a class="small text-success" href="#">Clique aqui, em casos de reclamações!</a>
                                    </div>

                                </div>
                            </div>
                        </div>

                    </div>
                </div>

                <h6 class="text-white">Desenvolvido pela : <a href="http://www.brandigniters.tech" target="_blank" class="text-white">brandigniters</a></h6>

            </div>
        </div>

    </div>

    <?php $this->load->view('includes/footer'); ?>
 </body>

 <script type="text/javascript">
    $(document).ready(function(){
        $('#buttao').click(function(){
            alert("Username - " + $('#username').val() + " Password - " + $('#password').val());
        });
    }); 
 </script>

 </html>

模型代码[已编辑]

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Login_model extends CI_Model {

    function __construct()
    {
        parent::__construct();
    }

    function validate($username, $password){
        $this->db->where('username', $username);
        $this->db->where('password', $password);
        $result = $this->db->get('tbl_admin_users', 1);
        return $result;
    }
}

我解决了将模型更改为 :

的问题
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Login_model extends CI_Model {

    function __construct()
    {
        parent::__construct();
    }

    function validate($username, $password){

        $this->db->select('*');
        $this->db->from('tbl_admin_users');
        $this->db->where('username', $username);
        $this->db->where('password', $password);

        $query = $this->db->get();

        return $query;
    }
}

控制器功能为:

public function login_validation(){

        $username = $this->input->POST('username');
        $password = $this->input->POST('password');

        if($username != NULL && $password != NULL)
        {
            $validate = $this->Login_model->validate($username, $password);

            $rows = $validate->num_rows();

            if($rows > 0){

                $data = $validate->row_array();

                $nome  = $data['nome'];
                $apelido = $data['apelido'];
                $id = $data['id'];
                $username = $data['username'];
                $nivel = $data['nivel'];

                $sesdata = array(
                    'nome'  => $nome,
                    'apelido' => $apelido,
                    'username'     => $username,
                    'nivel'     => $nivel,
                    'id' => $id,
                    'logged_in' => TRUE
                );

                $this->session->set_userdata($sesdata);

                // access login for admin
                if($nivel == '0'){
                    redirect(base_url() . 'Admin_Controller');

                // access login for staff
                }elseif($nivel == '1'){
                    redirect(base_url() . 'Admin_Controller/1');

                 // access login for author
                }elseif($nivel == '2'){
                    redirect(base_url() . 'Admin_Controller/2');
                }

            }else{
                echo $this->session->set_flashdata('msg','Username - '.$username.' or Password - '.$password.' is Wrong');
                redirect(base_url().'Login_Controller');
            }
        }else
        {
            echo $this->session->set_flashdata('msg','Nenhum dos campos pode estar em branco !');
            redirect(base_url().'Login_Controller');
        }
    }

还将 .htaccess 文件更改为:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/ [L]

# ALLOW ONLY NECESSARY REQUEST METHODS
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|OPTIONS|POST|PROPFIND|PUT) [NC]
RewriteRule .* - [F,L]

很高兴您找到了答案。我建议您简化控制器代码。把它放在答案中,因为使用评论太难了。

您不需要复制 $validate->row_array() 返回的数组,因为您使用了所有相同的索引键。您需要做的就是将“logged_in” key/value 添加到 $data.

// call num_rows() in the if condition
// no need for an extra variable
//$rows = $validate->num_rows();

// $model might return FALSE if something goes wrong in the database
// always make sure it's not FALSE before making a call any result method.
if($validate && $validate->num_rows())
{
    $data = $validate->row_array();
    $data['logged_in'] = TRUE;
}

$this->session->set_userdata($data);

此外,在模型中,您不需要 function __construct()。唯一需要调用 parent::__construct(); 的时候是子 class 在构造函数中做了一些工作。对于为父级扩展的任何 PHP class 都是如此。