관리 메뉴

java,javascript,android,php,sql,공부용,메모용

코드이그나이터4 CI4 MVC 패턴 Model 데이터베이스 라이브러리 로드하기 본문

개발/php

코드이그나이터4 CI4 MVC 패턴 Model 데이터베이스 라이브러리 로드하기

yy_dd2 2023. 1. 23. 02:02
반응형

데이터베이스 생활코딩에 있음

https://opentutorials.org/module/327/3827

 

생활코딩 보고 공부한것

 

# 데이터베이스 추가
CREATE DATABASE opentutorials CHARACTER SET UTF8 COLLATE UTF8_GENERAL_CI;

# 데이터베이스 접속
use opentutorials;

# 테이블 추가
CREATE TABLE topic (
    id  int(11) NOT NULL AUTO_INCREMENT,
    title  varchar(255) NOT NULL ,
    description  text NULL ,
    created  datetime NOT NULL ,
    PRIMARY KEY (id)
);

# 내용 추가
INSERT INTO `topic` (title,description,created) VALUES ('JavaScript란', '<h2>\r\n    자바스크립트는</h2>\r\n<ul>\r\n  <li>\r\n      브라우저에서 실행되는 언어</li>\r\n   <li>\r\n      가장 많이 사용되는 언어</li>\r\n    <li>\r\n      주로 html을 프로그래밍적으로 조작하기 위해서 사용됨</li>\r\n</ul>\r\n<h2>\r\n  예제</h2>\r\n<ul>\r\n <li>\r\n      자바스크립트는 3가지 방식으로 사용됨</li>\r\n <li>\r\n      외부의 파일을 로드</li>\r\n   <li>\r\n      &lt;script&gt;태그 사이에 기술</li>\r\n  <li>\r\n      태그에 직접 기술</li>\r\n</ul>\r\n<h2>\r\n   참고링크</h2>\r\n<ul>\r\n   <li>\r\n      <a href=\"http://www.maroon.pe.kr/webmaster/java/java_study.html\" target=\"_blank\">스크립트 세상</a></li>\r\n <li>  \r\n</ul>\r\n', now());
INSERT INTO `topic` (title,description,created) VALUES ('변수와 상수', '<p>\r\n    변수란</p>\r\n<ul>\r\n <li>\r\n      변하는 값</li>\r\n    <li>\r\n      x = 10 일 때 왼쪽항인 x는 오른쪽 항인 10에 따라 다른 값이 지정된다.</li>\r\n</ul>\r\n<p>\r\n 상수란</p>\r\n<ul>\r\n <li>\r\n      변하지 않는 값</li>\r\n <li>\r\n      x = 10 일 때 오른쪽항인 10이 상수가 된다.</li>\r\n</ul>\r\n<pre class=\"brush: xml\">\r\n&lt;script type=&quot;text/javascript&quot;&gt;\r\n&nbsp;&nbsp;&nbsp; // x의 값이 오른쪽 항에 따라서 변한다.\r\n&nbsp;&nbsp;&nbsp; // x가 변수라는 명시적인 의미\r\n&nbsp;&nbsp;&nbsp; var x = 10;\r\n&nbsp;&nbsp;&nbsp; alert(x);\r\n&nbsp;&nbsp;&nbsp; var x = 20;\r\n&nbsp;&nbsp;&nbsp; alert(x);\r\n&lt;/script&gt;</pre>\r\n<p>\r\n   &nbsp;</p>\r\n', now());
INSERT INTO `topic` (title,description,created) VALUES ('연산자', '<p>\r\n   연산에 사용되는 기호들. (y = 5 일 때)</p>\r\n<table class=\"table\">\r\n    <tbody>\r\n       <tr>\r\n          <th align=\"left\" width=\"15%\">\r\n             Operator</th>\r\n         <th align=\"left\" width=\"40%\">\r\n             Description</th>\r\n          <th align=\"left\" width=\"25%\">\r\n             Example</th>\r\n          <th align=\"left\" width=\"20%\">\r\n             Result</th>\r\n       </tr>\r\n     <tr>\r\n          <td valign=\"top\">\r\n               +</td>\r\n            <td valign=\"top\">\r\n               더하기</td>\r\n          <td valign=\"top\">\r\n               x=y+2</td>\r\n            <td valign=\"top\">\r\n               x=7</td>\r\n      </tr>\r\n     <tr>\r\n          <td valign=\"top\">\r\n               -</td>\r\n            <td valign=\"top\">\r\n               빼기</td>\r\n           <td valign=\"top\">\r\n               x=y-2</td>\r\n            <td valign=\"top\">\r\n               x=3</td>\r\n      </tr>\r\n </tbody>\r\n</table>\r\n', now());
INSERT INTO `topic` (title,description,created) VALUES ('JSON', '<h2>JSON이란?</h2>\r\n\r\n<p>서로 다른 언어들간에 데이터를 주고 받는 여러 방법이 있다. 대표적인 것이 XML인데, XML은 문법이 복잡하고, 엄격한 표현규칙으로 인해서 json 대비 데이터의 용량이 커진다는 단점이 있다.</p>\r\n\r\n<p>JSON은 경량의 데이터 교환 형식으로 JavaScript에서 숫자와 배열등을 만드는 형식을 차용해서 이것을 다른 언어에서도 사용할 수 있도록 한 텍스트 형식이다.&nbsp;</p>\r\n\r\n<p>아래 예제는 위의 예제에서 전송한 데이터를 받아서 몇가지 부가정보를 추가해서 json으로 인코드한 후에 다시 반환하는 PHP 코드다.&nbsp;</p>\r\n\r\n<p>json.php - (<a href=\"https://github.com/egoing/codingeverybody_javascript/blob/master/JSON/json.php\" target=\"_blank\">github</a>)</p>\r\n\r\n<pre class=\"brush: php\">\r\n&lt;?php\r\n$userinfo = json_decode($_GET[&#39;data&#39;]);\r\n$userinfo-&gt;address = &#39;seoul&#39;;\r\n$userinfo-&gt;phonenumber = &#39;01023456789&#39;;\r\necho json_encode($userinfo);\r\n?&gt;</pre>\r\n\r\n<h2>json의 형식</h2>\r\n\r\n<h3>object</h3>\r\n\r\n<p>객체는 아래와 같은 문법을 가지고 있다.</p>\r\n\r\n<p>예제</p>\r\n\r\n<p>{&quot;userid&quot;:&quot;egoing&quot;,&quot;pwd&quot;:&quot;12345567&quot;}</p>\r\n\r\n<p><img height=\"113\" src=\"http://www.json.org/object.gif\" width=\"598\" /></p>\r\n\r\n<h3>array</h3>\r\n\r\n<p>배열은 아래와 같은 문법을 가지고 있다.&nbsp;</p>\r\n\r\n<p>예제</p>\r\n\r\n<p>[1,2,3,4]</p>\r\n\r\n<p><img height=\"113\" src=\"http://www.json.org/array.gif\" style=\"line-height: 1.8em;\" width=\"598\" /></p>\r\n\r\n<h3>Value</h3>\r\n\r\n<p>위에서 사용된 Value는 값을 의미하는데&nbsp;큰 따옴표로 묶인 문자나 숫자, 불린 값이 사용된다.</p>\r\n\r\n<p>예제</p>\r\n\r\n<ul>\r\n  <li>문자 : &quot;헬로우 월드&quot;</li>\r\n    <li>숫자 : 1</li>\r\n <li>불린 : true</li>\r\n</ul>\r\n\r\n<p><img height=\"278\" src=\"http://www.json.org/value.gif\" width=\"598\" /></p>\r\n', now());

# 테이블 검색 확인
SELECT * FROM topic;

 

* 오토로드 사용하기
CI3에서는 Autoload.php 에서 
$autoload['libraries'] = array('database');를 작성하면 된다
CI4는 ???

* 컨트롤러에서 데이터베이스 라이브러리를 로드하는 방법 하기
1.
CI3 데이터베이스 로드
$this->load->database();
CI4 데이터베이스 로드
$db = db_connect();

2. 
Models 폴더에 새파일 생성
CI4 새파일은 만들면 class 모델파일명 extends Model {} 해줘야함 약속

3. construct() 생성자 선언
컨스트럭트 초기화 함수 : 토픽 모델이 생성될때 생성자가 제일 먼저 실행됨

4. 리스트에 가져갈 gets 함수 생성

5. 컨트롤러에서 생성한 모델의 함수 gets 가져가기

6. 토픽의 클래스 인스턴스에 접속해서 함수 호출 (모델로)
        $data = $topic_model->gets();

7. 데이터 가져오기 
return $this->db->query('SELECT * FROM topic')->getResult();   //CI3에서 result()를 CI4에서 getResult()로 변경
        //return $this->db->query('SELECT * FROM topic')->getResult();
        // getResult() 는 객체의 형태로 담겨있다 (컨트롤러가기)

쿼리결과 생성 참고
http://ci4doc.cikorea.net/database/results.html

8. 내용을 표시해보기 주석풀어서 확인
        // foreach($data as $entry){
        //     //var_dump($entry->title); //array X
        //     var_dump($entry);
        // }

9. 현재 model에 데이터를 가져와서 컨트롤러에 $data안에 gets()불러온 상태
view('Main', array('topics'=>$data)) 
// 2번째 인자는 view에 전달하고자 하는 인자값이다

이 내용을 return 안에 작성

10. view 페이지
<h1>토픽 페이지 입니다.</h1>
<ul>
<?php
    foreach($topics as $entry){
?>
    <li><a href="../index.php/main/get/<?php echo $entry->id;?>"><?php echo $entry->title;?></a></li>
<?php

    }
?>
</ul>


11. 자주 사용하는 list를 list페이지에도 보이고 보기 페이지에서도 list가 보이도록 변경 view를 하나 새로추가 topic_list 페이지 추가해서
거기에 view 파일 main.php의 리스트 내용을 잘라내기 복사

12. 컨트롤러 변경
        $topics = $topic_model->gets();
        $topic_list = view('topic_list', array('topics'=>$topics));
위코드로 gets();를 변경 해서 추가하고
        return view('head')
               .view('Main') 
               // 리스트 보여주기 를 추가 
               .$topic_list
               .view('footer');
컨트롤러의 이과정을 get과 index에 추가함

 

 

Model - CodeIgniter

Model View가 표현을 담당한다면 Model은 데이터를 담당한다. 여기서 데이터란 주로 데이터베이스를 의미한다. 즉 데이터를 다루는 로직을 모델에 모아둬서 데이터와 뷰를 격리 시키는 것이다. 이를

opentutorials.org

 

 

Model - CodeIgniter

Model View가 표현을 담당한다면 Model은 데이터를 담당한다. 여기서 데이터란 주로 데이터베이스를 의미한다. 즉 데이터를 다루는 로직을 모델에 모아둬서 데이터와 뷰를 격리 시키는 것이다. 이를

opentutorials.org

 

전체 코드 및 공부과정 주석들

 

컨트롤러

<?php

namespace App\Controllers;

class Main extends BaseController
{
    
    //중복되는 데이터베이스 로드 모델에서
    // $db = db_connect();
    // 모델가져오기
    // $topic_model = model('Topic_model');
    // protected $db;
    // protected $topic_model;


    public function __construct()
    {
        $db = db_connect();
    }

    public function index()
    {   
        // 리스트1. 데이터베이스 로드 (모델로)
        //$db = db_connect();
        //$this->db = db_connect();
        // 리스트5. 모델 불러오기 models폴더의Topic_modle.php 가져옴
        $topic_model = model('Topic_model');
        // 리스트6. 토픽의 클래스 인스턴스에 접속해서 함수 호출 (모델로)
        // 리스트 보여주기
        $topics = $topic_model->gets();
        // 리스트8. 내용을 표시해보기 주석풀어서 확인
        // foreach($data as $entry){
        //     //var_dump($entry->title); //array X
        //     var_dump($entry);
        // }
        
        $topic_list = view('topic_list', array('topics'=>$topics));

        return view('head')
                // 리스트9. 현재 model에 데이터를 가져와서 컨트롤러에 $data안에 gets()불러온 상태
               .view('Main') // 2번째 인자는 view에 전달하고자 하는 인자값이다
               // 리스트 보여주기
               .$topic_list
               .view('footer');
        
    }

    // CI4의 뷰는 이전과 매우 유사하지만 다르게 해석됩니다.
    // CI3의 $this->load->view(x); 대신 return view(x);를 사용합니다.
    function get($id){

        // 보기1. 데이터베이스 로드 Topic_model
        //$db = db_connect();
        $topic_model = model('Topic_model');
        // 보기 페이지에도 리스트 넣기
        $topics = $topic_model->gets();
        $topic_list = view('topic_list', array('topics'=>$topics));
        $topic = $topic_model->get($id);    //모델로
        return view('head')
        //.view('get', array('id'=>$id))  
        // 리스트 보여주기
        .$topic_list
        .view('get', array('topic'=>$topic))  
        .view('footer');

    }


}

 

 

모델

<?php

use CodeIgniter\Database\Query;
use CodeIgniter\Model;

// 리스트2. 모델 생성 클래스 기본약속 쓰기
class Topic_model extends Model{

    // 리스트3. 초기화 함수 construct() 생성자이고 파일이 실행되면 초기화 구문이 같이 실행
    //protected $db;
    function __construct()
    {
        parent::__construct();
        //$this->db = db_connect();
    }
    // 리스트4. 리스트에 가져갈 gets 함수 만들기 (컨트롤러로가서 불러오기)
    public function gets(){
        //echo 'test';
        // 리스트7. 데이터 가져오기 
        return $this->db->query('SELECT * FROM topic')->getResult();   //CI3에서 result()를 CI4에서 getResult()로 변경
        //return $this->db->query('SELECT * FROM topic')->getResult();
        // getResult() 는 객체의 형태로 담겨있다 (컨트롤러가기)

    }


    // 리스트 타고들어가면 보이는 보기페이지
    // 보기2. get -> 컨트롤러로 topic_id 인자 넘기기
    public function get($topic_id){
        // CI3을 CI4 참고 http://ci4doc.cikorea.net/installation/upgrade_database.html?highlight=get_where
        // 쿼리 빌더 클래스를 사용하려면 빌더 
        // $builder = $db->table('mytable');로 초기화해야 
        // $builder에서 쿼리를 실행할 수 있습니다. 
        // $this->db->get_where('mytable', array('id' => $id), $limit, $offset);를 
        // $builder->getWhere(['id' => $id], $limit, $offset);
        $db = db_connect();
        $builder = $db->table('topic');
        return $builder->getWhere(['id'=>$topic_id])->getRow();
        // 위 구문은 액티브레코드 라고 한다 ( 위 구문처럼 사용하면 sql 구문과 관계없이 편하게 사용이 가능하다.)
        //return $this->db->query('SELECT * FROM topic WHERE id='.$topic_id);
        // 와 같음
    }
    /*
    - application/models/Topic_model.php 파일의 get 메소드
    - 수정 전: get_where('topic', array('id'$topic_id))
    - 수정 후: get_where('데이터명.topic', array('id'$topic_id))

        $sql="select * from dd where...."; 형태가 익숙하면 그대로 쓰셔도 된다고 함.
        대신 엑티브 레코드를 쓰게 되면 $sql로 처리할때보다 보안이 한층 강화.
        sql injection에 대한 처리를 자동으로 처리

    */
}
?>

 

뷰 토픽리스트

<ul>
<?php
    foreach($topics as $entry){
?>
    <li><a href="/ci_web/public/main/get/<?php echo $entry->id;?>"><?php echo $entry->title;?></a></li>
<?php

    }
?>
</ul>
<li><a href="/ci_web/public/main">토픽리스트</a></li>

 

 

반응형
Comments