제목 | 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 이라고 주소를 입력하여 접속하거나 리스트 프로그램에서 모든 주소가 제대로 표시되도록 해야 합니다.