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