웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
이미 인클루드된 파일은 다시 인클루드하지 않기
2003.06.20 10:46
원문 링크 : http://www.100kwa.net/zeroboard/zboard.php?id=php&no=47
존칭 생략함을 양해해 주시기 바랍니다.
아래 본인의 글을 삭제하려고 하였다.
그런데 다른 분들의 코멘트 속에 확실하고 간단한 답이 있는 것을 발견하였다.
비록 잘 모르더라도 엔지오에 글을 올린 덕분에 기초를 확실하게 배울 수 있는 즐거음 ...
댓글 주신 분들께 진심으로 감사를 드리며, 정리해 보자면
1. 인클루드될(백과넷의 경우 상당 85픽셀 내용)파일의 맨 위를
<?
$_zb_url = "http://www.100kwa.net/zeroboard/";
$_zb_path = "/home/hosting_users/4nara/www/zeroboard/";
if($included) return false;
else $included = 1;
include $_zb_path."outlogin.php";
?>
<html>
와 같이 시작한다.
2. 위 파일을 인클루드하는 다른 파일들에서는 단순히 include만 해 주면 된다.
3. 주의할 사항
<? include "http://www.100kwa.net/master/가나다.htm"; ?>과 같이 하면 안 된다.
이렇게 사용해 보니, $included값을 무시하고(적당한 표현인가?) 거듭 불러들였다.
<? include "../master/가나다.htm"; ?>과 같이 상대경로를 사용해야 된다.
4. 잔소리 : 위 몇 줄의 정리는 나처럼 헤매는 초보자들을 위한 배려이다.
아래 본인의 글을 보기 전에, 먼저 댓글들을 보시기 바란다.
---
제로보드에는 그룹 상단에 포함시킬 파일, 각 게시판의 상단에 포함시킬 파일 등을 설정하여 편하게 디자인할 수 있는 기능을 제공한다.
PHP의 include 명령을 이용하거나, 헤더 파일에서 정의하는 것 같은데 헤더 파일 운운은 아직 이해하지 못한 부분이고, 인클루드 명령을 사용하면 노프레임 페이지마다 같은 메뉴파일을 삽입하여 일관된 디자인을 유지할 수 있다.
뿐만 아니라, 메뉴파일에서 스타일시트 등을 일괄 정의할 수 있고 배경이미지를 한 번만 삽입해도 모든 파일에 나타나며, 레이어를 띄워서 디자인의 폭을 넓힐 수도 있다.
이 모든 내용을 며칠 사이에 터득하고는 상당히 기뻤다.
1. 전제가 되는 상황
백과넷을 방문하면 디자인을 볼 수 있으므로 그림 업로드는 생략한다.
1)
메뉴 파일 : /master/가나다.htm
- 이 파일에 /master/가나다_link.htm(ㄱ,ㄴ,...), /master/family_top.htm(사이트GO-링크100,홈피100,...), print_outlogin("kim",1,10) 등 3개의 인클루드 또는 프린트가 있다.
2)
개개의 파일에서 /master/가나다.htm (메뉴)파일을 인클루드한다.
2. 문제 상황
신문.htm 파일에서도 메뉴파일을 인클루드하고 전문신문.htm 파일에서도 메뉴파일을 인클루드한다. 모든 개별 파일에서 메뉴파일을 인클루드해야 사이트 내부 또는 패밀리에 속한 다른 사이트로의 이동을 위한 내비게이션이 가능하기 때문이다.
그런데 신문.htm 파일에서 전문신문.htm 파일을 인클루드하면 어떤 상황이 발생할까?
메뉴 파일을 2번 인클루드하는 결과, 메뉴 파일에 인클루드 또는 프린트된 객체들이 같은 이름으로 2번 떠오르면서 객체성을 상실하고 다양한 에러의 발생원인으로 변질된다.
3. 유저를 위한 고민
손님이 찾지 않는 가게는 망한다고 보아야 할 것이다.
손님은 신문.htm 파일을 찾기도 하고 전문신문.htm 파일을 찾기도 한다.
그런데 신문.htm 파일에 전문신문.htm 파일을 인클루드하면 더 좋아할 것 같다.
3. 초보적인 해결책
그래서 궁여지책으로 생각한 방법이 전문신문.htm 파일의 내용만 뽑아서 전문신문@.htm 파일을 추가로 만들고 전문신문.htm 파일에서도 그 새 파일을 인클루드하고, 신문.htm 파일에서도 그 새 파일을 인클루드하는 방법을 사용하면 문제는 해결된다.
그러나 만족할 수 없는 지나치게 초보적인 방법이다.
4. 객체의 존재여부를 따져서 같은 파일은 2번 인클루드하지 않기
HTML에서 객체의 존재여부를 확인하려면 document.all['이름']=='[object]'와 같은 비교식으로 처리하며, PHP에서 객체의 존재여부를 확인하는 함수로는 is_object가 있다.
그러나 필자와 같은 초보로서는 아무리 짜맞추어 보아도 명쾌한 답이 떠오르지 않았다.
5. 변수 전달하여 해결
인클루드된 파일에서 $로 시작하여 정의한 변수는, 메인 파일에서도 그대로 인식한다.
메뉴 파일에 들어가는 하나의 객체 정의 뒤에 그 객체를 변수에 담는 것이다.
<td width="200" valign="top" rowspan="2">
<div id="lay_가나다" style="width:180px; height:2000px; position:absolute; left:0px; top:0px; z-index:1;">
<table border="0" cellpadding="0" cellspacing="0" width="180" height="2000" bgcolor="#CDDEEF">
<tr>
<td width="994">
<p> </p>
</td>
</tr>
</table>
</div>
<? $log100 = document.all.lay_가나다; ?>
</td>
이제 메뉴 파일을 인클루드하는 개별 파일에 무조건 인클루드하는 다음 구문 대신
<?
include "../master/가나다.htm";
?>
변수 $log100이 존재하지 않으면 인클루드하는 구문으로 바꾸자.
<?
if (!$log100) include "../master/가나다.htm";
?>
이것으로 해결되었다.
누구나 다 아는 사실일지 모르지만, 모르는 분도 있을 것이다.
기쁜 마음에 공유하고파 이 글을 올린다.
글 보아 주셔서 감사합니다.
존칭 생략함을 양해해 주시기 바랍니다.
아래 본인의 글을 삭제하려고 하였다.
그런데 다른 분들의 코멘트 속에 확실하고 간단한 답이 있는 것을 발견하였다.
비록 잘 모르더라도 엔지오에 글을 올린 덕분에 기초를 확실하게 배울 수 있는 즐거음 ...
댓글 주신 분들께 진심으로 감사를 드리며, 정리해 보자면
1. 인클루드될(백과넷의 경우 상당 85픽셀 내용)파일의 맨 위를
<?
$_zb_url = "http://www.100kwa.net/zeroboard/";
$_zb_path = "/home/hosting_users/4nara/www/zeroboard/";
if($included) return false;
else $included = 1;
include $_zb_path."outlogin.php";
?>
<html>
와 같이 시작한다.
2. 위 파일을 인클루드하는 다른 파일들에서는 단순히 include만 해 주면 된다.
3. 주의할 사항
<? include "http://www.100kwa.net/master/가나다.htm"; ?>과 같이 하면 안 된다.
이렇게 사용해 보니, $included값을 무시하고(적당한 표현인가?) 거듭 불러들였다.
<? include "../master/가나다.htm"; ?>과 같이 상대경로를 사용해야 된다.
4. 잔소리 : 위 몇 줄의 정리는 나처럼 헤매는 초보자들을 위한 배려이다.
아래 본인의 글을 보기 전에, 먼저 댓글들을 보시기 바란다.
---
제로보드에는 그룹 상단에 포함시킬 파일, 각 게시판의 상단에 포함시킬 파일 등을 설정하여 편하게 디자인할 수 있는 기능을 제공한다.
PHP의 include 명령을 이용하거나, 헤더 파일에서 정의하는 것 같은데 헤더 파일 운운은 아직 이해하지 못한 부분이고, 인클루드 명령을 사용하면 노프레임 페이지마다 같은 메뉴파일을 삽입하여 일관된 디자인을 유지할 수 있다.
뿐만 아니라, 메뉴파일에서 스타일시트 등을 일괄 정의할 수 있고 배경이미지를 한 번만 삽입해도 모든 파일에 나타나며, 레이어를 띄워서 디자인의 폭을 넓힐 수도 있다.
이 모든 내용을 며칠 사이에 터득하고는 상당히 기뻤다.
1. 전제가 되는 상황
백과넷을 방문하면 디자인을 볼 수 있으므로 그림 업로드는 생략한다.
1)
메뉴 파일 : /master/가나다.htm
- 이 파일에 /master/가나다_link.htm(ㄱ,ㄴ,...), /master/family_top.htm(사이트GO-링크100,홈피100,...), print_outlogin("kim",1,10) 등 3개의 인클루드 또는 프린트가 있다.
2)
개개의 파일에서 /master/가나다.htm (메뉴)파일을 인클루드한다.
2. 문제 상황
신문.htm 파일에서도 메뉴파일을 인클루드하고 전문신문.htm 파일에서도 메뉴파일을 인클루드한다. 모든 개별 파일에서 메뉴파일을 인클루드해야 사이트 내부 또는 패밀리에 속한 다른 사이트로의 이동을 위한 내비게이션이 가능하기 때문이다.
그런데 신문.htm 파일에서 전문신문.htm 파일을 인클루드하면 어떤 상황이 발생할까?
메뉴 파일을 2번 인클루드하는 결과, 메뉴 파일에 인클루드 또는 프린트된 객체들이 같은 이름으로 2번 떠오르면서 객체성을 상실하고 다양한 에러의 발생원인으로 변질된다.
3. 유저를 위한 고민
손님이 찾지 않는 가게는 망한다고 보아야 할 것이다.
손님은 신문.htm 파일을 찾기도 하고 전문신문.htm 파일을 찾기도 한다.
그런데 신문.htm 파일에 전문신문.htm 파일을 인클루드하면 더 좋아할 것 같다.
3. 초보적인 해결책
그래서 궁여지책으로 생각한 방법이 전문신문.htm 파일의 내용만 뽑아서 전문신문@.htm 파일을 추가로 만들고 전문신문.htm 파일에서도 그 새 파일을 인클루드하고, 신문.htm 파일에서도 그 새 파일을 인클루드하는 방법을 사용하면 문제는 해결된다.
그러나 만족할 수 없는 지나치게 초보적인 방법이다.
4. 객체의 존재여부를 따져서 같은 파일은 2번 인클루드하지 않기
HTML에서 객체의 존재여부를 확인하려면 document.all['이름']=='[object]'와 같은 비교식으로 처리하며, PHP에서 객체의 존재여부를 확인하는 함수로는 is_object가 있다.
그러나 필자와 같은 초보로서는 아무리 짜맞추어 보아도 명쾌한 답이 떠오르지 않았다.
5. 변수 전달하여 해결
인클루드된 파일에서 $로 시작하여 정의한 변수는, 메인 파일에서도 그대로 인식한다.
메뉴 파일에 들어가는 하나의 객체 정의 뒤에 그 객체를 변수에 담는 것이다.
<td width="200" valign="top" rowspan="2">
<div id="lay_가나다" style="width:180px; height:2000px; position:absolute; left:0px; top:0px; z-index:1;">
<table border="0" cellpadding="0" cellspacing="0" width="180" height="2000" bgcolor="#CDDEEF">
<tr>
<td width="994">
<p> </p>
</td>
</tr>
</table>
</div>
<? $log100 = document.all.lay_가나다; ?>
</td>
이제 메뉴 파일을 인클루드하는 개별 파일에 무조건 인클루드하는 다음 구문 대신
<?
include "../master/가나다.htm";
?>
변수 $log100이 존재하지 않으면 인클루드하는 구문으로 바꾸자.
<?
if (!$log100) include "../master/가나다.htm";
?>
이것으로 해결되었다.
누구나 다 아는 사실일지 모르지만, 모르는 분도 있을 것이다.
기쁜 마음에 공유하고파 이 글을 올린다.
글 보아 주셔서 감사합니다.
댓글 14
-
TheMics
2003.06.20 18:42
-
TheMics
2003.06.20 18:44
중복 인클루드 방지에는 몇가지 방법이 있는데, 가장 간단한 것이 이것입니다.
인클루드할 파일(인클루드하는 파일이 아님)의 최 상단에
if($included) return false;
else $included = 1;
이 부분을 첨가해주면 됩니다. 문서에서 return false를 외치면 현재 읽던 파일을 읽는 것만을 중단합니다. 즉, 인쿨루드되는 파일에서 저 구문을 만나면 인클루드를 하지 않게 되는 것이죠.
인클루드 시마다 if(...) include ...; 이렇게 하는 것보다 훨씬 효울적입니다. -
행복한고니
2003.06.21 01:32
중복 인클루드 방지... -_-;;
include_once
require_once
각각 한번씩만 include 혹은 require 를 실행합니다. 사용법은 include, require 와 같습니다.
떱... 참고로... 매뉴얼에 나와있습니다. -
앳플군
2003.06.21 07:21
행복한고니님 답글에 한표;;
PHP 4.0.1pl2 하위버전에서는 사용하실 수 없습니다만 요즘 4.0 이하는 보지도 못했다는;;
http://kr2.php.net/manual/kr/function.include-once.php -
TheMics
2003.06.21 15:46
에에;ㅁ;include_once나 require_once는 윈도계열의 서버에서는 원하는 결과를 얻지 못할 수도 있습니다.
include_once나 require_once에서 파일의 대소문자를 구분하기 때문이죠.
예를 들어 win32환경에서
<?
include_once "test.php";
include_once "Test.php";
?>
라는 구문이 있다면 test.php를 2번 읽어들이게 됩니다. 유닉스에서는 물론 애초에 test.php와 Test.php를 다른 파일로 보므로 상관없습니다만;
뭐, 사실 중요한 얘기는 아니지만 본인이 답변한 내용을 정당화 시키려는 술책 정도로 보시면 됩니다[!] -
앳플군
2003.06.21 19:31
더믹스 // 윈도계열 서버를 안쓰면 끝 [??]
에에.. 윈도계열이던 아니던 php는 많은 플랫폼에서 돌아감으로 대소문자 구별을 해서 프로그램 작성하시는것이 좋.. ;;
(저도 정당화를..?) -
행복한고니
2003.06.21 20:53
Mics//여러개 파일에 적용하기에는 문제가 있는 팁이었지요. 쿠쿠~~
배열로 하면 된다라고 말할지 모르지만, 어쨌거나 팁으로서는 부족했기에 믹스님의 정당화 술책은 무효! -
TheMics
2003.06.21 21:28
다들 나만 미워해[?!] -
깜보
2003.06.22 21:23
ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ -
민이
2003.06.25 17:53
쿠쿠쿡...
제가 아직 초보라서..
한 번 생각해볼 수 있는 기회가 되었어요.
여러 분들이 하신 말씀들 다 제겐 수업이 되었구요.
여기 답글 다신 분들 모두 고맙습니다.
TheMics // 짱!! ㅋㅋㅋ -
Alunar@R.
2003.06.30 17:22
그렇다고 윈 서버를 쓰지 않는 건 조금[;] -
☆~
2003.08.03 09:46
간단하게... 보든 파일의 이름을 소문자로 합시다.. [?!퍽;] -
초롱
2003.08.06 08:44
보든이 아니라 모든파일-_-:;;(맞는다;;( -
Myzzix
2003.08.16 18:50
행복한고니// 행복한고니님 방식을 제로보드에서 사용했었는데요...
그 방식의 헛점때문에 이번 버그가 발견된거에요...^^
zboard.php?...........=1
제목 | 글쓴이 | 날짜 |
---|---|---|
htmlspecialchars 사용하시는 분들 [5] | holies | 2003.07.11 |
이미 인클루드된 파일은 다시 인클루드하지 않기 [14] | 김병희 | 2003.06.20 |
PHP 익히기 3 [11] | 구리구리 | 2003.06.17 |
PHP 익히기 2 [9] | 구리구리 | 2003.06.10 |
PHP 익히기 1 [24] | 구리구리 | 2003.06.09 |
php 로 기존 문서 포함시키기 [10] | 이성헌 | 2003.06.08 |
체크박스등으로 배열로 변수를 넘길때.. [1] | myself2 | 2003.06.06 |
홈페이지의 내용을 DB에 담기 [15] | 세죠위그이 | 2003.05.30 |
썸네일 자동생성하고 이미지 사이즈 자동 줄이기... [6] | sMokaHallo | 2003.05.21 |
Wake On Lan 기능 사용하기... [3] | sMokaHallo | 2003.05.17 |
스킨 시스템 구축.(1탄 읽어오기) [11] | 씨파개 | 2003.05.13 |
none 과 null 처리 문제 해결법 [5] | 허현승 | 2003.05.12 |
세션파일 크기/만들어진 시간체크해서 정해진 시간이후엔 파일 지우기?;; (라고 써야되낭? ;;) [6] | 다오케이 | 2003.05.12 |
PHP+MSSQL?(수정판) [11] | 씨파개 | 2003.05.10 |
이미지 전용 파일업로드시의 확장자 체크시.. [4] | 특급잠수부 | 2003.05.07 |
mysql_fetch_row n mysql_fetch_array n mysql_fetch_object [4] | sMokaHallo | 2003.05.06 |
if 시리즈 2탄.. ㅡㅡ;; [9] | 씨파개 | 2003.05.05 |
PHP 확장 함수를 이용한 exif 정보 출력 [1] | NoSoRi | 2003.04.30 |
if 시리즈 1탄! [15] | 씨파개 | 2003.04.28 |
ID3v1태그 읽는 함수입니다. [4] | 김승태 | 2003.04.27 |
PHP에서 new class()처럼 생성된 객체변수인지를 검사하는 거죠.