본문 바로가기

php mysql에 insert시 싱글쿼츠(홑따옴표) 입력 처리

개발을 할 때 싱글쿼츠 부분은 신경이 쓰이지 않으면서 하다 보면 굉장히 번거롭기도 하다.

안해서 될 것도 아니고 해결을 결국 해야 할 경우가 생각보다 많다.

addslashes() 

  -용도: 작은따옴표 큰따옴표와 같은 특정문자 앞에 역슬래시 문자를 붙인다.
  -방법: addslashes()
  *stripslashes()
  -용도: allslashes로 역슬래시 처리된 문자를 원상태로 되돌린다.
  -방법: stripslashes()

  addslashes - 문자열에 슬래쉬를 덧붙입니다.
  string addslashes( string str )
  데이터베이스 쿼리등에서 처리할 필요가 있는 문자 앞에 백슬래쉬를 붙인 문자열을 반환합니다.
  이 문자들은 작은 따옴표('), 큰따옴표("),백슬래쉬(\), NUL(NULL 바이트)입니다.
  addslashes()를 사용하는 대표적인 예는 데이터베이스에 데이터를 넣을 때 입니다.
  예를 들어, 데이터베이스에 O'reilly라는 이름을 넣으려고 할 때, 이스케이프할 필요가 있습니다.
  대부분의 데이터베이스는 \를 사용하기에 O\'reilly가 되어야 합니다.
  이 데이터를 데이터베이스에 넣으면 추가한 \은 저장되지 않습니다.
  PHP 지시어 magic_quotes_sybase를 on으로 설정하면 '은 '을 이용하여 이스케이프합니다.

  PHP 지시어 magic_quotes_gpc는 기본값으로 onl이고, 자동적으로 모든 GET, POST, COOKIE 데이터에
  addslashes()를 실행합니다.
  magic_quotes_gpc로 이스케이프된 문자열에 addslashes()를 사용하지 마십시요.
  그렇지 않으면 두번 이스케이프하게 됩니다.
  이를 확인 하기 위해서는 get_magic_quotes_gps()를 사용할 수 있습니다.
  
  example : 데이터베이스에 INSERT할 문장
            I'm sorry to bother you

  1. INSERT INTO WORDBOOK_SV(word_name)
                      VALUES('I'm sorry to bother you')
     하면 에러 발생         
      결론으론 '가 들어간 문장을 그대로 insert하면 mysql에서 입력시 에러가 난다.
    이걸 '앞에 \를 넣음으로써 디비에 저장을 시킬 수 있다.
    실제 디비에는 \는 안보이고 그대로 '가 들어간 문장의 형태로 보인다.
  
  2.스트링 값을 addslashes를 이용하면 실제 I\'m sorry to bother you가 된다.
    이걸 다시 입력하면
    INSERT INTO WORDBOOK_SV(word_name)
                     VALUES('I\'m sorry to bother you')
    하면 정상적으로 디비에 입력이 된다.
  3.입력된 디비의 데이터를 보면 거기엔 I'm sorry to bother you가 입력이 되어 있다.
  4.그놈을 조회후 다시 php에서 결과값을 받아서 찍어봐도 \는 사라진 값이 날라온다.
  5.기억해 두자. addslashes, 참고로 addslashes를 한걸 stripslashes를 하면 역슬래쉬가 빠진 문자열로
     만들수 있다.

간만의 삽질~

==== 2010.10.27 추가 =============================

UTF-8이라서 addslashes()가 불필요한게 아니라

리눅스 서버의 php.ini 설정이 문제다.

1.phpinfo를 찍어본다.

2.항목중 magic_quotes_gpc 검색해본다 On이 되어 있어야 한다.

   만일 off로 되어 있으면.

3.vi php.ini를 열어 magic_quotes_gpc = off 항목을 magic_quotes_gpc = on으로 바꿔주고

    service httpd restart 해준다.

4.다시 phpinfo를 찍어본다. 

5.항목중 magic_quotes_gpc를 검색해본다. on으로 수정했으니 on으로 나오면 끝.


======= 추가 참조 ===========================

전에 php코딩시 변수에 ' , " 등이 있을경우에 대해서 글을 쓴적이 있다.

위와같은 따옴표가 있으면 쿼리에서오류를 내기 때문에 addslashes()를 해줘야한다.

그러면 특수문자 앞에 \(역슬러시)가 붙기 때문에 정상적으로 쿼리를 날린다.

그리고 데이타를 불러온후 표현할때 stripslashes를 사용한다고 했다.

그러면 특수문자 앞에 붙은 \ 를 제거하고 원래 데이타만을 표현한다.

하지만 이는 나름 귀찮은 일이며 이를 위한 설정이 있다.


php.ini파일에 magic_quotes_gpc라는 설정이 있다.

요놈이 무엇인가 하니.

gpc 즉 get, post, cookie 를 사용하여 넘어온 밸류들에 대해서 quotes(', ", \, 널문자 등) 가 있을때 알아서 그러니까 마법처럼 알아서 \ 를 붙여준다. --> just like magic~!^^

magic_quotes_gpc의 설정을 on으로 하면 또한가지의 이득을 볼수있는것이
sql injection에 대해서 안전하게된다.

사용자의 데이터 입력값에 쿼리를 조작하기 위한 ' 등이 있을경우 이를 \ 처리 해주므로 안전하게 된다.


get_magic_quotes_gpc()

magic_quotes_gpc의 설정값을 반환한다.