CI 묻고 답하기

제목 컨트롤러 파라미터 기본값 관련
글쓴이 코드이그 작성시각 2014/08/05 01:30:44
댓글 : 13 추천 : 0 스크랩 : 0 조회수 : 26151   RSS
http://도메인/컨트롤러/함수/인자1/인자2/인자3

이라는 url이 있고,


컨트롤러 아래 함수는 아래와 같을때


public function 함수($parameter1, $parameter2, $parameter3) {
            echo $parameter1;
            echo $parameter2;
            echo $parameter3;
}


echo에 인자1,인자2,인자3 이 찍혀나와야 하는것 아닌가요?

A PHP Error was encountered

Severity: Warning

Message: Missing argument 1 for Blog::함수(), called on line 40 and defined

Filename: controllers/blog.php

Line Number: 158


이런식으로 인자1 부터 3까지 없다고 나오네요.


여기서 함수에 인자의 기본값을 넣어 놓으면 에러는 안뜨는데 값이 또 변경 되지 않습니다 ;;


public function 함수($parameter1 = 1, $parameter2 = 2, $parameter3 = 3) {
            echo $parameter1;
            echo $parameter2;
            echo $parameter3;
}

로 수정한 후 

http://도메인/컨트롤러/함수/4/5/6 이라는 도메인으로 들어가도

값은 1,2,3 이 찍힌다는거죠.


제가 뭔가 잘못 알고 있는건지 왜 이런 현상이 일어나는지 모르겠네요.

마냐님 공개보드 소스에서도 저런식으로 짠 부분이 많은데 왜 기본값을 지정했는데 값이 안바뀌는건지 모르겠습니다.







Message: Missing argument 1
 다음글 ci 페이지 로딩속도 더 줄일수 있을까요? (2)
 이전글 wget으로 login 세션 유지하기 (1)

댓글

수야디벨 / 2014/08/05 09:32:45 / 추천 0
제가 모르는 부분이 있을지 모르지만, 

일단 URL이 http://도메인/컨트롤러/함수/인자1/인자2/인자3 이렇게 호출한다고 해도

자동으로 함수에 매핑 되는게 아닐텐데요?

인자1부터 3까진 $this->uri->segment()로 따로 받아서 처리하셔야 하는걸로 알고 있습니다.

그렇기 때문에 첫번째 오류는 


Message: Missing argument 1 for Blog::함수(), called on line 40 and defined

함수 파라미터가 제대로 호출되지 않았다는 오류가 뜨는 거고

두번째 같은 경우는 기본값이 지정이 되었기에 함수 파라미터 미싱 오류는 안뜨지만

매핑이 안되기 때문에 값이 변하지 않는걸로 생각됩니다만 ..
코드이그 / 2014/08/05 10:06:33 / 추천 0
수야디벨 // 

답변 감사드립니다.

제가 뭔가 잘못 알고 있었나 싶네요. 

아래 생활코딩 강좌에서도 url이 

http://ooo2.org/index.php/topic/get/1

일때 

펑션이
 
function get($id){
echo '
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
토픽 '.$id.'
</body>
</html>
';
}

이면 함수 다음의 숫자는 인자로 자동 인식이 되는거 같은데..

http://opentutorials.org/course/697/3829

segment로 구분하는 방법은 소스를 통해서 봤었는데 url 함수 다음 부분을 인자로 자동으로 인식하게 하는 방법은 없을까요?
수야디벨 / 2014/08/05 10:47:53 / 추천 0
아. 그래서 관련 메뉴얼을 찾아 봤습니다.

http://codeigniter-kr.org/user_guide_2.1.0/general/urls.html

메뉴얼에 보시면 /function<span 249,="" 249);="" color:rgb(0,="" 33,="" 102);="" font-family:monaco,verdana,sans-serif;="" font-size:12px"="">/ID 라고 되어있고 ,

함수뒤에 하나의 ID 값은 함수에 매핑시킬수 있다고 나오네요.

즉 생활코딩에서 나온 거처럼 get/1 처럼 한개의 인자는 되지만

get/1/2/3 이런식은 매핑이 안되는건 CI에서 지원하지 않기 때문이네요 ^^

따라서 결론적으로 질문자분의 상황으로 되돌려서 결론내려보면

파라미터3개를 자동 매핑해주는건 ci에서 지원하지 않으니

파라미터 한개만 자동 매핑처리하고 나머지 두개는 uri->segment 처리해서 받아서 사용하셔야겠네요

메뉴얼 한번 살펴보세요~
코드이그 / 2014/08/05 11:46:53 / 추천 0
수야디벨 //

답변감사드려요 ^^

구글링하다가 찾은 아래의

http://croute.me/604 블로그 에서는 인자값 여러개가 가능한 것 같은데... ㅠ

문제는 저는

public function ccc($parameter1) {
      echo $parameter1;
}

라는 함수를 만들고 /컨트롤러/ccc/1

이라고 해도 인자가 비었다고 나오네요 ㅠ

뭐가 문제인건지 이리저리 해봐도 답답하네요 ㅋ;;
한대승(불의회상) / 2014/08/05 15:01:59 / 추천 0
라우팅쪽 살펴 보세요.
값이 안넘어 오는게 이상한겁니다.
코드이그 / 2014/08/05 15:04:20 / 추천 0
불의화상 //

힌트 감사드립니다. 라우팅쪽 찾아보겠습니다 ^^
코드이그 / 2014/08/05 15:13:39 / 추천 0
불의화상 //

라우트관련 말고 또 찾아볼만한 곳이 없을까요?

생각해보니 저는 Route.php 을 건든적이 없어서요 ;;
한대승(불의회상) / 2014/08/05 15:16:26 / 추천 0
크게 중요한 소스코드가 아니라면 실제 소스코드를 보여주세요. ^^
정보가 부족합니다.
darkninja / 2014/08/05 16:23:46 / 추천 0
불여우에서는 주소줄에서는 한글함수가 안 불려지네요
함수이름을 영어로 바꾸면 됩니다.
코드내에서는
  $this->함수('z', 'x', 'c');
이렇게 부르는게 되고여...
 
코드이그 / 2014/08/05 16:25:17 / 추천 0
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Blog extends CI_Controller {

    public function __construct() {
        parent::__construct();
        //$this->output->enable_profiler(TRUE);
        $this->load->database();
        $this->load->model('m_blog');
        $this->load->library('blog_lib');
        $this->load->helper('url');
    }

    public function index() {
        // head 호출
        $this->view();
    }

    //헤더, 푸터 자동삽입
    public function _remap($method) {
        // 공통 head 호출
        $this->load->view('blog/_head.php');

        // 클래스에 해당 메소드가 없으면 출력하지 않도록
        if ( method_exists($this, $method) ) {

            $this->{"{$method}"}();
            $this->side_menu();

        }else{
            echo 'URL을 잘못 입력하셨습니다.';
        }

    }

    public function side_menu($table = 'study') {
        $data['table'] = $table;
        $data['new_post'] = $this->new_post();
        $data['all_tag'] = $this->tag();

        $this->load->view('blog/_side_menu', $data);
    }

    public function lists() {
        // main 호출
        //$this->load->view('adm/v_login');
        
    }

    public function new_post() {
        $new_post = $this->m_blog->new_record();
        return $new_post;
    }

    public function tag() {
        $all_tag = '';

        // 블로그의 태그를 가져온다
        $tag = $this->m_blog->all_record();
        $count = count($tag);

        // 모든 태그를 배열안에 넣는다
        for ( $i = 0; $i < $count; $i++ ) {
            $tag[$i] = $tag[$i]->tag;
        }

        // 생긴 배열안의 문자열을 변수에 담는다
        foreach ( $tag as $a ) {
            $all_tag .= $a.'|';
        }

        // 문자열을 배열로 변환
        $all_tag = explode('|', $all_tag);
        $all_tag = array_filter($all_tag);
        $all_tag = array_unique($all_tag);

        return $all_tag;
    }
    
    public function bbbb($parameter1, $parameter2, $parameter3) {
            echo $parameter1;
            echo $parameter2;
            echo $parameter3;
        }
        
        public function ccc($parameter1) {
            echo $parameter1;
        }
}

blog 컨트롤러인데요. 나머지는 모두 정상 작동하는듯 한데,

bbbb, ccc 함수를 출력하게되면 인자값이 자꾸 없다고 나옵니다.


해당 오류 부분은 아래 첨부하였습니다.



위 에러의 해당 라인은 함수에 파라미터를 넣었기 때문이고,
아래의 해당라인은 인자로 넣은 파라미터를 echo로 찍었기 때문인거 같습니다.

위 함수에서 파라미터의 디폴트 값을 넣어주면 에러가 사라지는데
함수 다음에 인자값을 넣어도 디폴트값으로만 나오고 변하지 않네요.
코드이그 / 2014/08/05 16:30:27 / 추천 0
  darkninja//

댓글 감사합니다. 

그런데 함수라는 함수명은 예를 들기위해서 적어놓은것이에요 ㅎㅎ


 
한대승(불의회상) / 2014/08/05 16:32:16 / 추천 0
_remap() 함수때문에 발생한 겁니다.
 
public function _remap($method) {
 // 공통 head 호출
 $this->load->view('blog/_head.php');

 // 클래스에 해당 메소드가 없으면 출력하지 않도록
 if ( method_exists($this, $method) ) {

     $this->{"{$method}"}();
     $this->side_menu();

 }else{
     echo 'URL을 잘못 입력하셨습니다.';
 }
}
이 부분을 아래 처럼 고쳐 사용하세요.
 
public function _remap($method, $params = array()) {
 // 공통 head 호출
 $this->load->view('blog/_head.php');

 // 클래스에 해당 메소드가 없으면 출력하지 않도록
 if ( method_exists($this, $method) ) {

     call_user_func_array(array($this, $method), $params);
     $this->side_menu();

 }else{
     echo 'URL을 잘못 입력하셨습니다.';
 }
}


^^ 
코드이그 / 2014/08/05 16:39:14 / 추천 0
한대승 //

아......................................

리맵에서 애초에 인자를 그렇게 받았었군요;;

정말 감사드립니다. 한순간에 머리속에 환해지는거 같아요.

선배님들 관심 가져주셔서 정말 감사합니다 ㅎㅎㅎ