$ _POST в коде имеет нулевое значение - PullRequest
0 голосов
/ 17 ноября 2018

когда я вхожу в систему, контроллер входа будет обрабатывать мою регистрацию, но почему мой $_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);
            }
        }
    }
    ?>

Спасибо, Спасибо, Спасибо,

1 Ответ

0 голосов
/ 18 ноября 2018

Есть несколько проблем. Во-первых, ваша модель не возвращает ничего, что может использовать контроллер. Вот мои мысли о том, как модель должна быть сделана.

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. Они должны быть предоставлены контроллером. Обратите внимание, что ceklogin() возвращает TRUE или FALSE в зависимости от того, найдена ли строка в базе данных.

Я не менял хеширование пароля - НО ТЫ ДОЛЖЕН . Используйте функции, о которых @RiggsFolly рассказал вам в комментариях. Вы должны также изучить дезинфекцию и проверку входных данных Никогда не доверяйте вводу пользователя!

Обратите внимание, что вызов базы данных возвращает 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; Это означает, что вызов redirect() никогда не возвращается туда, откуда он был вызван.

Вы должны использовать CodeIgniter Библиотека проверки вместо грубой конструкции

if($user_name && $password)

Но это лучше, чем ничего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...