2009-08-16 5 views
2

윈도우에서 PHP로 이상한 문제가 발생했습니다 ... 내 응용 프로그램에서 설정 파일을로드하고 자동로드를 등록하며 초기화 등을 수행하는 '코어'파일을로드합니다. include_once ("config.php "); 이것은 현재 디렉토리에서 아무 문제없이 작동하는데, 만약 내가 분리 된 디렉토리에서 코어 파일을 포함한다면, 자동으로 설정 파일의 include를 무시한다. /webroot/core.phprequire_once 무시했다.

<?php 
    require_once "config.php"; 
    //register autoloads 
    //do some initialization... standard stuff 
?> 

/webroot/config.php

<?php 
    define("WEB_ROOT","/webroot"); 
    define("DB_USER","root"); 
    // ... more stuff... 
?> 

/webroot/admin/index.php

<?php 
    require_once("../dbconnect.php"); 
    echo WEB_ROOT; 
    // print string literal WEB_ROOT rather than value in config.php 
?> 

는 나의 이해는 그 파일입니다 작업은 요청을 만드는 파일의 디렉토리와 관련이 있습니다. require_once ("config.php")가 파일을 선택하지 않아야합니다. core.php에 유창한가요? 이 코드는 Mac이나 Linux에서 기대하는 것처럼 작동하지만 Windows에서는 전혀 작동하지 않습니다 (전체 경로 또는 ../을 사용하도록 요구 사항을 변경하면 작동 함)

진짜 광기는 require_once ("config.php")는 에러를 던지지 않지만 내부 코드는 실행되지 않습니다!

+0

아무도 발견했다 index.php를로드인지 config.php 또는 core.php 대신 dbconnect.php? 당신도 dbconnect.php의 내용을 보여줄 필요가 있습니다 ... –

답변

7

PHP가 자동으로 오류를 무시하면, 요청 된 파일의 상단에 넣어보십시오

ini_set('display_errors', 'On'); 
error_reporting(E_ALL); 

이제 모든 오류는 볼 수 있어야합니다.

그러면 내게 가장 좋은 방법은 요청 된 파일 (포함 된 파일이 아님)에 응용 프로그램 루트에 대한 전체 파일 시스템 경로가있는 상수를 정의하는 것입니다. 그래서 index.php에서 응용 프로그램 루트는 /webroot/admin 경우 : 그 후

define('APP_DIR', dirname(__FILE__)); 

는이 상수를 사용하는 것을 포함합니다. 디렉토리 구조 인 경우 :

/webroot/ 
    admin/ 
     index.php 
    config.php 
    core.php 

그리고 당신은 config.phpindex.php에 포함 할 : core.php에서

require_once APP_DIR . '/../config.php'; 

이 될 것이라고 config.php을 포함 : 등등

require_once APP_DIR . '/../config.php'; 

그리고있다.

절대 파일 시스템 경로를 사용하면 모호한 점을 방지 할 수 있습니다.당신이 포함을하고있는 파일의 상대 경로를 사용하여 파일을 포함하려면

+0

dirname (__ FILE__)을 사용하면 절대 경로를 정의 할 수 있습니다! 불행히도 내가 작업하고있는 응용 프로그램은 config 파일에서 직접 이것을 설정하고 이것을 'APP_DIR'로 사용합니다. 나는 정말로 이유를 모른다! – Michael

1

아마도 PHP의 open_basedir 제한 사항에 부딪 히고 있습니까? 일부 악의적 인 스크립트를 방지하기 위해 PHP는 파일을로드 할 수있는 범위를 제한하는 '안전 모드'를 사용합니다. xampp이 기본적으로 켜져 있다면 xampp을 실행할 수 있습니다.

또한 웹 서버의 오류 로그를 검사하여 거기에 오류가 있는지 확인할 수 있습니다 (문제를 분류 할 때까지 오류보고를 E_ALL로 설정하는 것이 좋음).

+0

safemode가 켜져 있는지 확인하기 위해 ini를 체크했는데, 이것은 좋은 제안은 아닙니다! 오류보고는 단지주의 사항을 무시하도록 설정하지만, 바닐라 E_ALL로 난 그냥이 얻을했다 : 공지 사항 : 사용 정의되지 않은 상수 FILE_ROOT의 - 'FILE_ROOT'C에서 가정 : \ 웹 루트 \ core.php조차 라인 87 에 언로드 된 구성 파일에 대한 알림이 표시됩니다. – Michael

2

, 당신은 다음과 같이 전체 경로를 앞에 추가해야합니다 :

<?php 
require_once(dirname(__FILE__) . "/config.php"); 
?> 
+1

nixes ... 아닙니다. PHP는이 경우에 자동으로 요구를 무시합니다. – Michael

+0

이 라인은 실제로 Linux에서 특별히 개발 한 스크립트입니다. 침묵하는 무시 무시한 비트는 실제로 이상한 것이고 나는 두려워하는 것으로 당신을 도울 수 없습니다. 나는 방금 전에 내가 베스트 프랙티스로 채택한 것을 게시했다. – Thorarin