CodeIgniter를 이용한 로그인 예제
https://www.webslesson.info/2016/10/codeigniter-simple-login-form-with-sessions.html
application/config/autoload.php 파일에서 다음과 같은 부분을 편집한다
autoload.php
$autoload['libraries'] = array('database', 'session');
.htaccess 파일 생성 및 편집
요청 URL 중간에 들어가는 index.php를 제거하기 위함
base_url 이 http://localhost/ciBoard 라면...
wamp/www/ciBoard/.htaccess
RewriteEngine On
RewriteBase /ciBoard/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]
데이터베이스 테이블 생성
users ( id, pass, name )
서버측 폼검증 참조 : https://codeigniter-kr.org/user_guide_2.1.0/libraries/form_validation.html
Login 콘트롤러 클래스 생성
application/controllers/Login.php 생성 (클래스이름과 파일이름은 동일해야 함)
콘트롤러 이름은 첫자를 대문자로 한다.
요청 URL에 콘트롤러 이름이 들어갈 때는 첫자를 소문자로 표시한다
예를 들어, 콘트롤러 이름이 Login 이라면 파일명은 Login.php 이어야 하고 요청 URL을 사용하여 Login 콘트롤러를 실행하려면, http://localhost/ciBoard/login/함수명/param1/param2/.... 와 같이 하면 된다
콘트롤러 이름을 URL에서 사용할 때 전혀 다르게 지정하려는 경우
우선, 콘트롤러 클래스 이름과 파일명은 항상 동일해야 한다
application/config/routes.php 파일에 등록하고 사용하면 된다
$route['sample'] = 'SampleController';
위와 같이 지정한 경우, URL은 http://localhost/ciBoard/sample 으로 하여 SampleController를 요청할 수 있다
Login.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Login extends CI_Controller
{
public function __construct() {
parent::__construct();
$this->load->helper('url'); // redirect(), base_url() 사용하기 위함
}
function login_form()
{
$data['title'] = '로그인 폼';
$this->load->view("login_form", $data);
}
function login_validation()
{
$this->load->library('form_validation');
$this->form_validation->set_rules('id', '아이디', 'required'); // 필드명, 이용자가 읽기쉬운 이름, 검사규칙
$this->form_validation->set_rules('pass', '암호', 'required');
if($this->form_validation->run()) //입력 데이터 유효성검사 통과
{
$id = $this->input->post('id');
$pass = $this->input->post('pass');
//model function
$this->load->model('LoginModel');
if($this->LoginModel->login($id, $pass)) //로그인 성공
{
$session_data = array(
'id'=>$id
);
$this->session->set_userdata($session_data);
redirect(base_url() . 'login/enter'); //enter 함수로 이동
}
else //로그인 실패
{
$this->session->set_flashdata('error', '로그인에 실패했습니다');
redirect(base_url() . 'login/login_form');
}
}
else //입력데이터 유효성검사 실패한 경우
{
$this->session->set_flashdata('validation_error', '아이디와 암호를 입력해주세요');
$this->login_form(); // 폼으로 이동
}
}
function enter() { // 로그인 성공시
if($this->session->userdata('id') != '')
{
echo '<h2>환영합니다 - '.$this->session->userdata('id').'님</h2>';
echo '<label><a href="' .base_url(). 'login/logout">로그아웃</a></label>'; //로그아웃
}
else
{
redirect(base_url() . 'login/login_form'); // 폼으로 이동
}
}
function logout()
{
$this->session->unset_userdata('id');
redirect(base_url() . 'login/login_form'); // 폼으로 이동
}
}
application/models/ 안에 LoginModel 클래스 생성
<?php
class LoginModel extends CI_Model
{
public function __construct() {
parent::__construct();
// autoload.php에 $autoload['libraries'] = array('database') 설정이 없다면 아래 행이 필요함
$this->load->database(); // application/config/database.php에서 설정된 DB정보 사용됨
}
function login($id, $pass)
{
$this->db->where('id', $id);
$this->db->where('pass', $pass);
$result = $this->db->get('users'); //Query 실행
//SELECT * FROM users WHERE id = '$id' AND pass = '$pass'
if ( $result->num_rows() > 0) { return true; }
else { return false; }
/* SQL문장을 직접 사용하는 예
$sql = "SELECT id FROM users WHERE id=? AND pass=?";
$result = $this->db->query($sql, array($id, $pass)); //Query 실행
if ( $result->num_rows() > 0) { return true; }
else { return false; }
*/
}
}
application/views/ 안에 뷰 생성
login_form.php
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title; ?></title>
</head>
<body>
<div>
<h3>로그인 폼</h3>
<br />
<?php
echo '<label>'.$this->session->flashdata("validation_error").'</label>';
?>
<form method="post" action="<?php echo base_url();?>/login/login_validation">
<div>
<label>아이디</label>
<input type="text" name="id"/>
</div>
<div>
<label>암 호</label>
<input type="password" name="pass"/>
</div>
<div>
<button type="submit">로그인</button>
<?php
echo '<label>'.$this->session->flashdata("error").'</label>';
?>
</div>
</form>
</div>
</body>
</html>