질문 Q #8593
dbforge 에 대한 질문..
루디아 2009-10-06 10:51:33

관리클래스를 아래와같이 로드합니다:
$this->load->dbforge();

라는 부분이 있는데..
실제 system/database 에는 DB_forge.php 만 존재합니다.

아래 부분이 실행이 되지 않습니다.
$this->dbforge->create_table('table_name');

뭔가 Action 해 주어야 할 것이 있는지요?

참고로 저는 CI는 1.7.1 와  match box 0.9.4를 사용하고 있습니다.
답변 11
#1 ci세상 2009-10-06 12:09:20
$this->dbforge->add_field('id INT(9) NOT NULL AUTO_INCREMENT');
$this->dbforge->add_field('id_stem INT(10) NOT NULL');
$this->dbforge->add_key('id',true);
$this->dbforge->create_table('member',true); 
#2 루디아 2009-10-06 15:24:34

네.. 해봤는데..
$this->dbforge->sum_function();

이 동작이 되지 않습니다..!!

 $this->load->dbforge();             // table 생성과 삭제관련
  $table_prefix = "board".$id;  
echo 'table_name='.$table_prefix.'<br>';
  $this->dbforge->add_field('id INT(9) NOT NULL AUTO_INCREMENT');
  
echo 'add_field...';  
  $this->dbforge->add_field('id_stem INT(10) NOT NULL');
  $this->dbforge->add_key('id',true);
  $this->dbforge->create_table($table_prefix, TRUE); 

table_name 까지만 인쇄되고 그 이후 동작이 되지 않습니다..

#3 ci세상 2009-10-06 17:44:46
주신 코드 $id 값만 제대로 받는다면 정상적으로 작동되는것 확인하였습니다.

아마도 db 계정 user 권한이 제한된것 같습니다. 호스팅 계정이라면 권한을 한번 체크해 보시구요

위 부분은 로컬에서 apmsetup 같은것으로 설치하셔서 테스트 해보시면 정상작동되는 것을 확인 가능하실듯 보입니다.
#4 루디아 2009-10-06 21:03:43
감사합니다.

해보니 controllers에 넣어서 하니까 됩니다.
모델로 뺐더니 안되는건 왜그런지 모르겠습니다.
#5 ci세상 2009-10-06 22:23:11
모델도 잘되는데요 안되시는 소스 함 올려줘보세요..  전 다음처름 해보았습니다.

### 컨트롤러 ###
<?php

class Welcome extends Controller {

	function Welcome()
	{
		parent::Controller();	
	}
	
	function index()
	{

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

		$this->load->model('board_model');
		$this->board_model->table_make(); 
	}
}


### 모델 ####

<?
class Board_model extends Model {

    function Board_model()
    {
        parent::Model();
    
	}

    function table_make()
    {
		$this->load->dbforge();
		$this->dbforge->add_field('id INT(9) NOT NULL AUTO_INCREMENT');
		$this->dbforge->add_field('id_stem INT(10) NOT NULL');
		$this->dbforge->add_key('id',true);
		$this->dbforge->create_table('member',true); 
    }
}
?>
#6 루디아 2009-10-07 09:41:51

function create()
 {
     $id = $this->comm_model->get_uri_value('create');   // id 값을 가져옴
    $page = $this->comm_model->get_uri_value('page');   // page parameter를 가져옴
  
    if ($this->_create_table($id))
    {  
        $data = array('status' => '실행');      // 상태변경 : 대기->실행
     
        $this->db->where('id', $id);
        $this->db->update('bbs_group', $data);     
    }
   else
       $this->session->set_flashdata('error', lang('error_create_table'));  

    redirect('board/bbs_group/lists/page/'.$page);    // 페이지로 돌아가기     
 }
 /**
 * @author   : Lydia 
 * @Update      : 2009. 10. 6.
 * @Description : Table Create ( model에 넣으면 Error 걸림 : 왜 일 까?)
 *
 **/  
 function _create_table($id)
 {         
  $table_name = 'board'.$id;     
  $this->dbforge->add_field('id INT(9) NOT NULL AUTO_INCREMENT');
  $this->dbforge->add_field('bbs_no int(9) NOT NULL');
  $this->dbforge->add_field('hits int(9) NOT NULL');   
  $this->dbforge->add_key('id',true);
  $this->dbforge->create_table($table_name, TRUE);
  
  retrun true;
}

_create_table을 모델에 넣으면 동작이 안되더군요.
다른 function은 잘 동작이 되는데....

#7 변종원(웅파) 2009-10-07 10:19:52
_create_table 이 Private 함수라서 그럴지도 모르겠네요.
컨트롤러에서는 함수명앞에 _가 붙으면 Private 함수가 되는데
모델에서도 사용가능한지는 모르겠습니다.

함수명에서 _를 빼고 작업해보세요. ^^
#8 루디아 2009-10-07 11:38:04
네.. 물론 모델에서는 _ 빼고 했습니다.

컨트롤러에 넣느라고 _를 집어 넣었습니다.
일단 Demo 시간을 맞추고 리펙토링을 해야 할듯 합니다.

친절한 답변에 감사합니다!

추가로 질문드리게 있다면, 여기서는 index.php를 Url에 넣지 않았는데,
base_url에 넣은 것 인지요? 아닌 다른 방법이 있는지요?
#9 ci세상 2009-10-08 01:05:17
retrun -> return 오타가 있네요.

전 아래와 같이 테스트 해보니 잘 되었습니다.^^

<?php

class Welcome extends Controller {

	function Welcome()
	{
		parent::Controller();	
		$this->load->dbforge(); 
	}
	
	function index()
	{
		$id = "1";

		if ($this->_create_table($id))
		{  
			echo "실행"; 
		}
	}


	 function _create_table($id)
	 {         
		
		$table_name = 'board'.$id;      
		$this->dbforge->add_field('id INT(9) NOT NULL AUTO_INCREMENT');
		$this->dbforge->add_field('bbs_no int(9) NOT NULL');
		$this->dbforge->add_field('hits int(9) NOT NULL');   
		$this->dbforge->add_key('id',true);
		$this->dbforge->create_table($table_name, TRUE);

		return true;

	}
}
#10 ci세상 2009-10-08 09:16:49
index.php 주소 줄이기 부분은 서버명령어를 이용한 부분인데요 다음 주소를 참조해 주세요.
http://codeigniter-kr.org/tip/view/8/page/4/
http://codeigniter-kr.org/tip/view/2/page/4/
#11 루디아 2009-10-16 11:02:29
감사합니다.