DB에 저장된 C언어 소스를 출력하는 외부 페이지가 있습니다.
당연히 DB에 저장할 때와 가져올 때 이스케이프 처리를 했습니다. (최대한 한다고 했습니다.ㅠㅠ)
즉, 소스를 서버에 저장할 때는 mysql_real_escape_string()를 사용해서 쿼리로 insert 했고,
서버에 저장된 소스를 가져올 때는 쿼리로 select한 후 htmlspecialchars()로 변환한 값은 echo 하였습니다.
그런데, 다음과 같은 경우가 생기네요..
<정상 출력>
#include<stdio.h> int d[11],p[1001]; int main() { int i,c=0,m=0,k; for(i=1; i<=10; i++) { scanf("%d",&d[i]); c=c+d[i]; p[d[i]]++; } c=c/10; for(i=0; i<=1000; i++) { if(m<p[i]) { m=p[i]; k=i; } } printf("%d\n%d",c,k); return 0; }
위 소스 코드의 2번 라인을 아래와 같이 변경한 후 리로드하면 500 에러가 발생합니다.
아무리 생각해 봐도, 이스케이프가 덜 된거 같은데....
몇 달째 원인을 찾지 못하고 있습니다. ㅠㅠ
#include<stdio.h> int d[11],p[1001]={0,}; int main() { int i,c=0,m=0,k; for(i=1; i<=10; i++) { scanf("%d",&d[i]); c=c+d[i]; p[d[i]]++; } c=c/10; for(i=0; i<=1000; i++) { if(m<p[i]) { m=p[i]; k=i; } } printf("%d\n%d",c,k); return 0; }
모든 내용을 지우고, 아래와 같이 남겨도 안되네요..ㅠㅠ 정말 희한하면서 미치겠네요~
{0,}
위에서 쉼표(,)만 빼면 정상 작동합니다.. 아....ㅠ.ㅠ
소스에 다른 부분(5번 라인, 8번 라인 등)에서 수많은 쉼표가 사용되고 있으며, 그건 아무 문제가 없는데 말이지요...
특정 소스에서만 이러한 증상이 발생하고, 일반적인 상황에서는 정상 동작하고 있습니다.
출력하시는 소스가 XE 템플릿 코드로 인식되고 있는 것 같습니다. {0}은 <?php echo 0 ?>으로 변환되어 그냥 0을 출력하지만, {0,}은 <?php echo 0, ?>으로 변환되어 문법 오류가 나지요.
외부페이지라면 XE 템플릿 코드를 임의로 인식할 수 있습니다. 레이아웃이나 스킨처럼 템플릿 코드와 그렇지 않은 내용이 분명히 구분되는 곳으로 이동해 보시기 바랍니다. 그게 곤란하다면 str_replace 함수를 사용해서 { } 중괄호를 거기에 해당하는 HTML entity { }로 바꾸어 출력해 보세요.