만들면서 배우는 CodeIgniter Q&A

제목 write_v 관련 질문입니다.
글쓴이 미나리나물 작성시각 2017/06/08 00:20:35
댓글 : 1 추천 : 0 스크랩 : 0 조회수 : 76819   RSS

현재 3쇄를 구입해서 보고 있습니다.

이제 게시판 프로젝트에서 게시물 입력(쓰기) 부분을 보고 있는데, 해당 부분에서 자꾸 오류가 발생됩니다.

입력주소 - http://localhost/bbs/board/lists/ci_board/page/

오류 내용


A PHP Error was encountered

Sevirity: Notice

Message: Undefined offset: 4

Filename: controllers/board.php

Line Number: 108


 

<?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');
    $this -> load -> helper(array('url', 'date'));
  }

  /**
  * 주소에서 메서드가 생략되었을 때 실행 될 기본 메서드
  **/
	public function index()
	{
		$this -> lists();
	}

  /**
  * 사이트의 헤더, 푸터를 자동으로 추가해 주는 부분
  **/
	public function _remap($method)
  {
    // 헤더 include
    $this -> load -> view('header_v');
    if (method_exists($this, $method)) {
      $this -> {"{$method}"}();
    }
    // 푸터 include
    $this -> load -> view('footer_v');
  }

  /**
  * 목록 불러오기
  **/
	public function lists()
  {
    // 아래 부분은 실제로 적용할 땐 주석 처리 해야 함!
    # $this -> output -> enable_profiler(TRUE);

    $search_word = $page_url = '';
    $uri_segment = 5;
    // 검색어 초기화

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

    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'] = '/bbs/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);
  }

  /**
  * url 중 키 값을 구분하여 값을 가져오도록
  *
  * @param Array $url : segment_explode 한 url 값
  * @param String $key :  가져오려는 값의 key
  * @return String $url[$k] : 리턴 값
  **/
  function url_explode($url, $key) {
    $cnt = count($url);

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

  /**
  * HTTP의 URL을 "/"를 Delimiter로 사용하여 배열로 바꿔 리턴한다.
  *
  * @param String 대상이 되는 문자열
  * @return string[]
  **/
  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;
    }

    /**
    * 게시물 보기
    **/
    function view() {
      $data['views'] = $this -> board_m -> get_view($this -> uri -> segment(3), $this -> uri -> segment(4));
      // 게시판 이름과 게시물 번호에 해당하는 게시물 가져오기

      $this -> load -> view('board/view_v', $data);
      // view 호출
    }
    /**
    * 게시물 쓰기
    */
    function write() {
      echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';

      if ($_POST) {
        // 글쓰기용 POST 전송 시
        $this -> load -> helper('alert');
        // 경고창을 띄우기 위한 헬퍼 로딩
        $uri_array = $this -> segment_explode($this -> uri -> uri_string());
        // 주소 중에서 page 세그먼트가 있는지 검사하기 위해 주소를 배열로 반환
        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('비 정상적인 접근입니다.', '/bbs/board/lists/'.$this -> uri -> segment(3).'/page/'.$pages);
          exit;
        }

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

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

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

 

해당 오류로 검색을 해보니, 웅파님이 답변해 주신게 있어서 참고 했습니다만,

문제는 주소에서 .../page/ 뒤에 숫자가 없으면 1을 리턴하게 되어 있는걸로 이해하고 있는데(161번라인),

제가 입력한 주소에는 ../page/ 뒤에 번호가 없음에도 불구하고 180번 라인에 $pages에 변수 1이 입력되지 않습니다.

이 문제 때문에 오류가 발생되는 것 같은데, 다른 문제가 있는걸까요?

 다음글 코드이그나이터 처음 배우는 초보입니다. (9)
 이전글 php5.6 에서 소스업로드하고, 환경설정하고 접속하니... (2)

댓글

변종원(웅파) / 2017/06/08 09:37:29 / 추천 0

해당 로직은 주소에 page가 있으면 그 다음 세그먼트를 가져오는 로직입니다. 

위 상황은 주소에 page까지만 있기 때문에 다음 세그먼트를 가져오지 못해서 생기는 경고입니다.

page/1 이라고 주소를 입력하여 접속하거나 리스트 프로그램에서 모든 주소가 제대로 표시되도록 해야 합니다.