CI 묻고 답하기

제목 안녕하세요 CI 에서 DB 처리중에...
글쓴이 광복절 작성시각 2011/07/15 11:20:46
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 20107   RSS
안녕하세요. CI 초보 입니다.

처음에 메뉴얼을 보고 어리둥절했는대 자꾸 들여다 보니 메뉴얼이 참 좋은 지침서

같군요

다름이 아니라  MYSQL 중 컬럼에 NOT NULL default '' ; 와 같은 컬럼에 데이터를 입력하는 중입니다.

기존 PHP 작성시에는 해당 값이 NULL 이라도 데이터가  ''(빈데이터)  형태로 들어 갔었거든요

CI 로 작성하면서  "해당컬럼에는 NULL 이 될수 없다는 에러 파일이 출력 되더라구요


// 컨트롤러
$query = array(
'email' => $_POST['email'],
}
$this->db->insert('test', $query);


ci 자체에서 제한 하는거 같은대 이런 부분은 어찌 처리 해야 되는지 궁금합니다.

그냥  인서트  전에 $email=""; 해주고 데이터 가 존재하면 다시 변수에 넣어주는 방법을 해야 할까요?

또한 $this->input->post('email') 로 넣어주면 값이 0 으로 들어가 버리드라구요.

살포시 조언 부탁드립니다.


 다음글 웅파님 파일 첨부 했습니다 ....ㅠㅠ CI기반애플리케... (6)
 이전글 쿼리문 질문 (2)

댓글

변종원(웅파) / 2011/07/15 11:50:37 / 추천 0
ci는 php처럼 선언되지 않은 변수를 나중에 값을 가져와서 사용하는 것을 용인하지 않습니다.
php의 편한 점이기는 하나 사용할 변수는 미리 선언하여 값을 주는 것이 좋습니다.
인서트 전에 빈값으로 선언하시는 것이 좋겠네요.

그리고 되도록이면 $_POST 변수 쓰지마시기 바랍니다.
$this->input->post 쓰시게 되면 xss도 자동으로 막아줍니다.
헛발이 / 2011/07/15 12:11:56 / 추천 0
제가 직접 해 봤는데요... 빈값 들어가는데... ㅡ.ㅡ;;;

현재 디비는
CREATE TABLE IF NOT EXISTS `test` (
  `name` varchar(254) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
이렇게 되어 있는 상태이고...

광복절님의 소스를 그대로 인용해서 콘트롤러에서는 이렇게 했습니다..

class Tests extends CI_Controller {

    public function index()
    {
        $this->load->database();
        $this->load->helper(array('form'));
        
        if ($_POST) {
            $query = array(
                        'name' => $_POST['name'],
                        );
            $this->db->insert('test', $query);
        }
        $this->load->view('test_form');
    }
}
콘트롤러의 소스가 올바르지 않다고 생각되지만 일단 광복절님께서 하던 방식으로 해 봤습니다..

뷰에서는 이렇게 했구요..
<?php
echo form_open();
echo form_input('name');
echo form_submit(false, 'Send');
echo form_close();
?>


그런데 결과는 이렇게 나왔습니다...



제가 문젠가요? ㅋㅋ
광복절 / 2011/07/15 20:28:31 / 추천 0

두분 답변 너무 감사드립니다.

제가 8월 15일 귀빠져서 이름이 광복입니다 ㅎㅎ

헛발이님 소스를 그대로 카피해서 테이블명만 고쳐서  해봐도 아래와 같이 디스플레이 됩니다 ㅠ.ㅠ

// 출력문

----------------------------------------------------------------------------

데이터베이스 오류가 발생하였습니다.

Error Number: 1048

칼럼 'name'는 널(Null)이 되면 안됩니다.

INSERT INTO `test` (`name`) VALUES (NULL)
---------------------------------------------------------------------------


쿼리가  :  INSERT INTO `test` (`name`) VALUES (NULL)

저는 위 쿼리가 서버에서 허용이 안되더라구요 mysql 5.0


헛발이님 sql 버전하구 sql_mode 환경이 어찌 되시나용?


끝으로

$this->input->post('namel') 사용시 데이터가 NULL 일시 0으로 들어가는것이 정상적인가요?

$this->uri->segment()  함수 사용시에도 거짓일 경우 0을 리턴 해주니 그런가보다 하고 생각하고

있거든요


즐거운 저녁 되세요 

변종원(웅파) / 2011/07/15 21:55:25 / 추천 0

제가 볼때는 name 필드 디폴트값이 0이 아닐까 합니다.
세그먼트 함수도 $thsi->uri->segment(3, 0); 과 같이 주어야 0값을 반환하고
두번째 파라미터를 주지않으면 FALSE가 반환됩니다.

$this->input->post()도 해당하는 변수가 없을 경우 FALSE가 반환됩니다.

광복절 / 2011/07/16 01:21:41 / 추천 0
안녕하세요
광복이 입니다.

해결 했습니다. 원인은 호스팅사의 mysql 설정이 너무 STRICT 하게 잡혀서 그런거라고

답변을 받았습니다. 무슨예기인지 잘몰라서 "예" 그랬군요 라고 끄덕일뿐이라서

mysql 설정이 서버에 따로 있나요? 일반 유저는 접근하여 수정할수 없다고 하고 SSH루트만 된다고

하는 어려운말만 ;;


웅파님 헛발님 너무 감사드립니다.

즐거운 밤 보내세요 
다리펙토리 / 2011/07/29 17:51:45 / 추천 0

궁금한게...하나 있는데요

지금 Controller인데.. 데이타베이스 insert를 하잖아요...

그거 모델에서 처리하는거 아닌가요??

controller에서도 되나요??

그러면 MVC의 개념을 깨는것 같은데... 궁금해서 물어보는겁니다..



 

변종원(웅파) / 2011/07/29 17:58:24 / 추천 0
개념은 모델에서 처리하는게 맞습니다만 익숙하지않거나 급할때는 컨트롤러에서 처리하기도 합니다. Ci는 느슨한 구조입니다. ^^