Регистрация пользователя с CodeIgniter - PullRequest
3 голосов
/ 01 августа 2011

Я пытаюсь построить систему регистрации с CodeIgniter. У меня есть контроллер с именем Register со следующим кодом:

class Register extends CI_Controller {
    public function index()
    {
        $this->load->helper(array('form', 'url'));
        $this->load->library('form_validation');
        $this->form_validation->set_error_delimiters('<span class="error">', '</span>');
        $this->form_validation->set_rules('username', 'username', 'required|min_length[3]|max_length[12]|trim');
        $this->form_validation->set_rules('password', 'password', 'required|min_length[2]|md5');
        $this->form_validation->set_rules('email', 'email', 'required|valid_email|trim');
        $this->form_validation->set_rules('artist', 'artist', 'max_length[32]|trim');
        $this->form_validation->set_rules('captcha', 'CAPTCHA', 'required|trim');
        $this->load->view('header');
        if(!$this->form_validation->run())
        {
            $this->load->view('register_form');
        }
        else
        {
            $this->load->view('register_done');
        }
        $this->load->view('footer');
    }
}

Пока все хорошо. Если я перехожу на страницу регистрации, то отображается форма регистрации. Если я отправляю форму и она проходит проверку правильности формы, я получаю страницу успеха, если в форме есть ошибки, я возвращаю форму с некоторыми сообщениями об ошибках.

Теперь то, что я хочу сделать, это вещи из базы данных. У меня есть представление о том, как я могу получить значения POST из формы регистрации в моей базе данных, но не знаю, как я могу проверить, существует ли уже имя пользователя или электронная почта, и если да, отобразить эту ошибку в форме регистрации. Вот мой вид регистрации:

<?php $this->load->helper('form'); ?>
<?php echo form_open('register'); ?>
    <ul id="register">
        <ul>
            <h3>Account information</h3>
            <li>
                <label for="username">Choose a username</label>
                <input type="text" name="username" value="<?php echo set_value('username'); ?>" />
                <span class="desc">The name you'd like to be known by</span>
                <?php echo form_error('username'); ?>
            </li>
            <li>
                <label for="password">Pick a password</label>
                <input type="password" name="password" />
                <span class="desc">The best passwords are random and more than 6 characters long</span>
                <?php echo form_error('password'); ?>
            </li>
            <li>
                <label for="email">Enter your valid email address</label>
                <input type="text" name="email" value="<?php echo set_value('email'); ?>" />
                <span class="desc">We'll send you an activation email</span>
                <?php echo form_error('email'); ?>
            </li>
        </ul>
        <ul>
            <h3>About you</h3>
            <li>
                <label for="band">Who's your favorite artist?</label>
                <input type="text" name="artist" value="<?php echo set_value('artist'); ?>" />
                <span class="desc">Don't put Lady GaGa.</span>
                <?php echo form_error('artist'); ?>
            </li>
        </ul>
        <ul>
            <h3>Security question</h3>
            <li>
                <label for="captcha">Enter the letters you see in the image</label>
                <?php $this->load->helper('captcha');
                $cap = create_captcha(array('img_path' => './captcha/', 'img_url' => 'http://localhost/captcha/', 'img_width' => 200, 'img_height' => 30));
                $data = array('captcha_time' => $cap['time'], 'ip_address' => $this->input->ip_address(), 'word' => $cap['word']);
                $query = $this->db->insert_string('captcha', $data);
                $this->db->query($query);
                echo $cap['image']; ?>
                <input type="text" name="captcha" />
                <?php echo form_error('captcha'); ?>
            </li>
        </ul>
        <ul>
            <h3 class="submit">
                <input type="submit" value="Register" />
            </h3>
        </ul>
    </ul>
<?php echo form_close(); ?>

Как видите, я использую функцию form_error() CI для отображения ошибок формы прямо под полем, и я хотел бы, чтобы ошибка "username Уже существует" также отображалась под полем username.

Может ли кто-нибудь помочь? Даже толчок в правильном направлении?

Спасибо!

Ответы [ 6 ]

2 голосов
/ 02 августа 2011

Я настоятельно рекомендую вам подумать об использовании другой библиотеки, которая уже делает это очень хорошо: TankAuth . TankAuth легко модифицируется и предлагает подтверждение по электронной почте , очень безопасное хеширование пароля , надежная схема базы данных и очень чистый код .

Нет причин заново изобретать колесо, особенно когда дело доходит до чего-то, что очень сложно понять, как аутентификация пользователя.

EDIT:

Например, вот все, что TankAuth предоставляет с точки зрения безопасности, что вам придется кодировать самостоятельно (если вы заботитесь о безопасности) - сколько времени это займет?

Using phpass library for password hashing (instead of unsafe md5).
Counting login attempt for bruteforce preventing (optional). Failed login attempts determined by IP and by username.
Logging last login IP-address and time (optional).
CAPTCHA for registration and repetitive login attempt (optional).
Unactivated accounts and forgotten password requests auto-expire.
1 голос
/ 02 августа 2011

Самым простым решением в CodeIgniter является использование функции обратного вызова в качестве одного из правил проверки формы. Я сам использовал этот метод для проверки имени пользователя и электронной почты.

Вот документы для него.

1 голос
/ 01 августа 2011

Для проверки у вас должны быть функции в вашей модели, которые могут искать для вас такие вещи:

class Model{
    function getUserByEmail($email);
    function getUserByUsername($username);
    ...
}        

Затем в вашем контроллере вы можете вызвать эти методы

...
$result = $model->getUserByEmail($_POST['email']); // You'll need to sanitize your POST
if(count($result) > 0){
    // Sent error about email already existing and flag to not insert/update user
}
...
1 голос
/ 01 августа 2011

Вам необходимо создать модель для вашего контроллера.
Ваша модель будет выглядеть так:

class Register_model extends CI_Model {
    function register_user()
    {
        $data['username'] = $this->input->post('username');
        $data['password'] = sha1($this->input->post('password'));
        ... (your other post data) ...
        $this->db->insert('users', $data);
    }
}

В вашем контроллере вы будете называть модель следующим образом:

$this->load->model('Register_model');

и метод идет здесь:

else
{
    $this->Register_model->register_user(); 
    $this->load->view('register_done');
}

Если вы хотите проверить, доступно ли имя пользователя, вы просто помещаете запрос SELECT в первые строки register_user() метода (функции).

0 голосов
/ 06 октября 2016
<?php

Class User_model extends CI_Model {

    function __construct() {
    parent::__construct();
    $this->load->library('session');


    }

    public function signup($data)
    {

        $this->db->insert('user_signup',$data);

    }

    public function getPosts()
     {
              $this->db->select("*"); 
              $this->db->from('user_data');
              $query = $this->db->get();
              return $query->result();
    }



    public function signin($data)
    {
            $this->db->where('email',$data['email']);
            $this->db->where('password',$data['password']);
            $query=$this->db->get('user_signup');
            if($query->num_rows()==1){

                $_SESSION['email'] = $data['email'];

                $this->load->view('popup',$data);

                return true;
    }
    else{
            echo "no";
            return false;
    }
    }

}
0 голосов
/ 06 октября 2016

определено ('BASEPATH') ИЛИ завершено ('Прямой доступ к сценарию запрещен');

класс Пользователь расширяет CI_Controller {

public function __construct() {

    parent::__construct();

    $this->load->helper('form');

    // Load session library
    $this->load->library('session');

    // Load database
    $this->load->model('User_model');

}

public function index()
    {

        $this->load->view('index');

    }
    public function project()
    {
          $this->data['posts'] = $this->User_model->getPosts(); // calling Post model method getPosts()
            $this->load->view('tables', $this->data);

            // $this->load->aview('project');
    }

    public function get_project()
    {
        $this->User_model->get_project($data);
    }
    public  function signin()
    {

        $data = array(
            'email' => $this->input->post('email'),
            'password' => $this->input->post('password')
        );
        $this->User_model->signin($data);
    }

    public function logout()
    {
        $this->session->unset_userdata($_SESSION['email']);
        // $this->session->sess_destroy();
        redirect('User');
    }
    public function signup()
    {

     $data = array(
            'name' => $this->input->post('name'),
            'phone' => $this->input->post('phone'),
            'email' => $this->input->post('email'),
            'password' => $this->input->post('password')
        );

     if($this->User_model->signup($data))
     {

        echo "no insert";
     }
     else
     {

        $this->load->view('index', $data);
     }

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