我登录时,登录控制器将处理我的登录,但是为什么控制器中的$_post
始终为假? (我知道是因为null,但为什么是null?),然后使我无法登录到我的主页。请有人帮帮我
我有一个像这样的控制器
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Login extends CI_Controller {
function __construct(){
parent::__construct();
$this->load->model('M_login');
}
public function index() {
//if user has log-in, redirect to somewhere
if($this->session->userdata('loggedin')) {
redirect('home');
//else go to login form
} else {
if($_POST["username"]) {
echo $this->M_login->ceklogin();
redirect('login');
} else {
//if user input the wrong email/data
$this->session->set_flashdata("msg_login", "Wrong credentials.");
redirect('home/login');
}
}
}
}
这是我的观点
<?php
$this->load->view('parts/header');
?>
<body>
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="login-panel panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">WoW Page</h3>
</div>
<div class="panel-body">
<form action="<?php echo base_url();?>index.php/login" method="POST">
<fieldset>
<div class="form-group">
<input class="form-control" placeholder="Username" name="username" type="text" autofocus>
</div>
<div class="form-group">
<input class="form-control" placeholder="Password" name="password" type="password" value="">
</div>
<?php if ($this->session->flashdata('msg_login') != '') { ?>
<div class="alert alert-danger alert-dismissible" role="alert">
<center><i class="fa fa-warning" aria-hidden="true"></i> <?php echo $this->session->flashdata('msg_login'); ?></center>
</div>
<?php } ?>
<!-- Change this to a button or input when using this as a form -->
<input type="submit" class="btn btn-lg btn-danger btn-block" value="Login">
</fieldset>
</form>
</div>
</div>
</div>
</div>
</div>
<!-- jQuery -->
<script src="<?php echo base_url();?>assets/bower_components/jquery/dist/jquery.min.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="<?php echo base_url();?>assets/bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<!-- Metis Menu Plugin JavaScript -->
<script src="<?php echo base_url();?>assets/bower_components/metisMenu/dist/metisMenu.min.js"></script>
<!-- Custom Theme JavaScript -->
<script src="<?php echo base_url();?>assets/dist/js/sb-admin-2.js"></script>
</body>
</html>
这是我的模特
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class M_login extends CI_Model {
// cek login
public function ceklogin() {
$query = $this->db->get_where('admin', array(
'username'=>$this->input->post('username'),
//password converted to md5
'password'=>md5($this->input->post('password'))
));
$user = $query->row();
if(count($user) != 0) {
//setting isi session
$sesi = array(
'admin_id'=>$user->admin_id,
'username'=>$user->username,
'level'=>$user->level,
'loggedin'=>true
);
$this->session->set_userdata($sesi);
} else {
$data = array('loggedin'=>false);
}
}
}
?>
谢谢 谢谢 谢谢
答案 0 :(得分:0)
有几个问题。首先,您的模型不会返回控制器可以使用的任何内容。这是我关于应该如何完成模型的想法。
places.push(place)
请注意,函数有两个参数-public function ceklogin($user_name, $password)
{
$user = $this->db
->select('admin_id, username, level')
->get_where('admin', array('username'=>$username, 'password'=>md5($password)))
->row_array();
if( ! empty($user))
{
$user['loggedin'] = true; //add 'loggedin' to $user array
$this->session->set_userdata($user);
return TRUE;
}
$_SESSION['loggedin'] = false;
return FALSE;
}
和$user name
。这些需要由控制器提供。请注意,$password
返回TRUE或FALSE取决于在数据库中是否找到行。
我没有更改密码哈希-但您应该。使用@RiggsFolly在评论中告诉您的功能。您还应该考虑对输入进行清理和验证。 从不信任用户输入!
请注意,数据库调用将返回ceklogin()
结果。这将是您想要用于会话数据的确切数据结构。这意味着您不必为row_array()
构建一个数组,因为数据库是为您创建的。
这是经过修订的set_userdata()
函数。
index()
我删除了许多(全部)public function index()
{
//if user has log-in, redirect to somewhere
if($this->session->userdata('loggedin'))
{
redirect('home');
}
// get the inputs so they can be passed to the model
$user_name = $this->input->post('username');
$password = $this->input->post('password');
// if we have inputs, check for valid username & password
if($user_name && $password)
{
if($this->M_login->ceklogin($user_name, $password))
{
// model returned true
redirect('home'); //if 'home' is where valid users go
}
}
// If not all inputs (null/empty $_POST)
// or the wrong inputs (ie. model returned false)
$this->session->set_flashdata("msg_login", "Wrong credentials.");
redirect('home/login');
}
语句。不需要它们是因为所有else
块都以对if
的调用结尾,并且该函数调用redirect()
;表示对exit
的调用永远不会返回到调用它的位置。
您应该使用CodeIgniter Validation Library而不是粗糙的结构
redirect()
但这总比没有好。