DB/PostgreSQL

[PostgreSQL][PHP] DB query escape에 대해

Binceline 2016. 7. 28. 06:23

이번엔 php에서 pgsql 관련 함수 중 


pg_escape_string()

pg_escape_literal()


에 대해 설명할 것이다. 


DB를 사용하는데 이 개념을 모른다면 이 글을 꼭 보아야 할 것이다.


php 코드로 다음 예시를 보자.


$a = "i said 'you' are great";

$b = "you too";

$qurey = "INSERT INTO table_name(a, b) VALUES(" '$a' '$b' ")";


이러면 에러가 나는 것이다.


왜냐면.. $a가 치환되면서 'i said 'you' are great' 이 되어 버린다... 


같이 '로 묶여야 할 you가 붕 떠버리는 것이다.

그래서 나온 일반적인 해결책이 Escape 이다.


뭐냐면, 따옴표 앞에 \를 붙이자는 것이다. 그럼


'i said \'you\' are great' 가 된다. 이걸 escape라고 부르는 것 같다.


이 기능을 하는 것이 php에서 제공하는 addslashes() 함수이다.


PHP 문서를 읽어 보니, 이러면 DB에 들어갈 때 \를 지워준다고 써있긴 하다.


만약 안 지워준다면 불러올 때 stripslashes()를 사용하여 지워 주면 된다.




PostgreSQL에서는?


pg_escape_string 함수를 사용하면


'i said ''you'' are great' 가 된다. 따옴표 2개짜리로 변하는 것이다.


그리고 이것을 DB에 넣으면  ''를 하나로 바꿔준다.


그래서 다시 불러올 땐 정상적인 데이터를 불러오게 된다.

.

.

pg_escape_string 함수를 사용하면 다음과 같이 된다. 


$a = "'pg_escape_string($a)'" --> 'i said ''you'' are great'

.

pg_escape_literal 함수를 사용하면 굳이 직접 따옴표를 안 써줘도 마지막에 알아서 묶어준다.


음... 그런데 이 작업들이 좀 귀찮다... 왜냐면.. 한 항목 당 하나씩 해야 한다. 예를 들면..


$a = pg_escape_string("i said 'you' are great");

$b = pg_escape_string("you 'to'o");

$qurey = "INSERT INTO table_name(a, b) VALUES(" '$a', '$b' ")";


이럴 때 사용하면 좋은 게 


array_map() 함수이다.


PHP문서 URL : http://php.net/manual/kr/function.array-map.php


php 문서를 보면 쉽게 알 수 있을 것이다. 무슨 짓을 하려는지.



위의 코드를 보면, callback함수로 cube()를 넣고 $n인자에 $a를 넣어서 배열 $a 내의 원소들을 다 cube함수로 돌리고,


결과를 배열로 반환해준다.


이런 식? 으로. 함수 여러번 안 써도 되는 것..



이걸 이용해서 항목 당 일일이 escape 함수를 사용하는 일이 없도록...


하면 깔끔하고 보기좋고 그렇다..


히히

반응형