CI 묻고 답하기

제목 select해서 뿌려주기~ 관해 여쭙니다
글쓴이 우왕 작성시각 2011/06/15 21:40:55
댓글 : 6 추천 : 1 스크랩 : 0 조회수 : 20810   RSS
안녕하세요.. 
바로 질문드릴게용..;;;


select해서

<td><?echo $변수명;?></td>

이렇게 넣어서 뿌려주잖아요~~

근데 이 작업들을 코드이그나이터로 하려면

음 model페이지랑 view페이지랑 다 다른 페이지에 작업해야하나요?;;;

그리구

select하는 방법이 여러개인가요..?

제가 찾아본결과 CI_Model 메소드 불러서 쓴다던데,,그리구 그 방법 말고

$this->db->get이랑 query이렇게도 쓰는거같았거든요.. 가이드페이지에서 봤을때..

자기맘대로 아무거나 써도되나요??

그리구,, 제가 테스트해봤을때..

view쓰려면 view폴더에 넣어야하구 모델쓰려면 모델폴더에 넣고 컨트롤러쓸땐 컨트롤러폴더에 넣었었거든요..

근데 제가 프로젝트하고있는건,,있어야할 폴더가 따로있는데,,이걸 어떻게해야할까요;;

제가 이곳 접한지도 얼마안됐지만,,신입이라서 ,,사실 용어도 좀 ,,들어는봤는데 아직 많은 용어를 알지못해서
보는데 좀 이해못하는 부분도 있어서요..염치불구하고 여쭙니다..;;죄송합니다...그럼 수고하세요~ㅎㅎ
 다음글 [초보]라우팅에 관하여~ (3)
 이전글 DB설정관련 질문입니다. (3)

댓글

헛발이 / 2011/06/16 00:05:53 / 추천 0
안녕하세요~ 바로 답변입니다.
처음이라면 상당히 혼란스러울듯 싶네요.. 처음 저도 그랬으니깐요.. 왜 이렇게 불편하게 쩌~기서 불러서 저기로 보내고 다시 그걸 저기로 보내서 보여줘야 하나... 디게 불편하네.. 내가 하는 예전방식은 아주 쉽고 간편한데...라고 저는 처음에 그렇게 생각했었죠... 조금만 참으시고 해보시면 좋은 결과가 있을거라 생각합니다.

일단 메뉴얼에 나와 있듯이 원래 프레임워크라는것은 반복적 또는 재생산에 효율을 높이고 여러사람이 작업하기 용이하게 되어 있지만 타 프래임워크와는 다르게 "코드이그나이터"는 자율성을 중요시합니다.

즉 정해진 규칙(MVC방식)이 있지만 코드이그나이터에서는 VC만으로도 사용해도 무관한다고 메뉴얼에 나와있답니다. 처음이라면 이 말도 잘 이해가 가질 안으시겠지만....나중에 한 6개월 이후에 다시 한번 읽어 보시면 이해가 가실듯.. 합니다...

일단 아주 쉽게 데이터를 읽어서 화면에 보여주는 작업은 딱 3가지 흐름으로 작업을 합니다.
DB가 준비되어 있다고 가정을 하고 기타 설정부분을 다 했다고 가정을 하면 작업순서는 다음과 같습니다.


1. 콘트롤러에서 작업의 흐름을 코딩한다.
//콘트롤러에서 이렇게 순서를 정합니다.
class Blogs extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    function index()
    {
        //모델을 쓰기 위해 로딩을 합니다.
        $this->load->model('blog_m');

        //모델의 getAll()함수를 호출하여 값을 얻어옵니다.
        $data['query'] = $this->blog_m->getAll();

        //뷰로 값을 보내주고 뷰를 로딩하여 화면을 출력한다.
        $this->load->view('list_form', $data);
    }
}
이렇게 먼저 콘트롤러에서 순번을 만들어 놓는것입니다. 사실 코드이그나이터에서는 모델에서 작업할 것을 콘트롤러에서 해도 된다고 되어 있고 실제로 콘트롤러에서 해도 되긴 하지만 콘트롤러의 목적은 작업의 흐름이기 때문에 가능하면 흐름을 아주 간소하고 명료하게 만드는게 중요하고 나머지 자질구리한 작업들은 라이브러리나 핼퍼 모델등에서 해주면 됩니다.

다음으로는 그럼 모델에서는 어떻게 해야 하는가는 다음과 같습니다.


2. 모델에서 값을 얻어 옵니다.
class Blog_m extends CI_Model
{
    function __construct()
    {
        parent::__construct();
    }

    //콘트롤러에서 호출한 부분
    function getAll()
    {
        //아래 한줄만 써도 blogs의 테이블 내용을 모조리 불러옵니다.
        $query = $this->db->get('blogs');

        //1개이상의 데이터가 존재 한다면 얻은 값을 리턴한다.
        if ($query->num_rows() > 0) return $query;

        //값이 없으면 NULL을 리턴하여 콘트롤러에서 나중에 처리 해준다.
        return NULL;
    }
}
이렇게 하면 콘트롤러에서는 $data['query']에 값을 모두 받게 됩니다.
그리고 콘트롤러에서 해준것 처럼 뷰로 $query라는 변수로 값을 보내게 되죠...
그러면 뷰에서는 어떻게 처리 하냐 하면요.. 다음과 같이 합니다..


3. 뷰에서 값을 찍어주기..
<!-- 혹시 데이터가 아무것도 없으면 아무것도 안하게 합니다. -->
<?php if (!$query->num_rows()) : ?>

<p>데이터가 아무것도 없네요~</p>

<?php else: ?>

<!-- 데이터 만큼 루프를 돌면서 값을 찍으면 됩니다. -->
<table>
<?php foreach ($query->result() as $item): ?>
    <tr>
        <td><?php echo form_prep($item->id); ?></td>
        <td><?php echo form_prep($item->title); ?></td>
        <td><?php echo form_prep($item->name); ?></td>
    </tr>
<?php endforeach; ?>
</table>

<?php endif; ?>
이렇게 해주면 됩니다. 여기서 좀 이해가 잘 안가죠?  혹시 foreach문 써본적있으신가요? 없으면 PHP.NET으로 가셔서 한번 찾아 보시고요... 루프를 돌면서 찍습니다.
그런데 첨보는 것들이 나왔쬬? form_prep()는 코드이그나이터에서 제공해주는 핼퍼입니다. 메뉴얼 찾아 보시구요.. 만약에 blogs라는 테이블에 id, title, name, comment......등등의 컬럼이 있다면 모델에서 일일이 필드명을 쓰지 않아도 한번에 불러왔기 때문에 뷰에선 원하는 필드면 적어 주면 됩니다.

즉 콘트롤러에서 $data['query']에 데이터를 다 넣었기 때문에 뷰에서는 $query라는 배열에 모든 값들이 들어 있구요.. $query에서 reqult만 뽑아 내서 루프를 돌립니다. 뽑아내는것은 $query->result()이렇게 하면 되구요..

그러면 하나의 레코드정보는 $item이라는 곳에 담아 지고 그 속에 모든 필드의 정보가 들어있게 됩니다.
그래서 루프안에서 원하는 정보만 즉 $item->id 또는 $item->name만 추출 해서 보여주기만 하면 됩니다.


이렇게 하는게 가장 기본적인 동작방법일거에요..
여기에서 좀더 발전 하거나 좀더 자세한 부분들을 처리 하기 위해서 살이 붙고 이것저것 하게 되는것이 될거에요.
가능 하면 포럼 소스나 기타 다른 분들이 쉬운 예로 만든것을 하나 보고 따라하면서 해보면 금방 익숙해 질거에요. 하지만 쉽지만은 않죠.. ^^;


다음으로 모델에서 값을 얻어 오는 방법
다음으로 모델에서 값을 얻어 오는 방법은 여러가지가 있겠지만 말씀하신거 처럼 두가지가 기본적이죠..
하지만 솔찍히(개인적인생각)  $this->db->query();는 비추천입니다. 가능하면 get을 사용하는것이 좋아요. 여러가지 이유가 있지만 아주 복잡하고 특수한 경우 도저히 코드이그나이터에서 제공해 주는 엑티브레코드를 사용할수가 없을 경우 직접 쿼리문장을 작성하는 것인데 인젝션문제도 있고 $this->db->query();를 쓸정도로 복잡한 쿼리문을 사용하는 경우는 드물다고 봐요. 아니면 엄청 큰 대형프로젝트나 테이블이 엄청 꼬여 있거나 등등 특수한 경우는 상용하지만 아직 초보자라면 query를 사용하는건 비추천입니다.
저도 코드이그나이터를 한 1년 했는데 처음 시작할땐 조인하는것때문에 $this->db->query();를 썼는데.. 결국 처음이 지나고 좀 지나니 $this->db->query();를 사용안하게 되더라구요...


마지막 질문에 대한 답변은....
음... 어떤상황인지는 잘 모르지만 프레임워크는 내가 만든 홈페이지에 따로 폴더를 하나 둬서 거기에 코드이그나이터를 넣고 불러다 쓰는 방식이 아니에요.. 그러니 당연히 지금 하는 프로젝트와 코드이그나이터를 구분지으면 안된다고 생각합니다.
메뉴얼에 보면 부득이한 경우 자신이 만든 기존소스에서 코드이그나이터의 자원을 갖다 사용할 수 있는 기술적인 부분이 있기는 하지만 근본적으로 따로 사용하는것이 아니기 때문에 별개로 보시면 안됩니다.
그러니 시작하는 프로젝트라면 처음부터 코드이그나이터로 작업을 해야 합니다.





설명이 좀 길어 졌는데.. 저도 아직 많이 부족해서 더 시원하게 답변을 못하겠네요...
얼른 고수님이 되어서 저도 좀 갈켜 주세요~

우왕 / 2011/06/16 10:29:38 / 추천 0

우와~ 진짜 감사합니다.....
길게쓸 시간이없어 이 한 줄로 인사드린다는게 송구스럽네요..ㅠㅠ이해해주세요

한대승(불의회상) / 2011/06/17 08:31:51 / 추천 0
 어서오세요. 반갑습니다. ^^
무명의시인2 / 2011/06/17 09:39:07 / 추천 0
헛발이님 설명을 잘해주셔서 정말 좋습니다 ㅎㅎ
헛발이 / 2011/06/17 10:01:45 / 추천 0
아우~~~ 귀가려워여~ 감사합니다.. ㅋㅋ
milosz / 2011/06/22 06:52:56 / 추천 0
 덧글 멋지네요. 이거 강좌로...ㅎㅎ