Php ../ đường dẫn không hoạt động

Làm việc với các đường dẫn bao gồm trong PHP đôi khi có thể mang lại một thách thức khá lớn. Khi mọi thứ nằm trong thư mục gốc thì không có vấn đề gì, nhưng khi các tệp được chuyển vào một hoặc nhiều thư mục con, khó khăn có thể phát sinh. Bài viết này sử dụng đường dẫn Unix, không phải đường dẫn Microsoft Windows

Tương đối so với. đường dẫn tuyệt đối

Đầu tiên một lưu ý về đường dẫn tương đối so với. con đường tuyệt đối

Đường dẫn tương đối trỏ đến một tệp hoặc thư mục liên quan đến vị trí của tệp hiện tại

Nếu bạn có một bao gồm trong chỉ mục của bạn. php và đang sử dụng một đường dẫn tương đối để đưa vào như thế này

include ['foo.php'];

Sau đó, tập lệnh sẽ tìm tệp foo. php ở cùng một nơi với chỉ mục. php

Đường dẫn tuyệt đối là "đường dẫn đầy đủ" theo quan điểm của máy chủ web. Nó là đường dẫn chứa tài liệu gốc. Ví dụ

include ['/foo.php'];
0

Nếu bạn có

include ['/foo.php'];
1 nằm trong
include ['/foo.php'];
2 [chú ý thư mục con] và đang sử dụng một đường dẫn tuyệt đối để đưa vào như thế này

include ['/foo.php'];

[Lưu ý dấu gạch chéo trước có nghĩa là đường dẫn tuyệt đối], khi đó tập lệnh sẽ tìm tệp

include ['/foo.php'];
3 trong thư mục gốc của tài liệu của máy chủ web và không ở cùng vị trí với tệp
include ['/foo.php'];
1. Do đó, tập lệnh mong muốn tìm thấy
include ['/foo.php'];
3 trong thư mục
include ['/foo.php'];
0 chứ không phải trong thư mục
include ['/foo.php'];
2

Vấn đề

Nếu bạn giữ mọi thứ trong thư mục gốc của tài liệu và luôn biết ứng dụng của mình sẽ được cài đặt ở đâu, thì thật dễ dàng chỉ cần sử dụng một đường dẫn tuyệt đối để đưa vào mọi lúc và nếu bạn đang làm việc trên một hệ điều hành giống như Unix, biến số

include ['/foo.php'];
8 sẽ

Nhưng nếu bạn đang phát triển một ứng dụng mã nguồn mở, và bạn không biết ứng dụng của mình sẽ được cài đặt ở đâu thì sao? . Khi ứng dụng đi vào bên trong thư mục con, bạn không còn có thể tin tưởng vào các đường dẫn tuyệt đối để đưa vào

Trong hầu hết các trường hợp, cách đặt cược an toàn nhất là sử dụng đường dẫn tương đối để đưa vào, nhưng cũng có một vấn đề tiềm ẩn với điều đó. Nếu ứng dụng của bạn cần bao gồm nhiều tệp khác nhau nằm trong nhiều thư mục con khác nhau và kết quả là "bao gồm lồng nhau", thì việc sử dụng đường dẫn tương đối sẽ không hiệu quả. Hãy tưởng tượng rằng bạn đang bao gồm một menu để tránh phải cập nhật từng tệp nếu phải thay đổi menu

Ví dụ

include ['/foo.php'];
1

Bên trong

include ['/foo.php'];
1 và mọi tệp khác, bạn bao gồm menu như thế này, sử dụng đường dẫn tương đối

include ['/foo.php'];
3

Bên trong các tệp trong tài liệu, bạn bao gồm menu như thế này, sử dụng đường dẫn tương đối

include ['/foo.php'];
4

Lúc đầu, điều này có vẻ hoàn hảo, nhưng còn các URL neo bên trong menu thì sao?

Hãy tưởng tượng rằng các URL của bạn trong

include ['/foo.php'];
10 trông như thế này, lại là các đường dẫn tương đối

include ['/foo.php'];
7

Nếu bạn đã tải tài liệu

include ['/foo.php'];
1 và nhấp vào bất kỳ liên kết URL nào trong menu, nó sẽ hoạt động hoàn hảo, nhưng nếu tệp
include ['/foo.php'];
13 được tải và bạn nhấp vào liên kết
include ['/foo.php'];
1 để quay lại trang đầu, tập lệnh sẽ tìm kiếm
include ['/foo.php'];
1

Một giải pháp có thể là chỉ sử dụng các đường dẫn tuyệt đối bên trong menu, như thế này

include ['/foo.php'];
3

Nhưng một lần nữa, nếu ứng dụng được cài đặt bên trong thư mục con thì sao?

Điều tương tự cũng xảy ra khi sử dụng biến

include ['/foo.php'];
17 làm tham chiếu

Ví dụ

include ['/foo.php'];
5

include ['/foo.php'];
18 hoạt động như một đường dẫn tuyệt đối và nó không bao gồm thư mục con

Tồn tại một số cách tiếp cận phổ biến để giải quyết các vấn đề được mô tả ở trên, nhưng việc giữ cho nó đơn giản đôi khi không phải là một lựa chọn [thật không may]

hệ thống đơn giản

Nếu bạn đang phát triển một ứng dụng cụ thể để chỉ hoạt động trên một máy chủ web cụ thể và ứng dụng đó không được cài đặt làm ứng dụng cho một số máy chủ web khác nhau, thì bạn nên giữ mọi thứ càng đơn giản càng tốt.

Nếu bạn đang tải một tệp nằm trong cùng thư mục với tệp nguồn, chỉ cần bao gồm tên tệp, không sử dụng bất kỳ đường dẫn nào. Đây là ví dụ rất cơ bản và đơn giản về đường dẫn tương đối vì tệp và thư mục đều ở cùng một nơi. Nói cách khác, không cần thông tin đường dẫn nếu các tệp nằm trong cùng một thư mục

Nếu bạn đang đưa menu vào từng tệp, nơi cần thiết và menu nằm bên trong thư mục con như thế này.

include ['/foo.php'];
19, bạn cần nhớ tránh bao gồm menu từ các tệp nằm ở những nơi khác ngoài chính tài liệu gốc

Xác định đường dẫn cài đặt

Giải pháp phổ biến cho các sự cố được mô tả ở trên là xác định đường dẫn cài đặt và sau đó chỉ sử dụng các đường dẫn và URL tuyệt đối

Giải pháp này cực kỳ hiệu quả, nhưng thách thức nằm ở chỗ làm thế nào để định nghĩa một thứ mà bạn không biết

Đường dẫn cài đặt là nơi ứng dụng được cài đặt, nó là thư mục gốc của tài liệu được thêm vào bất kỳ thư mục con nào có thể

Cách Wordpres

Tôi không biết liệu Wordpress có còn sử dụng phương pháp này hay không, nhưng một cách thường được sử dụng để giải quyết vấn đề trên là quét tập lệnh cài đặt cho thư mục làm việc hiện tại khi cài đặt và sau đó lưu thông tin vào cơ sở dữ liệu [hoặc hệ thống tệp] cho

include ['/foo.php'];
8

Tập lệnh cài đặt sẽ quét thư mục làm việc của nó và xóa tên tệp, sau đó lưu thông tin đó dưới dạng đường dẫn cài đặt trong cơ sở dữ liệu. Đường dẫn cài đặt sẽ được xác định là một hằng số và sau đó được sử dụng làm đường dẫn tuyệt đối xuyên suốt tất cả các tệp trong hệ thống

Đây là một ví dụ sẽ dẫn đến đường dẫn cài đặt

include ['/foo.php'];
9

Đầu ra của lệnh phát nổ là một mảng. Tập lệnh sẽ thu thập phần tử cuối cùng của mảng, là tên tệp của tập lệnh đang chạy, bất kể nó nằm ở đâu. Kết quả còn lại là gốc tài liệu đã thêm bất kỳ thư mục con nào có thể

Phương pháp này khá hiệu quả, nhưng nó có một vấn đề nhỏ. Nếu người dùng cần di chuyển ứng dụng của mình sang một máy chủ khác và đường dẫn cài đặt thay đổi, anh ta không thể chỉ cần di chuyển ứng dụng và khôi phục cơ sở dữ liệu. Anh ấy phải thay đổi đường dẫn cài đặt bên trong cơ sở dữ liệu trước

Yêu cầu người dùng làm điều đó

Phương pháp này yêu cầu người dùng ghi thủ công đường dẫn cài đặt bên trong một biến trong tệp cấu hình

Vì người dùng phải nhập thông tin đăng nhập cơ sở dữ liệu của mình vào một số loại tệp cấu hình hoặc trong khi cài đặt, nên anh ta cũng có thể nhập đường dẫn cài đặt

Vấn đề chính với phương pháp này là rất nhiều người nhập sai đường dẫn cài đặt. Có hoặc không có dấu gạch chéo cần thiết, v.v. Và vì nó có thể được quét tự động nên thực sự không có lý do gì khiến người dùng phải nhập thủ công

thực hành tốt nhất

Mỗi giải pháp đều có ưu và nhược điểm riêng và tôi không nghĩ rằng có một cách thực hành tốt nhất cho vấn đề này. Các khung khác nhau sử dụng các giải pháp khác nhau cho các vấn đề

Điều tốt nhất cần làm là lập kế hoạch cho vấn đề để có được kết quả tốt nhất

Bao gồm PHP so với. yêu cầu

Sự khác biệt duy nhất giữa các hàm

include ['/foo.php'];
30 và
include ['/foo.php'];
31 hoặc
include ['/foo.php'];
32 và
include ['/foo.php'];
33 là khi xảy ra lỗi, các hàm bao gồm sẽ tạo ra một cảnh báo và tập lệnh sẽ tiếp tục thực thi trong khi các hàm yêu cầu tạo ra lỗi nghiêm trọng và tập lệnh sẽ dừng thực thi

Làm cách nào để bao gồm đường dẫn trong tệp PHP?

htaccess, hãy làm theo các bước sau. .
Mở. htaccess trong trình chỉnh sửa. .
Thêm dòng sau vào. tập tin htaccess. Thay thế đường dẫn bằng đường dẫn của thư mục bao gồm. php_value bao gồm_path ". /con đường"
Lưu các tập tin. Đường dẫn bao gồm hiện được đặt

__ thư mục __ PHP là gì?

Có thể sử dụng __DIR__ để lấy thư mục làm việc của mã hiện tại . Nó đã được giới thiệu trong PHP bắt đầu từ phiên bản 5. 3. Nó tương tự như sử dụng dirname[__FILE__]. Thông thường, nó được sử dụng để bao gồm các tệp khác có trong một tệp được bao gồm.

Đường dẫn tương đối trong PHP là gì?

Đường dẫn tuyệt đối và tương đối . g. "http. //www. tia cực tím. edu/disted/php/webct/itr/index. php" Đường dẫn tương đối giả định rằng tệp nằm trên máy chủ hiện tại , e. g. "php/webct/itr/chỉ mục. php".

Đường dẫn tương đối hoạt động như thế nào?

Đường dẫn tương đối đề cập đến một vị trí có liên quan đến thư mục hiện tại. Đường dẫn tương đối sử dụng hai ký hiệu đặc biệt, dấu chấm [. ] và dấu chấm đôi [. ], chuyển thành thư mục hiện tại và thư mục mẹ . Dấu chấm đôi được sử dụng để di chuyển lên trong hệ thống phân cấp.

Chủ Đề