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 都是如此。
我有一个结构良好且编码良好的表单,但是当我使用 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 都是如此。