만들면서 배우는 CodeIgniter Q&A

제목 125페이지 입력부분 질문 입니다.
글쓴이 책상다리 작성시각 2013/10/28 11:34:14
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 15493   RSS
 게시판의 글쓰기 부분을 만들어봤습니다.
글도 써지고, 입력되었습니다. 라는 팝업창도 뜨면서, DB에도 글도 무사히 등록되고 다 잘되는데,
입력되었습니다. 팝업 창이 뜨면서 뒤에 애러 문구가 하나 나오는데요. 이걸 해결을 못하겠습니다..

애러 메세지는 Undefined offset: 4
파일 이름은 controllers/board.php
라인은 152번째 입니다.

아래는 제가 작성한 board.php 전체 내용입니다.
그대로 해석하면 offset 4가 정의되있지 않다는거 같은데, 
해결방법을 모르겠습니다..ㅠ 도와주세요 ㅠ 
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Board extends CI_Controller{

 function __construct()
 {
  parent::__construct();
    $this->load->database();
    $this->load->model('board_m');
 }

 public function index()
 {
  $this->lists();
 }

 public function _remap($method)
 {
  $this->load->view('header_v');

  if(method_exists($this, $method))
  {
   $this->{"{$method}"}();
  }

  $this->load->view('footer_v');
 }

 public function lists()
 {
  $this->output->enable_profiler(FALSE);
  //검색어 초기화
  $search_word = $page_url = '';
  $uri_segment = 5;

  //주소중에서 q(검색어) 세그먼트가 있는지 검사하기 위해 주소를 배열로 변환
  $uri_array = $this->segment_explode($this->uri->uri_string());

  if( in_array('q', $uri_array) ) {
   //주소에 검색어가 있을 경우의 처리. 즉 검색시
   $search_word = urldecode($this->url_explode($uri_array, 'q'));

   //페이지네이션용 주소
   $page_url = '/q/'.$search_word;
   $uri_segment = 7;
  }

  $this->load->library('Pagination');

  //페이지네이션 설정
  $config['base_url'] = '/board/lists/ci_board'.$page_url.'/page/'; //페이징 주소
  $config['total_rows'] = $this->board_m->get_list($this->uri->segment(3), 'count','','',$search_word);
   //게시물의 전체 개수
  $config['per_page'] = 5; //한 페이지에 표시할 게시물 수
  $config['uri_segment'] = $uri_segment; //페이지 번호가 위치한 세그먼트

  //페이지네이션 초기화
  $this->pagination->initialize($config);
  //페이지 링크를 생성하여 view에서 사용할 변수에 할당
  $data['pagination'] = $this->pagination->create_links();

  //게시물 목록을 불러오기 위한 offset, limit 값 가져오기
  $page = $this->uri->segment($uri_segment, 1);

  if( $page > 1 )
  {
   $start = (($page/$config['per_page'])) * $config['per_page'];
  }
  else
  {
   $start = ($page-1) * $config['per_page'];
  }
  $limit = $config['per_page'];

  $data['list'] = $this->board_m->get_list($this->uri->segment(3), '', $start, $limit, $search_word);
  $this->load->view('board/list_v',$data);
 }

 function view()
 {
  $data['views'] = $this->board_m->get_view($this->uri->segment(3), $this->uri->segment(4));

  $this->load->view('board/view_v',$data);
 }

 function write()
 {
  echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
  if( $_POST )
  {
   //글쓰기 POST 전송 시

   //경고창 헬퍼 로딩
   $this->load->helper('alert');

   //주소 중에서 page세그먼트가 있는지 검사하기 위해 주소를 배열로 변환
   $uri_array = $this->segment_explode($this->uri->uri_string());

   if( in_array('page', $uri_array) )
   {
    $pages = urldecode($this->url_explode($uri_array, 'page'));
   }
   else
   {
    $pages = 1;
   }

   if( !$this->input->post('subject', TRUE) AND !$this->input->post('contents', TRUE) )
   {
    //글 내용이 없을 경우, 프로그램단에서 한번 더 체크
    alert('비정상적인 접근입니다.','/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
    exit;
   }

   //var_dump($_POST);
   $write_data = array(
    'table' => $this->uri->segment(3),
    'subject' => $this->input->post('subject', TRUE),
    'contents' => $this->input->post('contents', TRUE),
   );

   $result = $this->board_m->insert_board($write_data);

   if( $result )
   {
    //글 작성 성공 시 게시물 목록으로
    alert('입력되었습니다.', '/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
    exit;    
   }
   else
   {
    //글 실패 시 게시물 목록으로
    alert('다시 입력해 주세요.','/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
    exit;
   }
  }
  else
  {
   //쓰기 폼 view 호출
   $this->load->view('board/write_v');
  }
 }

 function url_explode($url, $key)
 {
  $cnt = count($url);
  for($i=0; $cnt>$i; $i++ )
  {
   if($url[$i] == $key)
   {
    $k = $i+1;
    return $url[$k];
   }
  }
 }

 function segment_explode($seg)
 {
  //세크먼트 앞뒤 '/' 제거후 uri를 배열로 반환
  $len = strlen($seg);
  if(substr($seg, 0, 1) == '/')
  {
   $seg = substr($seg, 1, $len);
  }
  $len = strlen($seg);
  if(substr($seg, -1) == '/')
  {
   $seg = substr($seg, 0, $len-1);
  }
  $seg_exp = explode("/", $seg);
  return $seg_exp;
 }
}
 다음글 56페이지 질문입니다. (2)
 이전글 xampp 컨트롤러 실행시간 1초이상 나옵니다. (3)

댓글

변종원(웅파) / 2013/10/28 12:01:59 / 추천 0
이렇게 질문하시면 152라인이 어디인지 제가 모릅니다.

해당하는 라인을 찝어주세요. ^^;

책상다리 / 2013/10/28 12:36:26 / 추천 0
 아 죄송합니다...;;

return $url[$k];

요 부분입니다. 

변종원(웅파) / 2013/10/28 13:42:54 / 추천 0
해당 함수는 주소의 세그먼트를 배열화 한 것에서 특정 키워드를 찾아주는 것인데

아무래도 write 주소를 잘못 적용하신 것 같습니다.

쓰기 주소는 http://도메인/bbs/board/write/ci_board/page/1 입니다.
변종원(웅파) / 2013/10/28 13:48:40 / 추천 0
127 라인이 잘못 되었네요. 입력은 정상적으로 되는데 입력후 리스트로 포워딩할때 세그먼트를
잘못 지정하셨네요.

책 소스에는 /bbs/board/lists 로 시작을 합니다. 그래서 3번째 세그먼트로 지정되어 있고
책상다리님처럼 bbs 폴더를 없애고 사용한 경우에는 /board/lists/'.$this->uri->segment(2) 가 되어야 합니다.
책상다리 / 2013/10/28 14:21:37 / 추천 0
아 답변 감사합니다. 그런데 아직 애러가 그대로 나고, 추가로 

Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'write ORDER BY board_id DESC' at line 1

SELECT * FROM write ORDER BY board_id DESC

Filename: C:\xampp\htdocs\system\database\DB_driver.php

Line Number: 330

이런 것도 나오는거 보니...제가 bbs폴더를 없애고 세그먼트 지정해주면서 뭔가 꼬인게 아닌가 싶네요. 찬찬히 처음부터 살펴봐야겠습니다 ㅠㅠ 

변종원(웅파) / 2013/10/29 12:09:53 / 추천 0
세그먼트를 수정하게 되면 관련된 소스를 전부 수정해야 합니다.

쿼리 에러는 세그먼트에서 테이블명을 가져오도록 되어 있는데 그 값이 없어서 나는 에러입니다.

http://도메인/bbs/board/write/ci_board/page/1 

위 주소에서 ci_board가 테이블명입니다.

책상다리 / 2013/10/29 14:06:50 / 추천 0
 감사합니다. 정말 찬찬히 다시 봐야겠습니다...;;