| 제목 | write_v 관련 질문입니다. | ||
|---|---|---|---|
| 글쓴이 | 미나리나물 | 작성시각 | 2017/06/08 00:20:35 | 
| 
                         | 
                |||
| 
                         현재 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 이라고 주소를 입력하여 접속하거나 리스트 프로그램에서 모든 주소가 제대로 표시되도록 해야 합니다.