'PHP'에 해당되는 글 6건

  1. 2019.01.23 Date Time
  2. 2019.01.22 AJAX with CodeIgniter
  3. 2019.01.14 CI Session example
  4. 2019.01.14 Query in CI Model
  5. 2019.01.12 WAMP Setup
  6. 2019.01.12 CodeIgniter Login example
PHP/Time2019. 1. 23. 23:33

<?php

// 시간 문자열을 날짜 객체로 변환

$date = new DateTime('2019-01-23 12:30:23');


// 날짜 객체를 시간 문자열로 변환

echo $date->format('Y-m-d H:i:s');


// 현재 로컬시간 구하기

date_default_timezone_set("Asia/Seoul");

echo date('Y-m-d H:i:s'); //로컬시간을 문자열로 리턴


Posted by cwisky
PHP/CI AJAX2019. 1. 22. 16:45

CodeIgniter에서 AJAX 사용하기


사원번호를 클릭할 때마다 jQuery를 이용한 AJAX 요청이 CodeIgniter에 전달되면 콘트롤러와 모델, 뷰 컴포넌트를 거쳐 사원정보를 JSON 포맷으로 응답한다

응답을 수신한 success 함수는 JSON 오브젝트를 사용하여 각 데이터가 표시될 위치에 출력하는 예이다


실행환경

웹서버 상의 CodeIgniter 루트에 css, js  등의 리소스 폴더를 생성하고 css 폴더에는 스타일시트 파일을 저장하고 js 폴더에는 jQuery.min.js  등의 자바스크립트 파일을 복사해둔다


emp 테이블

 - empno INT                # 사번

 - ename VARCHAR(20)   # 이름

 - dname VARCHAR(20)   # 부서

 - sal INT                      # 급여

 - pic VARCHAR(20)        # 사진파일명



웹서버의 폴더 구조

- www : 웹서버 루트 폴더

   - ciBoard 폴더 : CodeIgniter 구성파일 저장

      - css : css 파일 저장

      - js : jQuery 파일 저장

      -application/controllers/Emp.php

      -application/models/EmpModel.php

      -application/views/emp.html, emp_json.php



콘트롤러 생성

ciBoard/application/controllers/Emp.php  (요청 url : http://localhost/ciBoard/emp )

<?php  

 defined('BASEPATH') OR exit('No direct script access allowed');


 class Emp extends CI_Controller 

 {  

    public function __construct() {

         parent::__construct();

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

    }

    

    public function index() {

        $this->load->view("emp.html");  

    }


    function getInfo($num) {

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

        $data = $this->EmpModel->getInfo($num);

        $row = array('row'=>($data->row_array()));

        $this->load->view('emp_json', $row);

    }

 }



모델 클래스 생성

ciBoard/application/models/EmpModel.php

<?php  

 defined('BASEPATH') OR exit('No direct script access allowed');

 

 class EmpModel extends CI_Model

 {

     public function __construct() {

         parent::__construct();

     }

     

     public function getInfo($num)

     {

         $sql = "SELECT * FROM emp WHERE empno=$num ";

         $result = $this->db->query( $sql );

         return $result;

     }

 }


뷰 파일

ciBoard/application/views/emp.html (요청 url : http://localhost/ciBoard/emp )

<!DOCTYPE html>

<html>

    <head>

        <title>사원정보 페이지</title>

        <meta charset="UTF-8">

        <meta name="viewport" content="width=device-width, initial-scale=1.0">

        <script src="js/jquery-3.3.1.min.js"></script>

        <script>

            $(function(){

              alert('jQuery Ready!');

            });

            function requestEmpInfo(num) {

                $.ajax({

                    url : '<?php echo base_url();?>emp/getinfo/'+num,

                    method: 'post',

                    data: { 'num' : num},

                    dataType : 'json',

                    success : function(res) {

                        //alert(res.ename);

                        $('#ename').html(res.ename);

                        $('#empno').html(res.empno);

                        $('#dname').html(res.dname);

                        $('#sal').html(res.sal);

                        $('#pic').html('<img src=\'images/'+res.pic+'\'>');

                    },

                    error: function(xhr, status, error){

                        console.log(xhr.status + ', '+xhr.responseText +', '+status+', '+error);

                        alert(status);

                    }

                });

            }

        </script>

        <style>

            img { width: 200px; height:200px; }

        </style>

    </head>

    <body>

        <h3>사원정보</h3>

        <div>이름 : <span id="ename"></span></div>

        <div>번호 : <span id="empno"></span></div>

        <div>부서 : <span id="dname"></span></div>

        <div>급여 : <span id="sal"></span></div>

        <div>사진 : <span id="pic"></span></div>

        <div>

            [<a href="javascript:requestEmpInfo(11);">11</a>]

            [<a href="javascript:requestEmpInfo(12);">12</a>]

            [<a href="javascript:requestEmpInfo(13);">13</a>]

            [<a href="javascript:requestEmpInfo(14);">14</a>]

            [<a href="javascript:requestEmpInfo(15);">15</a>]

        </div>

    </body>

</html>




JSON 문자열을 웹브라우저에 출력하는 뷰 콤포넌트

ciBoard/application/views/emp_json.php

<?php

echo json_encode($row);


Posted by cwisky
PHP/CI Session2019. 1. 14. 16:07

CodeIgniter 에서 Session 사용하기


원문참조 : https://www.codeigniter.com/user_guide/libraries/sessions.html



PHP 표준 방법으로 세션을 다루는 예

session_start();


$_SESSION['id'] = 'Smith'; // 세션에 'id' 란 키를 이용해서 값을 저장한다

$_SESSION['id'] = 'Andy';  // 세션에 'id' 란 키로 저장된 값을 업데이트한다

unset ( $_SESSION['id'] );  // 세션에 'id' 란 키로 저장된 값을 제거한다


if ( empty ( $_SESSION['id] ) ) // 세션에 'id' 란 키로 저장된 값이 있는지 확인한다

{

     echo "로그인 후에 이용해 주세요";

)



콘트롤러 클래스 작성

application/controllers/ 아래에 다음과 같은 테스트용 클래스를 작성한다

<?php

defined('BASEPATH') OR exit('No direct script access allowed');


class SampleController extends CI_Controller 

{

    public function __construct() 

    {

        parent::__construct();

        $this->load->library('session'); // 생성자에서 세션을 초기화하면 이후 모든 페이지에서 사용가능

    }

    public function index()

    {

            $this->load->view('sample.php');

    }

}

?>


위와 같이 콘트롤러에서 세션을 초기화하지 않고 뷰에서 초기화하는 경우 오류가 발생한다

콘트롤러에서 세션의 초기화 뿐만 아니라 세션 관련 다른 모든 작업이 가능하다


콘트롤러에서 연결할 뷰 작성

application/views/ 아래에 다음과 같은 뷰(sample.php)를 생성한다

<?php


// 콘트롤러에서 초기화된 세션은 아래처럼 사용가능

//$this->session;


// PHP에서 세션에 값을 저장하려면

$_SESSION['key'] = "value";


// CodeIgniter에서는 ...

$this->session->set_userdata('key', 'value'); 


// 세션에 배열을 저장하려면..

$data = array(

    'id'=>'userid',

    'name'=>'username',

    'phone'=>'010-2547-9541'

);


$this->session->set_userdata($data);


foreach ($data as $key => $value) {

    echo $key. " : ". $value."<br>";

}


//PHP에서 세션에 저장된 값을 제거하려면..

unset($_SESSION['key']);


//CI에서 키를 이용하여 세션의 값 제거

$this->session->unset_userdata('key');


// CI에서 세션에 저장된 배열을 제거

$this->session->unset_userdata($data);


// CI에서 세션에 저장된 값을 가져와서 사용하는 예

$data = array(

    'id'=>'userid',

    'name'=>'username',

    'phone'=>'010-2547-9541'

);


$id = $this->session->userdata('id');


echo "이용자의 ID :".$id . "<br>";

?>



다른 페이지에서 로그인을 거쳤는지 확인하는 예

아래에서 사용된 base_url()함수는 url 헬퍼에 있으므로 콘트롤러에서 $this->load->helper('url'); 부분이 추가되어야 한다

<?php

    if( empty($_SESSION['id']) ) {?>

    <script>

        alert('로그인 후에 이용할 수 있습니다');

        location.href = '<?php echo base_url();?>logincontroller';

    </script>

<?php    

        return;

    }

?>



CodeIgniter 에서 실행 확인하기

웹브라우저에서 다음과 같이 요청한다

http://localhost/index.php/SampleController

http://localhost/index.php/sampleController

http://localhost/index.php/samplecontroller



요청 URL에서 콘트롤러 이름을 간결하게 사용하기

application/config/routes.php 파일의 끝에 다음과 같은 내용을 추가한다

route['sample'] = 'SampleController';

위와 같이 설정하면 웹브라우저에서 요청 URL은 다음과 같이 할 수 있다

http://localhost/index.php/sample

물론 원래의 URL도 사용할 수가 있다

Posted by cwisky
PHP/CI Model2019. 1. 14. 15:13

CodeIgniter 의 모델 콤포넌트에서 DB 다루기



application/config/database.php 에서 데이터베이스 정보 입력

$db['default'] = array(

'dsn' => '',

'hostname' => 'localhost',

'username' => 'root',

'password' => '',

'database' => 'sample_db',

'dbdriver' => 'mysqli',

        .........



Model  생성자 안에서 DB 초기화

$this->load->database();



데이터베이스 자동 연결

혹은 application/config/database.php에 자동로드 설정하면 위의 코드는 필요 없다

$autoload['libraries'] = array('database', 'session');



다수개의 행을 가져와서 배열로 변환

$result = $this->db->get('테이블명');

$data['rows'] = $result->result_array(); //각행이 연관배열로 표현된 2차원 배열 리턴

$data['title'] = 'Members List';



한행을 검색하여 가져오기

$result = $this->db->get_where('테이블명', array('id'=>11));

//위의 문장은 아래처럼 2개문장으로 표현할 수 있다

$this->db->where('id', 11);

$result = $this->db->get('테이블명');

$data = $result->row_array(); // 한행을 연관배열로 리턴, NULL



get_where() 함수

get_where([$table = ''[, $where = NULL[, $limit = NULL[, $offset = NULL]]]])

Parameters:

$table (mixed) – The table(s) to fetch data from; string or array

$where (string) – The WHERE clause

$limit (int) – The LIMIT clause

$offset (int) – The OFFSET clause



웹브라우저 파라미터를 추출하여 DB에 저장하기

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

$title = $this->input->post('title');

$content = $this->input->post('content');

$data = array(

'title'=>$title,

'content'=>$content

);

$this->db->insert('테이블명', $data); //성공시 TRUE, 실패시 FALSE



특정 행의 컬럼 값을 변경하기

$data = array(

'title'=>$title,

'content'=>$content

);

$this->db->where('id', $id);

$this->db->update('테이블명', $data);  //성공시 TRUE, 실패시 FALSE

$this->db->update('테이블명', $data, $where);



특정 행 삭제

$this->db->where('id', $id);

$this->db->delete('테이블명'); // 실패시 FALSE

$this->db->delete('테이블명', $where);



SQL 문장을 직접 사용할 때

$this->db->query($sql); 

$this->db->query($sql, sql문장에 전달될 파라미터배열);


//$sql이 read type(SELECT)이라면 결과값 리턴

//$sql이 write type(INSERT,UPDATE,DELETE)이라면 TRUE|FALSE 리턴




Posted by cwisky
PHP/WAMP2019. 1. 12. 20:37

WAMP 다운로드 및 설치

https://sourceforge.net/projects/wampserver/files/

설치 중에 웹브라우저, 에디터를 선택하는 창에서 [아니오]를 선택하고 설치를 진행한다


WAMP 서버 실행

윈도우 시작 > wampserver64 선택

작업표시줄 우측에 local server 아이콘이 보이는지 확인

아이콘 클릭 > Start All Services 선택 > 아이콘이 초록색으로 변하면 실행완료

웹브라우저 주소창에 http://localhost 입력 > 엔터

웹브라우화면에 wamp 서버 초기화면이 표시되는지 확인한다

phpMyAdmin 링크를 클릭하여 데이터베이스 로그인 화면에서 다음과 같이 입력한다

아이디 :  root,      암호: 비어둔다

데이터베이스 관리화면에서 데이터베이스나 테이블을 생성하고 관리할 수 있다

참고로, wamp의  MySQL root 계정 암호는 설정되지 않은 상태로 설치된다


MySQL Workbench 설치 및 실행

MySQL Workbench 를 설치하고 실행하면 자동으로 로컬 MySQL root 계정 접속을 생성하여 첫화면에서 제시하므로 해당 접속을 클릭하여 바로 데이터베이스 관련 작업을 할 수 있다


PHP 에디터로 Apache NetBeans 설치하기

http://netbeans.apache.org/

Download

Downloading 항목 아래에서 

Binaries: incubating-netbeans-10.0-bin.zip ( SHA-512, PGP ASC)


넷빈즈 설치 후 실행/프로젝트 생성

화면 왼쪽 컬럼에서 [Projects] 탭에서 마우스 우측 > New Project >

 PHP > PHP Application > Project Name > 

Sources Folder : wamp/www

PHP Version : 5.6

Run As : Local Web Site

Project URL : http://localhost

PHP Frameworks:지정안함

Finish

프로젝트가 생성되면 왼쪽 [Projects] 탭에 소스폴더의 모든 내용이 표시된다


넷빈즈에서 웹브라우저 지정하기

넷빈즈 툴바에서 지구본 모양의 웹브라우저 아이콘을 선택하면 웹브라우저를 선택할 수 있다

여기서는 [Chrome] 을 선택한다

프로젝트 Source Files 안에 마우스 우측 > New > PHP File 선택 > 파일이름 지정 > Finish

생성된 파일명을 더블클릭하여 에디터를 열고 다음과 같이 내용을 입력한다


hello.php

<html>

    <head>

        <title>PHP로 나만의 웹사이트 만들기</title>

        <meta charset="UTF-8">

        <meta name="viewport" content="width=device-width, initial-scale=1.0">

    </head>

    <body>

    <?php

        echo "Hello World<br>";

        echo "안녕하세요?<br>"

    ?>

    </body>

</html>




넷빈즈에서 PHP 파일을 웹브라우저로 확인하기

PHP파일은 아파치 웹서버에서 실행되므로 먼저 wamp 서버를 실행한다

넷빈즈 프로젝트에 작성된 파일명 위에서 마우스 우측 > Run 선택

지정된 웹브라우저가 실행되고 웹서버에 해당파일을 요청하여 웹브라우저에 표시되는지 확인한다



Sublime Text 3 다운로드/설치/실행 (필요하다면 설치)

File > Open Folder > 를 누르고 WAMP/www 폴더를 선택

에디더 왼쪽에 루트폴더가 표시되면 마우스 우측을 누르고 New File, New Folder등을 선택하여 작업을 할 수 있다



CodeIgniter 다운로드/압축해제/ 복사

Download https://codeigniter.com/download

WAMP/www/ 아래에 ciBoard 폴더를 생성한다 (임의의 폴더명)

CodeIgniter 압축해제 후 application폴더와 함께 있는 다른 폴더와 파일들을 모두 복사하여 WAMP/www/ciBoard/ 폴더 안에 붙여넣는다

웹브라우저에서 http://localhost/ciBoard 으로 접속하여 화면에 아래와 같은 환영 메시지가 출력되는지 확인한다

Welcome to CodeIgniter!


Posted by cwisky
PHP/CI Login2019. 1. 12. 13:00

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>


Posted by cwisky