đường dẫn tương đối trong request_once không hoạt động


103

Tôi có cấu trúc sau

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

tập tin include.php có những điều sau

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

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

và trong trang index.php tôi đã đưa vào

require_once 'include/include.php';

Khi tôi mở trang index.php, tôi nhận được cảnh báo sau và lỗi nghiêm trọng. Tôi không hiểu nguyên nhân gây ra lỗi này. Khi tôi đưa ra đường dẫn tuyệt đối thì nó hoạt động. Nhưng tôi tin rằng con đường tuyệt đối không phải là một ý tưởng hay.

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Cảm ơn trước


Tôi thường làm Objective-C và cố gắng bắt tay vào viết kịch bản php và thật buồn khi thấy tôi đã lãng phí 2 giờ để tìm cách bao gồm các tệp một cách chính xác trong PHP. Mọi thứ thật dễ dàng với X-code.
rohan-patel

Một thường chạy vào lỗi này, và để nhanh chóng khắc phục nó, hãy làm theo các bước sau: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Câu trả lời:


216

Sử dụng

__DIR__

để lấy đường dẫn hiện tại của tập lệnh và điều này sẽ khắc phục sự cố của bạn.

Vì thế:

require_once(__DIR__.'/../class/user.php');

Điều này sẽ ngăn chặn các trường hợp bạn có thể chạy một tập lệnh PHP từ một thư mục khác và do đó các đường dẫn họ hàng sẽ không hoạt động.

Chỉnh sửa: đã khắc phục sự cố dấu gạch


42
Coi chừng! __DIR__mới trong PHP 5.3. Nếu bạn cần tập lệnh này để chạy trên các phiên bản PHP cũ hơn, bạn nên sử dụng dirname(__FILE__)thay thế.
Charles

27
Lưu ý rằng bạn nên đưa dấu gạch chéo vào sau theo cách thủ công __DIR__. Vì vậy: require_once(__DIR__.'/../class/user.php'); Theo tài liệu , dấu gạch chéo được bỏ qua ngoại trừ thư mục gốc.
Ariel Allon 17/12/12

9
Cảm ơn sự giúp đỡ, nhưng tôi vẫn không hiểu tại sao lại __DIR__cần thiết. Các tài liệu PHP dường như nói rằng PHP sẽ tìm kiếm thư mục của tập lệnh hiện tại theo mặc định. Bất cứ ai có thể làm sáng tỏ một số?
David

1
@David Tôi nghĩ điều này là cần thiết khi bạn nhập tệp từ 2 nơi cùng một lúc. Ví dụ: bạn có một tệp với require "../a.php". Nếu tệp này được nhập từ tệp khác (x) trong dir1/dir2/x.phptệp được bao gồm sẽ là dir1/a.php, nhưng nếu có x dir1/dir2/dir3/x.php, tệp được bao gồm sẽ là dir1/dir2/a.php, v.v. Hay tôi nhầm?
José Ramón

1
Bây giờ có một danh sách kiểm tra xử lý sự cố cho lỗi thường xuyên này ở đây: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

đối với phiên bản php 5.2.17 __DIR__sẽ không hoạt động nó sẽ chỉ hoạt động với php 5.3

Nhưng đối với phiên bản php cũ hơn dirname(__FILE__)một cách hoàn hảo

Ví dụ viết như thế này

require_once dirname(__FILE__) . '/db_config.php';

1

Trong trường hợp của tôi, nó không hoạt động, ngay cả với __DIR__hoặc getcwd()nó tiếp tục chọn sai đường dẫn, tôi đã giải quyết bằng cách xác định chi phí trong mọi tệp tôi cần với đường dẫn cơ sở tuyệt đối của dự án:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

Tôi có MAMP với php 5.4.10 và hệ thống phân cấp thư mục của tôi là cơ bản:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....


0

Tôi vừa gặp phải vấn đề tương tự này, nơi tất cả đều hoạt động tốt, cho đến thời điểm tôi có một bao gồm trong một bao gồm khác.

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

Giải pháp 1. (mã hóa cứng không mong muốn của tên thư mục html công khai của tôi, nhưng nó hoạt động):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

Giải pháp 2. (nhận xét không mong muốn ở trên về DIR chỉ hoạt động kể từ php 5.3, nhưng nó hoạt động):

require_once __DIR__. '/../script/pdocrud.php';

Giải pháp 3. (Tôi không thể thấy bất kỳ nhược điểm nào và nó hoạt động hoàn hảo trong php 5.3 của tôi):

require_once dirname(__FILE__). '/../script/pdocrud.php';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.