Làm cách nào để đưa một tệp vào hơn 2 thư mục?


94

Làm thế nào để bạn bao gồm một tệp có hơn 2 thư mục trở lại. Tôi biết bạn có thể sử dụng ../index.phpđể bao gồm một tệp có 2 thư mục trở lại, nhưng làm thế nào để bạn làm điều đó cho 3 thư mục trở lại? Điều này có nghĩa không? Tôi đã thử .../index.phpnhưng nó không hoạt động.

Tôi có một tệp trong /game/forum/files/index.phpđó và nó sử dụng PHP bao gồm để bao gồm một tệp. Được đặt tại /includes/boot.inc.php; /là thư mục gốc.


chdir ('' ../ '');
maheshmnj

Câu trả lời:


152

..chọn thư mục mẹ từ hiện tại. Tất nhiên, điều này có thể được xâu chuỗi:

../../index.php

Đây sẽ là hai thư mục lên.


1
@Brian Chà, vớ vẩn quá, bạn đang so sánh giữa táo và cam. Bạn đúng rằng a definesẽ được sử dụng ở đây nhưng (1) thậm chí không phải là câu hỏi ở đây từ xa. Và (2) bạn vẫn sử dụng một đường dẫn tương đối trong của mình define, trừ khi bạn thực sự mã hóa toàn bộ đường dẫn máy chủ tuyệt đối và tôi sẽ hạn chế điều đó vì nó chỉ có nhược điểm. Hoặc (giải pháp thay thế thứ ba) bạn có thể sử dụng thao tác chuỗi để trích xuất thư mục mẹ từ đường dẫn hiện tại (được mở rộng) nhưng một lần nữa điều này không có bất kỳ lợi ích nào so với việc sử dụng đường dẫn tương đối.
Konrad Rudolph

Đáng buồn là điều này có thể làm việc trên một thiết bị và không khác, /../có thể làm việc hoặc ../có thể làm việc, hay không có thể làm việc trên ba máy vi tính khác nhau với cùng một thiết lập môi trường chính xác
Douglas Gaskell

@DouglasGaskell Không, điều đó không chính xác. Ký hiệu đường dẫn tương đối, bao gồm ../../../(lưu ý: không có dấu gạch chéo ở đầu!), Hoạt động trên tất cả các hệ điều hành hiện đại. Nó từng không hoạt động trên Windows và ( từ lâu ) Macintosh nhưng giờ nó hoạt động ở mọi nơi, và đã có trong ít nhất mười năm qua. Nếu nó không hoạt động ở đâu đó thì lý do là cấu trúc tệp khác nhau và / hoặc bạn đang ở trong một thư mục làm việc khác. Nhưng nó không liên quan đến mã này.
Konrad Rudolph

Konrad, tôi đề cập đến vấn đề này vì tôi vừa mới xử lý vấn đề này không 10 phút trước sau khi chia sẻ kho lưu trữ với đồng nghiệp bằng cách sử dụng ảnh chụp nhanh máy ảo. Vì một số lý do mà tất cả các con đường phải có /../thay vì ../vào môi trường của anh ấy.
Douglas Gaskell

@DouglasGaskell Và tôi có thể tự tin nói với bạn rằng lỗi không liên quan. Trên thực tế, đường dẫn /../đơn giản là không có ý nghĩa trên bất kỳ hệ thống nào (nó tương đương với /, hoặc một lỗi). Bạn có chắc mình không dán thứ gì đó trước mặt nó?
Konrad Rudolph

51

Để bao gồm một tệp trở lại một thư mục, hãy sử dụng '../file'. Đối với hai thư mục trở lại, sử dụng '../../file'. Và như thế.

Mặc dù, trên thực tế, bạn không nên thực hiện bao gồm liên quan đến thư mục hiện tại. Điều gì xảy ra nếu bạn muốn di chuyển tệp đó? Tất cả các liên kết sẽ bị phá vỡ. Một cách để đảm bảo rằng bạn vẫn có thể liên kết đến các tệp khác, trong khi vẫn giữ lại các liên kết đó nếu bạn di chuyển tệp của mình, là:

require_once($_SERVER['DOCUMENT_ROOT'] . 'directory/directory/file');

DOCUMENT_ROOT là một biến máy chủ đại diện cho thư mục cơ sở mà mã của bạn nằm trong đó.


2
Hey Dan câu hỏi nhanh: bạn nói " thực tế bạn không nên thực hiện bao gồm liên quan đến thư mục hiện tại ". Điều gì về tất cả các đường dẫn tương đối nằm rải rác trong hầu hết các tài liệu HTML? Nếu tôi di chuyển tệp của mình, những tệp đó cũng sẽ không bị hỏng chứ? Có tiêu chuẩn về thời điểm sử dụng liên kết tương đối và liên kết tuyệt đối không? Cảm ơn bạn trước!
Govind Rai

2
tôi nghĩ nó thiếu một dấu gạch chéo, nó phải là: request_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
user889030

@ user889030 theo như tôi biết, dấu gạch chéo đó là không cần thiết, ít nhất là trong hầu hết các trường hợp
BotMaster3000


27
. = current directory
.. = parent directory

Vì vậy, ../giúp bạn trở lại một thư mục chứ không phải hai .

Chuỗi ../nhiều lần nếu cần thiết để tăng 2 cấp trở lên.


21
include dirname(__FILE__).'/../../index.php';

là đặt cược tốt nhất của bạn ở đây và nó sẽ tránh hầu hết các lỗi đường dẫn tương đối mà bạn có thể gặp phải với các giải pháp khác.

Thật vậy, nó sẽ buộc bao gồm phải luôn liên quan đến vị trí của tập lệnh hiện tại nơi mã này được đặt (vị trí nào có khả năng ổn định nhất, vì bạn xác định kiến ​​trúc của ứng dụng của mình). Điều này khác với việc chỉ thực hiện include '../../index.php' sẽ bao gồm tương đối vào tập lệnh đang thực thi (còn có tên là "gọi") và sau đó tương đối vào thư mục làm việc hiện tại , này sẽ trỏ đến tập lệnh mẹ bao gồm tập lệnh của bạn, thay vì phân giải từ đường dẫn của tập lệnh được bao gồm .

Từ tài liệu PHP:

Các tệp được đưa vào dựa trên đường dẫn tệp đã cho hoặc nếu không có đường dẫn nào được chỉ định thì include_path được chỉ định. Nếu tệp không được tìm thấy trong include_path, thì cuối cùng, include sẽ kiểm tra trong thư mục riêng của tập lệnh gọi và thư mục làm việc hiện tại trước khi bị lỗi.

Và bài đăng cũ nhất mà tôi đã tìm thấy trích dẫn thủ thuật này có từ năm 2003, bởi Tapken .

Bạn có thể kiểm tra với thiết lập sau:

Tạo một bố cục như thế này:

htdocs
¦   parent.php
¦   goal.php
¦
+---sub
    ¦   included.php
    ¦   goal.php

Vào parent.php, đặt:

<?php
include dirname(__FILE__).'/sub/included.php';
?>

Vào sub/included.php, đặt:

<?php
print("WRONG : " . realpath('goal.php'));
print("GOOD : " . realpath(dirname(__FILE__).'/goal.php'));
?>

Kết quả khi truy cập parent.php:

WRONG : X:\htdocs\goal.php
GOOD : X:\htdocs\sub\goal.php

Như chúng ta có thể thấy, trong trường hợp đầu tiên, đường dẫn được giải quyết từ tập lệnh gọi parent.php, trong khi bằng cách sử dụng dirname(__FILE__).'/path'thủ thuật, việc bao gồm được thực hiện từ tập lệnhincluded.php nơi mã được đặt vào.

Hãy cẩn thận, điều sau KHÔNG tương đương với thủ thuật ở trên trái ngược với những gì có thể đọc ở nơi khác:

include '/../../index.php';

Thật vậy, việc chi tiêu trước /sẽ hoạt động, nhưng nó sẽ giải quyết giống như include ../../index.phptừ tập lệnh gọi (sự khác biệt là include_pathsẽ không được xem xét sau đó nếu nó không thành công).Từ tài liệu PHP :

Nếu một đường dẫn được xác định - cho dù là tuyệt đối (bắt đầu bằng ký tự ổ đĩa hoặc \ trên Windows, hoặc / trên hệ thống Unix / Linux) hay liên quan đến thư mục hiện tại (bắt đầu bằng. Hoặc ..) - thì include_path sẽ bị bỏ qua hoàn toàn.


@diEcho: tôi có thể biết tại sao nó "hoàn toàn sai" không? Tôi đang sử dụng nó trên một số ứng dụng cấp chuyên nghiệp và phương pháp này thực sự là phương pháp duy nhất hiệu quả trong mọi tình huống. Nó cũng được nêu chi tiết trong hướng dẫn sử dụng php : không thể sai được như vậy.
gaborous

dòng đầu tiên là hoàn toàn sai. Bạn không thể thêm vào ..giữa đường dẫn (tương đối / tuyệt đối).
diEcho

@diEcho Tôi cũng nên chỉ cho bạn đến PHP dẫn sử dụng: php.net/manual/en/function.include.php
gaborous

cho tôi biết một ví dụ duy nhất, nơi ..được sử dụng giữa bao gồm. nó luôn luôn nên là phần đầu của bao gồm
diEcho

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Một mô-đun cấp chuyên nghiệp cho ERP / CRM cấp chuyên nghiệp. Bạn không nên nói khi bạn không biết mình nói gì.
gaborous

16

../là một thư mục, Lặp lại cho hai thư mục ../../hoặc thậm chí ba thư mục: ../../../v.v.

Việc xác định hằng số có thể làm giảm sự nhầm lẫn vì bạn sẽ đi sâu vào các câu thư mục ngược lại

Bạn có thể xác định một số hằng số như vậy:

define('BD', '/home/user/public_html/example/');

define('HTMLBD', 'http://example.com/');

Khi sử dụng 'BD' hoặc 'thư mục cơ sở' của tôi, nó trông giống như sau:

file(BD.'location/of/file.php');

định nghĩa(); tài liệu tham khảo



12
../../../includes/boot.inc.php

Mỗi phiên bản của ../có nghĩa là up / back một thư mục.


9

sau đây là những cách để truy cập các thư mục khác nhau của bạn: -

./ = Your current directory
../ = One directory lower
../../ = Two directories lower
../../../ = Three directories lower

7

Bạn có thể làm ../../directory/file.txt- Điều này sẽ quay trở lại hai thư mục.

../../../- cái này đi ba. Vân vân



6

Nhưng hãy RẤT cẩn thận về việc cho phép người dùng chọn tệp. Bạn không thực sự muốn cho phép họ nhận một tệp có tên, chẳng hạn như

../../../../../../../../../../etc/passwd

hoặc các tệp hệ thống nhạy cảm khác.

(Xin lỗi, đã lâu rồi tôi chưa làm sysadmin linux và tôi nghĩ đây là một tệp nhạy cảm, theo những gì tôi nhớ)




4

nếu bạn đang sử dụng php7, bạn có thể sử dụng hàm dirname với tham số cấp là 2, ví dụ:

dirname("/usr/local/lib", 2);

tham số thứ hai "2" cho biết có bao nhiêu cấp

dirname referance


3

bao gồm trên các thư mục có thể được xử lý bằng tệp proxy

  • nguồn gốc
  • ..... | __web
  • ..... | ......... | _requiredDbSettings.php
  • ..... |
  • ..... | ___ db
  • ..... | ......... | _dbsettings.php
  • ..... |
  • ..... | _proxy.php

    dbsettings.php:
    $host='localhost';
    $user='username':
    $pass='pass';
    
    proxy.php:
    include_once 'db/dbsettings.php
    
    requiredDbSettings.php:
    include_once './../proxy.php';

2

Thử ../../ . Bạn có thể sửa đổi nó cho phù hợp vì nó sẽ đưa bạn sao lưu hai thư mục. Đầu tiên truy cập vào thư mục gốc sau đó truy cập vào thư mục cần thiết.

Vd: Bạn đang ở trong root/inc/usr/apvà có một thư mục khác root/2nd/path. Bạn có thể truy cập paththư mục từ apnhư thế này: ../../2nd/pathđầu tiên đi tới thư mục gốc hơn là thư mục mong muốn. Nếu không hoạt động xin vui lòng chia sẻ.


2

nếu bạn đưa vào /ở đầu bao gồm, bao gồm sẽ được lấy làm đường dẫn từ gốc của trang web.

nếu trang web của bạn là http://www.example.com/game/forum/files/index.php, bạn có thể thêm bao gồm vào /includes/boot.inc.php. Điều này sẽ giải quyết thành http://www.example.com /includes/boot.inc.php .

Bạn phải cẩn thận với tính năng truyền ..tải vì một số máy chủ web đã tắt tính năng này; nó cũng gây ra sự cố khi bạn muốn chuyển trang web của mình sang một máy / máy chủ mới và cấu trúc hơi khác một chút.


2

Thử cái này

ví dụ này là một thư mục trở lại

require_once('../images/yourimg.png');

ví dụ này là hai thư mục trở lại

require_once('../../images/yourimg.png');

Nó hoàn toàn giống nhau ;-) Tôi nghĩ ý bạn là '../../images/yourimg.png' trên cái thứ hai?
Edwin

OPPS nó sai lầm của tôi
rajpoot Rehan

1

Tôi đã thấy câu trả lời của bạn và tôi đã sử dụng đường dẫn bao gồm với cú pháp

require_once '../file.php'; // server internal error 500

và máy chủ http (Apache 2.4.3) trả về lỗi nội bộ 500.

Khi tôi thay đổi đường dẫn thành

require_once '/../file.php'; // OK

mọi thứ đều ổn.

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.