포럼
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
XE의 db 관련 클래스 소스에 의문사항이 있습니다.
2013.07.15 02:31
안녕하세요.
classes/db/DBCubrid.class.php
classes/db/DBMysqli.class.php
classes/db/DBMssql.class.php
classes/db/DBMysql.class.php
위 클래스 파일의 addQuotes 메소드에 의문사항이 있어 글을 남깁니다.
/**
* Handles quatation of the string variables from the query
* @param string $string
* @return string
*/
function addQuotes($string)
{
if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc())
{
$string = stripslashes(str_replace("\\", "\\\\", $string));
}
if(!is_numeric($string))
{
$string = @mysql_real_escape_string($string);
}
return $string;
}
메소드 소스를 살펴보면,
$string = stripslashes(str_replace("\\", "\\\\", $string)); 부분이 있는데요.
magic_quotes가 적용되어 있다고 가정하여,
$string의 값이 \'\"\\라면...
1) $tmp = str_replace("\\", "\\\\", $string); -> \\'\\"\\\\
2) $string = stripslashes($tmp); -> \'\"\\
위와 같은 변환 과정을 거쳐 결국 원래 설정한 \'\"\\와 똑같은 값이 다시 세팅이 되는데,
왜 굳이 위처럼 코드가 작성되었는지 궁금합니다.
PHP 특정 버전에 버그가 있어서 그런건지...
무슨 특별한 이유가 있는건가요?
댓글 5
-
랭크플래시
2013.07.19 17:23
-
misol
2013.07.22 14:29
스트링 값이 \'\"\\ 라면
$tmp = str_replace("\\", "\\\\", $string);
거치면,
$tmp 는 \'\"\\\\ 가 되고
stripslashes 를 거치면
'"\\가 되겠지요 :)
-
랭크플래시
2013.07.22 21:31
php 설정이 magic_quotes_gpc=on인 상황에서 string='"\를 쿼리로 날리면,string은 addslashes 함수를 거쳐 \'\"\\로 변환됩니다.실제값-$string : \'\"\\대입식-$string = '\\\'\\"\\\\';위와 같이 되겠죠.이것을 $tmp = str_replace("\\", "\\\\", $string); ("\\"는 문자 두개가 아니라 \ 하나를 표현한 겁니다.)실제값-$tmp : \\'\\"\\\\대입식-$tmp = '\\\\\'\\\\"\\\\\\\\';그리고 $string = stripslashes($tmp);를 거치면,실제값-$string : \'\"\\대입식-$string = '\\\'\\"\\\\';misol님께서 말씀하신대로의 결과가 나오면 좋겠지만,결국 원래 값인 \'\"\\로 반환이 되네요.제 질문의 요지는 결국 원래의 값으로 다시 돌아오는데,$string = stripslashes(str_replace("\\", "\\\\", $string));왜 굳이 이렇게 불필요한 과정을 거치는 것인지 이유가 궁금합니다.범용적인 오픈소스 프로젝트에서 이렇게 처리를 한데는뭔가 분명한 이유가 있을거 같아서요.답변을 기다립니다. -
misol
2013.07.22 22:07
그랬네요. 외따옴표가 아닌 쌍따옴표 였네요!
저도 답변이 궁금합니다.
-
똑디
2013.07.30 15:04
요즘엔 개발자님들이 이곳에 안들러시나 봅니다. 다른프로젝트에 투입되셨나 봐요.
개발자 분이 4박 5일로 휴가라도 갔나요?
XE 개발에 필요한 정보 공유란 말이 무색할만큼 피드백이 참 없네요.