파일 경로좀 알려주세요.ㅠㅜ > 자유게시판

자유게시판

파일 경로좀 알려주세요.ㅠㅜ 정보

개발자 파일 경로좀 알려주세요.ㅠㅜ

본문

그누보드와는 별개입니다.
설치형 게시판을 만들고 있는데 경로를 잡아줄려고 하는데 잘 안되네요.ㅠㅜ

www
└inc
   └lib.php
   └config.php
└sub
   └sub01.php
   └sub02.php
index.php
head.php
tail.php
db.php

이런식으로 파일이 있다고 하면..
lib/lib.php파일 안에 환경설정등을 넣어놨을 때..
파일안에
$path = "..";
include "$path/db.php";
이런식으로 소스를 넣어놨어요..
경로를 잡는다고..

그러면..
index.php파일에서 불러들일때는..
index.php소스 상단에

include "./inc/lib.php";
include_once("$path/inc/config.php");

이런식으로 소스를 붙이면 되나요?
근데 왜 이렇게 하면 계속 에러가 나는지..ㅠㅠ
오류가..
index.php파일을 실행해보면..

Warning: main(../db.php) [function.main]: failed to open stream: No such file or directory in /home/hosting_users/hansae/www/inc/lib.php on line 6

이런 에러가 나와버리네요

오류메시지가 나와서 lib.php파일의 소스를..
$path = "..";
include "$path/db.php";
이것을
$path = ".";
include "$path/db.php";
이렇게 수정을 하니 오류 메시지는 안나오는데..
분명 루트폴더에 db.php파일이 있는데.. 파일이 없다고..설치화면으로 이동을 해 버리네요..ㅠㅠ(설치형 게시판이라 db.php파일이 없으면 파일 설치화면으로 이동하거든요..

=================================
경로설정하는법이 계속 헛갈리네요..ㅠㅠ
혹시 정리된 자료나.. 쉽게 설명좀 해 주실 분 계신가요?ㅜㅜ

어떤식으로 소스를 만들어 놓으면.
어떤 페이지에서는 어떻게 불러오면 되고, 어떻게 소스를 넣으면 되고, 사용할때는 소스상에서 어떤식으로 사용하는지요...
검색 실력이 부족해서인지.. 아무리 검색을 해 봐도 모르겠네요..
추천
0
  • 복사

댓글 10개

db.php 를 꼭 lib.php 에서 불러와야 하나요?
lib.php 를 불러오는 페이지에서 db.php 도 같이 불러오시면 될 거 같은데

index.php 에서는
$path = "";
include "$path/db.php";
include "$path/inc/lib.php";

sub01.php 에서는
$path = "..";
include "$path/db.php";
include "$path/inc/lib.php";

아님 말구요 써글ㅠ
lib.php파일에서 db.php파일을 불러들이는 이유는
lib.php파일 소스에 db를 연결하는 소스가 있어서입니다.

게시판을 설치하면 db.php파일이 자동으로 만들어져서 그 파일이 생성되면  lib.php파일에서 불러들여서 db에 접속하게 되어있어서요.

파일 상단마다 그렇게 넣어줘도 되겠네요..

써글

아직 개념이 정확하게 안잡혀서 이런 써글써글..ㅠㅠ
경로에 대한 이해가 먼저 필요할 것 같아요. 경로는 최초 실행 스크립트가 항상 기준이 됩니다. 위의 예에서는 index.php가 최초 실행 스크립트이므로 이 파일이 있는 위치가 기준이 됩니다. 이 파일과 동일한 위치에 있는 db.php파일을 불러올 때는 경로가 당연히 "."가 되어야 하겠죠. 만일 ".."로 하게되면 index.php 파일이 있는 디렉토리보다 한단계 위의 디렉토리에서 파일을 찾게됩니다. 당연히 db.php파일이 없으므로 에러가 발생합니다.

이런 실수를 범하지 않으려면 최초 실행 스크립트나 동일한 디렉토리에 있는 파일에서 경로를 설정하는 습관을 갖는 것이 좋습니다. 위의 예에서 index.php파일이 최초 실행파일이므로 index.php에서 설정하는 것이 제일 좋겠죠. 좋은 방법은 다음과 같습니다:

index.php 에서

$path = ".";
include_once $path."/lib/lib.php";

lib.php에서 db.php파일을 불러올 때는
include_once $path."/db.php";
이렇게 적으면 되겠죠.

우리가 생각할 때 lib.php파일의 경로는 lib 디렉토리이므로 여기서 db.php파일을 불러오면 경로가 ".."가 되어야 할거라 생각하지만 사실 lib.php파일은 최초 index.php파일을 실행할 때 역시 불러온 파일이므로 경로는 index.php파일이 있는 디렉토리가 됩니다. 결국 index.php파일은 아직 실행이 끝나지 않았다는 사실을 염두에 두어야 합니다. 즉, index.php 파일에서 lib/lib.php파일을 불러와서 이 파일이 실행되어도 여전히 index.php파일은 실행이 끝나지 않고 있는 상태입니다. 사실 가장 나중에 실행이 끝나는 것은 index.php파일인 셈이죠. 이해가 되었나요?
만약에 index.php파일에서 lib.php파일을 불러들일때는..
lib.php파일에
$path = ".";
include "$path/db.php";
이런식으로 소스를 넣어놓으면..
정상적으로 불러지는데

adm폴더안에서
adm/admin_login.php파일에서  lib.php파일을 불러들이면..
lib.php파일 소수중..db.php 파일이 adm폴더 안에 있다고 되어버리면서... 파일이 없다는 오류 메시지가 출력되어버리네요..
제글을 제대로 읽지 않았네요...ㅠㅠ

$path가 "."로 설정된 상태에서 adm/admin_login.php에서 lib.php를 불러오면 당연히 adm 디렉토리에서 db.php파일을 찾겠죠.

이건 처음부터 $path를 lib.php에서 설정하려고 하니까 발생하는 겁니다. 인클루드되는 파일에서는 경로 정하는 것이 주의가 필요합니다. 이런 이유로 인해 그누보드에 보면 각각의 폴더 안에 _common.php를 만들어 그 안에 경로를 적은 편법을 쓴거죠.

lib.php안에 $path를  "."나 ".." 등으로 고정해버리면 어느 파일에서 lib.php파일을 인클루드 하느냐에 따라 path가 해석이 달라집니다. 예를 들어 lib.php파일에서 $path를 "."로 설정하면 최초 실행파일이 index.php인 경우는 index.php가 있는 디렉토리가 path가 되고 adm/admin_login.php가 최초 실행파일이라면 이 파일이 있는 adm이 그 디렉토리가 됩니다.

이 부분이 헛갈리면 그누보드가 쓰는 방법을 이용하면 되요. 각각의 경우에 _common.php를 두고 거기서 가장 상위를 path로 정하고 실행 스크립트에서 그 _common.php를 인클루드 하면 되요.
처음 실행된 파일이라고 해서 테스트를 해 봤거든요..
처음에 index.php파일로 실행을 하는것이 아니라 adm 폴더에 있는 admin_login.php파일을 실행을 해 봤어요..

특정 파일을 한 곳에서만 불러들이면 크게 상관은 없겠는데..
특정 파일을 이곳 저곳에서 불러다 사용을 해야해서요..
그렇게 되면 말씀하신대로 처음 실행한 파일의 경로와는 상관없이 경로가 틀어지게 되어버리니.. 그것때문에 머리가 아파요.ㅠㅠ
절대경로와 상대경로!!

$path = "..";
include "$path/db.php"; 일때

그러면..
index.php파일에서 불러들일때는..
index.php소스 상단에

include "./inc/lib.php";
include_once("$path/inc/config.php");
-------------------------------------------------------------
일때 에러가나는건

$path를 ..(상위폴더로가라)으로 설정해놨는데

index.php는 www안에 있는데

include "./inc/lib.php";를 통해 lib.php를 불렀더니 안에 코드가

$path = "..";  /* 딸라 패스라는 변수는 상위폴더로 가는거다로 정의 */
include "$path/db.php";    /* 딸라패스/db.php 이니 상위로 가서 db.php를 포함시켜라.*/

index.php는 www안에 있는데 한단계 위의 폴더에서 db.php를 찾고있으니 에러메세지가 나오고있습니다.
엘남매님도 프로그램 쪽으로는 둔치같네요. 하지만 디자인 파일들을 올려주셔서 제가 도움을 받은 적이 있으므로 포기않고 마지막으로 설명을 하니 잘 읽어보세요. 편의상 높임체를 뺐습니다.
I. 현재 상황:
-----------------------------------------------------------------------------
1) index.php 파일의 내용:
        <?php
        include "./lib/lib.php"
        ...
2) lib/lib.php 파일의 내용:
        <?php
        $path = ".";
        include "$path/db.php";
3) 에러발생: db.php파일을 찾을 수 없다고 함.
4) 요인: $path의 잘못된 설정.
-----------------------------------------------------------------------------
1) 위와 동일하나 lib.php에서 $path를 ".."로 바꾸어 보았음.
2) 에러발생: 여전히 db.php파일을 찾을 수 없다고 함.
-----------------------------------------------------------------------------
1) 이번에는 index.php이 아닌 adm/admin_login.php에서 불러옴. adm/admin_login.php 파일의 내용:
        <?php
        include "../lib/lib.php";

2) 여전히 에러발생. $path를 "."로 놓으나 ".."로 놓으나 여전히 db.php파일을 찾지 못함.

=============================================================================
II. 원인

위의 모든 에러는 $path의 잘못된 설정에서 비롯된다. 엘남매님의 생각은 $path를 설정할 때 lib.php파일을 기준으로 생각하고 그 파일과 동일한 위치에 있는 db.php파일을 include하는 것이니까 당연히 "."라고 생각했다. 그런데 사실은 아니다. 왜 그러한가? lib.php파일을 직접 실행하면 엘남매님의 생각이 맞다. 그런데 lib.php파일을 직접 실행하는 것이 아니라 index.php나 adm/admin_login.php파일을 실행하고 있다는 점이 문제다.

1) index.php파일을 실행하는 경우:
index.php파일을 실행하는 경우 그 경로는 index.php파일이 실행되는 "그누보드 설치 디렉토리"일 것이다. 이것을 쉽게 "gnuboard4"라고 가정하자.
현재의 경로는 "gnuboard4"에 있다. 여기서 gnuboard4/lib/lib.php파일을 불러온다. lib.php파일에서 $path를 "."로 정한 경우 $path의 경로는 gnuboard4/lib/lib.php파일이 있는 경로가 아니라 현재의 경로 "gnuboard4"가 된다. "."는 "현재의 경로"를 의미하기 때문이다. 따라서 스크립트가 실행될 때 "gnuboard4"에서 db.php파일을 찾으나 없으니 에러가 발생한다.

$path를 ".."라고 설정했다고 하자. 마찬가지로 실행파일은 index.php파일이다. 이 파일의 경로는 "gnuboard4"이다. 여기서 gnuboard4/lib/lib.php파일을 불러오고 거기서 $path가 실행되면 $path는 "gnuboard4보다 한단계 상위 디렉토리가 된다. ".."는 "현재보다 한단계 상위 경로"를 의미한다. 당연히 db.php파일은 거기에 없으므로 에러발생.

2) adm/admin_login.php 파일을 실행하는 경우:
adm/admin_login.php파일을 실행하는 경우 그 경로는 "gnuboard4/adm"이 된다. 여기서 "../lib/lib.php"파일을 불러온다. 여기까지는 잘된다. 그런데 db.php는 불러올 수 없다. $path를 "."로 정한 경우 $path의 경로는 실행파일인 admin_login.php파일이 있는 "gnuboard4/adm"이기 때문에 여기서 db.php파일을 찾기 때문이다. $path를 ".."로 정한 경우 $path의 경로는 실행파일보다 한단계 상위 디렉토리가 되므로 "gnuboard4"가 되어 여전히 에러발생할 수밖에 없다.
(위에 이어서 입니다. 글 수제한으로 나누었습니다.)


=============================================================================
III. 해결

만일 lib.php파일에서 $path를 절대경로가 아닌 상대경로 즉 "." 나 ".." 나 앞에 "/"이 없이 "skin/board"와 같은 경로로 설정하게 되면 실행파일의 위치에 따라 $path의 실제적 경로는 달라질 수 있다. 위의 예에서 처럼 $path를 "."로 설정하였을 경우 index.php를 실행할 경우 $path의 실제적 경로는 "gnuboard4"가 되고 adm/admin_login.php파일을 실행했을 경우 "gnuboard4/adm"이 된다.

위의 상황에서 index.php에서 db.php파일을 불러오려면 lib.php파일에서 $path의 경로를 index.php를 기준으로 생각해서 보면 "./lib/db.php"파일을 불러오는 것이므로 lib.php에서 $path는 "./lib"가 되고 include "$path/db.php"가 되어야 한다. adm/admin_login.php에서 db.php파일을 불러오려면 이 파일의 경로를 생각해서 보면 "../lib/db.php"파일을 불러오는 것이므로 lib.php에서 $path는 "../lib"로 설정하고 include "$path/db.php"라고 해야 한다.

그렇다면 $path가 서로 달라지는 문제가 발생한다. index.php의 경우 lib.php 에서 $path 설정을 "./lib"로 한 반면 adm/admin_login.php에서 실행하는 경우 lib.php에서 $path 설정을 "../lib"로 하기 때문에 $path를 딱 고정할 수 없다.

그러므로 상대적 경로를 써야 한다면 $path 설정은 lib.php에서 할 수 없고 실행파일인 adm/admin_login.php이나 index.php에서 해야한다. lib.php파일은 실행파일이 실행될 때 단지 불러와지기 때문이다. 이 방법이 그누보드에서 사용하는 방법이다. 그누보드는 경로문제를 위해 각 디렉토리에 _common.php파일을 두어 거기서 $g4_path를 설정함으로써 해결하고 있다.

두번째 방법은 절대경로를 정하는 방법이다. lib.php에서 $path를 dirname(__FILE__)로 설정하면 된다. __FILE__는 절대경로를 리턴한다. 즉 lib.php를 다음과 같이 작성한다:
        $path = dirname(__FILE);
        include "$path/db.php";

이렇게 하면 index.php나 adm/admin_login.php에서 문제없이 db.php파일을 불러올 수 있다.
letsgolee님 너무나도 자세한 설명 감사합니다.ㅠㅜ
이제 이해가 됐네요~^^;
프로그램을 이제 공부하고있는 상황이라서 쉽지가 않네요^^;
답변을 늦게 확인해서 이제야 감사의 마음을 전해드립니다.^^
© SIRSOFT
현재 페이지 제일 처음으로