2008-12-05 13 views
22

Trên các trang khác nhau trong trang web PHP của tôi và trong nhiều thư mục lồng nhau, tôi muốn bao gồm một tệp cụ thể tại một đường dẫn liên quan đến thư mục gốc.Làm thế nào để định dạng một đường dẫn bao gồm() tuyệt đối (chứ không phải là tương đối) của PHP?

gì lệnh duy nhất tôi có thể đặt trên cả hai trang ...

http://www.example.com/pageone.php
http://www.example.com/somedirectory/pagetwo.php

... để bao gồm trang này:

http://www.example.com/includes/analytics.php

này không hoạt động:

<?php include('/includes/analytics.php'); ?> 

Điều quan trọng là điều này được lưu trữ trong tôi IS trên Windows?

Trả lời

5

Nếu bạn đưa ra bao gồm() hoặc yêu cầu() (hoặc các phiên bản * _once) một tên đường dẫn tuyệt đối, tập tin đó sẽ được đưa vào. Một tên đường dẫn tuyệt đối bắt đầu với một "/" trên Unix, và với một ký tự ổ đĩa và dấu hai chấm trên Windows.

Nếu bạn cung cấp đường dẫn tương đối (bất kỳ đường dẫn nào khác), PHP sẽ tìm kiếm các thư mục trong giá trị cấu hình "include_path" theo thứ tự, cho đến khi tìm thấy kết quả khớp hoặc không tìm thấy thư mục nào khác.

Vì vậy, trong ngắn hạn, để bao gồm tên tệp tuyệt đối, hãy đặt tên tệp tuyệt đối. Xem thêm hàm realpath().

Nếu bạn muốn thiết lập riêng bao gồm "gốc" của bạn, có một cái nhìn tại this question (cụ thể là câu trả lời của tôi tất nhiên :-)

+0

Xin chào, tôi có một câu hỏi về php bao gồm một phần. Bạn có thể kiểm tra câu hỏi tiền thưởng của tôi không: https://stackoverflow.com/questions/47793007/included-php-files-wont-work-after-moved-files-subfolder/47853654#47853654 – Azzo

1

Sử dụng .. để đi lên thư mục. Vì vậy, trong pageone.php

include 'includes/analytics.php'; 

trong pagetwo.php

include '../includes/analytics.php'; 

Không có khái niệm "gốc" như bạn đang đề cập đến trong PHP như xa như tôi biết, mặc dù bạn có thể định nghĩa nó nếu bạn muốn. May mắn nhất!

+1

Không có cách nào để sử dụng đường dẫn tuyệt đối? –

+1

Bạn có thể sử dụng đường dẫn tuyệt đối như "c: /includes/analytics.php" hoặc "/home/iamnafets/includes/analytics.php", nhưng tệp PHP không phải là một phần của "dự án" hoặc "thư mục ảo" như Các trang ASP là. –

+0

Tôi không đủ cụ thể. Tôi muốn một lệnh duy nhất sẽ hoạt động từ một trong hai trang. –

8

Như @Stefan Mai nói, PHP không có đường dẫn "gốc" nhưng bạn có thể xác định một đường dẫn dễ dàng - hầu hết các trang web đều có trang được bao gồm mọi lúc (ví dụ: tệp cấu hình), bạn có thể thêm:

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

Sau đó sử dụng bao gồm ROOT. '/includes/analytics.php';

Điều gì đó cũng khá hữu ích là chỉ thị auto_prepend, bạn có thể sử dụng trong .htaccess trên apache - không chắc chắn về việc thiết lập nó trên IIS (mặc dù bạn có thể có toàn cục trong PHP ini).

+0

của COURSE php có thư mục gốc. Đó là gốc hệ thống tập tin! – gnud

+0

bạn biết bạn chỉ có thể '__DIR__' đúng không? – Eva

24

Bạn chỉ có thể sử dụng include $_SERVER['DOCUMENT_ROOT'] . "/includes/analytics.php";

+2

Không hoạt động theo IIS – jjxtra

+1

Dường như không hoạt động trên máy chủ streamline.net ... Hãy nghĩ rằng chúng là Linux? – jowie

+0

Làm việc cho tôi. Cảm ơn nhiều. Tôi muốn tôi có thể upvote này nhiều lần. – Siraj

0

Các dấu ngã được hiểu như là một nhân vật đặc biệt của vỏ, vì vậy sử dụng nó bên trong Mã PHP sẽ không hoạt động bất kể hệ điều hành.

Nếu bạn đang cố truy cập nội dung nào đó liên quan đến thư mục chính của người dùng, bạn có thể thử getenv() - Tôi chắc chắn Windows đặt biến môi trường tương đương $HOME.

1

Tác phẩm này.

<?php include('c:/inetpub/example.com/includes/analytics.php'); ?> 

Tôi sẽ phải thực hiện phần c:/inetpub/example.com/ một số loại biến toàn cầu để nó hơi di động từ máy chủ đến máy chủ.

+1

Điều này sẽ gây ra vấn đề khi bạn di chuyển trang web đến một máy chủ khác. – Jacco

9

Từ quan điểm của gốc PHP là đầu của hệ thống tệp trên máy chủ web, không phải là gốc từ phối cảnh của trình duyệt web.

Hầu hết mọi người thực hiện một trong những điều sau.

Xác định hằng số, trong tệp cấu hình chung và sử dụng trong mỗi cuộc gọi để yêu cầu/bao gồm.

Hoặc họ sử dụng mã như thế này.

require_once realpath(dirname(__FILE__).'/config.php'); 
require_once realpath(dirname(__FILE__).'/lib/Database.php'); 

Sử dụng biến môi trường có thể nguy hiểm trong một số trường hợp và là nguồn của vấn đề bảo mật.

+0

Đây là một giải pháp tuyệt vời! –

+0

Bạn có thể mô tả (hoặc liên kết tới) các lỗ hổng này có thể lộ ra không? – Justin

+0

@Justin, Nếu chúng tôi giả định rằng PHP, máy chủ web của bạn và cấu hình không có lỗi, thì điều này không thể bị lạm dụng. Nếu như trong thế giới thực, bạn biết có lỗi và cấu hình bỏ lỡ.Hãy phòng thủ, và không tin vào đầu vào bên ngoài. Tôi tưởng tượng một kịch bản, trong một thiết lập chia sẻ-máy chủ, nơi một cái gì đó đã bị lỗi hoặc bị bỏ lỡ cấu hình, và nó kết quả là PHP bị buộc phải bao gồm mã độc hại. Tôi là một chút hoang tưởng về cố gắng để tránh mã không hợp lệ nhận được thực hiện bởi các kịch bản tôi đã tác giả. – Zoredache

4

Tôi đã kết hợp các đề xuất ở trên và đưa ra điều này.

Trong file config.php của tôi, tôi xác định ROOT như:

define('ROOT', $_SERVER['DOCUMENT_ROOT']);

Sau đó, tôi sử dụng nó trong các tập tin succeding tôi:

include_once(ROOT."/someFile.php");

include_once(ROOT."/includes/someFile.php");

0

Con đường tôi tìm thấy là:

<?php include $_SERVER['DOCUMENT_ROOT'].'\\Your\\Site\\Path.php' ?> 

The \\ là cần thiết khi bạn có một số ký tự đặc biệt có thể được thoát (tức là \ n), để \\ là \ trên chuỗi.

Vì bạn đang ở trong cửa sổ, bạn phải sử dụng \ thay vì/

Các vấn đề liên quan