ฉันจะรวมไฟล์มากกว่า 2 ไดเร็กทอรีกลับได้อย่างไร?


96

คุณรวมไฟล์ที่มีมากกว่า 2 ไดเร็กทอรีกลับได้อย่างไร ฉันรู้ว่าคุณสามารถใช้../index.phpเพื่อรวมไฟล์ที่เป็น 2 ไดเรกทอรีกลับมาได้ แต่คุณจะทำอย่างไรให้ 3 ไดเรกทอรีกลับมา? สิ่งนี้สมเหตุสมผลไหม ฉันลองแล้ว.../index.phpแต่มันไม่ได้ผล

ฉันมีไฟล์/game/forum/files/index.phpและใช้ PHP รวมเพื่อรวมไฟล์ ซึ่งตั้งอยู่ใน/includes/boot.inc.php; /เป็นไดเรกทอรีราก


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

คำตอบ:


154

..เลือกไดเร็กทอรีหลักจากปัจจุบัน แน่นอนว่าสิ่งนี้สามารถถูกล่ามโซ่ได้:

../../index.php

นี่จะเป็นสองไดเรกทอรีขึ้นมา


1
@ ไบรอันนั่นเป็นเรื่องไร้สาระคุณกำลังเปรียบเทียบแอปเปิ้ลกับส้ม คุณคิดถูกที่defineจะใช้ที่นี่ แต่ (1) นั่นไม่ใช่คำถามจากระยะไกลที่นี่ และ (2) คุณยังคงใช้เส้นทางสัมพัทธ์ในของคุณdefineเว้นแต่คุณจะฮาร์ดโค้ดเส้นทางเซิร์ฟเวอร์สัมบูรณ์ทั้งหมดและฉันจะละเว้นจากสิ่งนั้นเนื่องจากมีข้อเสียเท่านั้น หรือ (ทางเลือกที่สาม) คุณสามารถใช้การจัดการสตริงเพื่อแยกไดเร็กทอรีหลักจากพา ธ ปัจจุบัน (ขยาย) แต่อีกครั้งสิ่งนี้ไม่มีข้อดีใด ๆในการใช้พา ธ สัมพัทธ์
Konrad Rudolph

น่าเศร้าที่สิ่งนี้อาจใช้ได้กับอุปกรณ์เครื่องหนึ่งไม่ใช่อีกเครื่องหนึ่ง/../อาจใช้งานได้หรือ../อาจใช้งานได้หรือไม่สามารถทำงานบนคอมพิวเตอร์สามเครื่องที่มีการตั้งค่าสภาพแวดล้อมเดียวกัน
Douglas Gaskell

@DouglasGaskell ไม่ถูกต้อง สัญกรณ์พา ธ สัมพัทธ์รวมถึง../และ../../(หมายเหตุ: ไม่มีเครื่องหมายทับ!) ทำงานบนระบบปฏิบัติการสมัยใหม่ทั้งหมด มันเคยใช้ไม่ได้บน Windows และMacintosh ( นานมาแล้ว) แต่ตอนนี้ใช้งานได้ทุกที่และอย่างน้อยก็สิบปีที่ผ่านมา หากไม่สามารถใช้งานได้บางที่สาเหตุก็คือโครงสร้างไฟล์แตกต่างกันและ / หรือคุณอยู่ในไดเรกทอรีการทำงานอื่น แต่มันไม่เกี่ยวข้องกับรหัสนี้
Konrad Rudolph

Konrad ฉันพูดถึงเรื่องนี้ตั้งแต่ฉันเพิ่งจัดการกับปัญหานี้เมื่อไม่ 10 นาทีที่แล้วหลังจากแชร์ที่เก็บกับเพื่อนร่วมงานโดยใช้สแน็ปช็อต VM ด้วยเหตุผลบางอย่างเส้นทางทั้งหมดจึงต้องมี/../แทนที่จะเป็น../สภาพแวดล้อมของเขา
Douglas Gaskell

@DouglasGaskell และฉันสามารถบอกคุณด้วยความมั่นใจว่าข้อผิดพลาดไม่เกี่ยวข้องกัน ในความเป็นจริงเส้นทางนั้น/../ไม่สมเหตุสมผลกับระบบใด ๆ (เทียบเท่ากับ/หรือข้อผิดพลาด) คุณแน่ใจหรือไม่ว่าคุณไม่ได้วางบางอย่างไว้ข้างหน้า
Konrad Rudolph

51

'../file'จะรวมถึงการกลับไดเรกทอรีหนึ่งไฟล์ใช้ สำหรับสองไดเรกทอรีกลับใช้'../../file'. และอื่น ๆ

แม้ว่าตามความเป็นจริงแล้วคุณไม่ควรดำเนินการรวมถึงสัมพันธ์กับไดเร็กทอรีปัจจุบัน จะเป็นอย่างไรหากคุณต้องการย้ายไฟล์นั้น ลิงก์ทั้งหมดจะพัง วิธีตรวจสอบให้แน่ใจว่าคุณยังคงสามารถเชื่อมโยงไปยังไฟล์อื่น ๆ ได้ในขณะที่ยังคงลิงก์เหล่านั้นไว้หากคุณย้ายไฟล์คือ:

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

DOCUMENT_ROOT เป็นตัวแปรเซิร์ฟเวอร์ที่แสดงถึงไดเร็กทอรีฐานที่รหัสของคุณอยู่ภายใน


2
คำถามสั้น ๆ ของ Hey Dan: คุณพูดว่า "ตามความเป็นจริงคุณไม่ควรแสดงรวมที่เกี่ยวข้องกับไดเรกทอรีปัจจุบัน " แล้วเส้นทางสัมพัทธ์ทั้งหมดที่ทิ้งกระจุยกระจายในเอกสาร HTML ส่วนใหญ่ล่ะ ถ้าฉันย้ายไฟล์ของฉันมันจะไม่พังด้วยใช่ไหม มีมาตรฐานในการใช้ลิงก์สัมพัทธ์กับลิงก์สัมบูรณ์หรือไม่? ขอบคุณล่วงหน้า!
Govind Rai

2
ฉันคิดว่ามันหายไปหนึ่งสแลชมันควรจะเป็น: require_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ directory / directory / file');
user889030

@ user889030 เท่าที่ฉันรู้ไม่จำเป็นต้องใช้เครื่องหมายทับอย่างน้อยที่สุดในกรณีส่วนใหญ่
BotMaster3000

1
@ BotMaster3000 อืมมม: sandbox.onlinephpfunctions.com/code/…
user889030

28
. = current directory
.. = parent directory

ดังนั้น../ทำให้คุณได้รับกลับไดเรกทอรีหนึ่งไม่ใช่สอง

โซ่../หลาย ๆ ครั้งเท่าที่จำเป็นเพื่อขึ้น 2 ระดับขึ้นไป


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

เป็นทางออกที่ดีที่สุดของคุณที่นี่และจะหลีกเลี่ยงข้อบกพร่องของเส้นทางสัมพัทธ์ส่วนใหญ่ที่คุณสามารถพบได้ในโซลูชันอื่น ๆ

อันที่จริงจะบังคับให้การรวมสัมพันธ์กับตำแหน่งของสคริปต์ปัจจุบันที่วางโค้ดนี้เสมอ (ตำแหน่งใดน่าจะเสถียรที่สุดเนื่องจากคุณกำหนดสถาปัตยกรรมของแอปพลิเคชันของคุณ) สิ่งนี้แตกต่างจากการทำเพียงอย่างเดียวinclude '../../index.php' ซึ่งจะรวมถึงสคริปต์การดำเนินการ (หรือที่เรียกว่า "การโทร") และจากนั้นไปยังไดเร็กทอรีการทำงานปัจจุบันซึ่งจะชี้ไปที่สคริปต์หลักที่มีสคริปต์ของคุณแทนที่จะแก้ไขจากพา ธ ของสคริปต์ .

จากเอกสาร PHP:

ไฟล์ถูกรวมตามพา ธ ไฟล์ที่กำหนดหรือหากไม่มีการระบุจะระบุ include_path หากไม่พบไฟล์ใน include_path สุดท้าย include จะตรวจสอบในไดเร็กทอรีของสคริปต์การโทรและไดเร็กทอรีการทำงานปัจจุบันก่อนที่จะล้มเหลว

และโพสต์ที่เก่าแก่ที่สุดที่ฉันได้พบอ้างเคล็ดลับนี้วันที่กลับไปปี 2003 โดย Tapken

คุณสามารถทดสอบด้วยการตั้งค่าต่อไปนี้:

สร้างเค้าโครงดังนี้:

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

ในparent.phpใส่:

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

ในsub/included.phpใส่:

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

ผลลัพธ์เมื่อเข้าถึงparent.php:

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

อย่างที่เราเห็นในกรณีแรกเส้นทางจะได้รับการแก้ไขจากสคริปต์การโทรparent.phpในขณะที่ใช้dirname(__FILE__).'/path'เคล็ดลับการรวมจะทำจากสคริปต์included.phpที่วางโค้ดไว้

ระวังสิ่งต่อไปนี้ไม่เทียบเท่ากับเคล็ดลับข้างต้นตรงกันข้ามกับสิ่งที่สามารถอ่านได้จากที่อื่น:

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

อันที่จริงการเติมเงินล่วงหน้า/จะใช้งานได้ แต่จะแก้ไขได้เช่นเดียวinclude ../../index.phpกับสคริปต์การโทร (ความแตกต่างคือinclude_pathจะไม่ถูกมองในภายหลังหากล้มเหลว) จาก PHP doc :

หากมีการกำหนดเส้นทาง - ไม่ว่าจะเป็นค่าสัมบูรณ์ (เริ่มต้นด้วยอักษรระบุไดรฟ์หรือ \ บน Windows หรือ / บนระบบ Unix / Linux) หรือสัมพันธ์กับไดเร็กทอรีปัจจุบัน (เริ่มต้นด้วย.


@diEcho: ฉันจะรู้ได้ไหมว่าทำไม "ผิดเต็ม ๆ "? ฉันใช้มันกับแอปพลิเคชั่นระดับมืออาชีพหลายตัวและวิธีนี้เป็นวิธีเดียวที่ใช้ได้ในทุกสถานการณ์ นอกจากนี้ยังมีรายละเอียดใน คู่มือ php : มันไม่ผิด
พูดไม่ออก

บรรทัดแรกผิดทั้งหมด คุณไม่สามารถเพิ่ม..ตรงกลางของเส้นทาง (สัมพัทธ์ / สัมบูรณ์)
diEcho

@diEcho ฉันควรชี้ให้คุณดูคู่มือ PHP: php.net/manual/en/function.include.php
gaborous

บอกฉันตัวอย่างเดียวที่..ใช้ตรงกลางของการรวม ควรเป็นส่วนแรกของการรวม
เสมอ

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/…โมดูลระดับมืออาชีพสำหรับ ERP / CRM ระดับมืออาชีพ คุณไม่ควรพูดเมื่อคุณไม่รู้ว่าคุณพูดอะไร
gaborous

16

../เป็นหนึ่งไดเร็กทอรีทำซ้ำสำหรับสองไดเร็กทอรี../../หรือสาม: ../../../และอื่น ๆ

การกำหนดค่าคงที่อาจลดความสับสนเนื่องจากคุณจะเจาะลึกไปข้างหน้าในไดเร็กทอรีโองการย้อนกลับ

คุณสามารถกำหนดค่าคงที่ได้ดังนี้:

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

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

เมื่อใช้ 'BD' หรือ 'ไดเรกทอรีฐานของฉัน' ดูเหมือนว่า:

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

กำหนด(); เอกสารอ้างอิง




9

ต่อไปนี้เป็นวิธีการเข้าถึงไดเรกทอรีต่างๆของคุณ: -

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

7

คุณสามารถทำได้../../directory/file.txt- สิ่งนี้จะย้อนกลับไปสองไดเรกทอรี

../../../- นี่ไปสาม ฯลฯ



6

แต่ระวังอย่างมากเกี่ยวกับการให้ผู้ใช้เลือกไฟล์ คุณไม่ต้องการอนุญาตให้พวกเขาเรียกไฟล์เช่น

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

หรือไฟล์ระบบที่ละเอียดอ่อนอื่น ๆ

(ขออภัยฉันเป็นผู้ดูแลระบบ linux มาระยะหนึ่งแล้วและฉันคิดว่านี่เป็นไฟล์ที่ละเอียดอ่อนจากที่ฉันจำได้)



5

หากคุณใช้ php7 คุณสามารถใช้ฟังก์ชัน dirname ที่มีพารามิเตอร์ระดับเป็น 2 ตัวอย่างเช่น:

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

พารามิเตอร์ที่สอง "2" ระบุจำนวนเลเวลที่เพิ่มขึ้น

การอ้างอิง dirname



3

รวมถึงไดเรกทอรีมากกว่าสามารถประมวลผลโดยไฟล์พร็อกซี

  • ราก
  • ..... | __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';
    

3

ลองสิ่งนี้

ตัวอย่างนี้คือหนึ่งไดเร็กทอรีกลับ

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

ตัวอย่างนี้คือสองไดเร็กทอรีกลับ

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

มันเหมือนกันทุกประการ ;-) ฉันคิดว่าคุณหมายถึง '../../images/yourimg.png' ในอันที่สอง?
Edwin

opps มันผิดพลาดของฉัน
rajpoot rehan

2

ลอง../../. คุณสามารถแก้ไขได้ตามนี้เนื่องจากจะนำคุณสำรองสองไดเรกทอรี เข้าถึงไดเร็กทอรี root ก่อนจากนั้นเข้าถึงไดเร็กทอรีที่ต้องการ

เช่นคุณอยู่ในและมีไดเรกทอรีอื่นroot/inc/usr/ap root/2nd/pathคุณสามารถเข้าถึงpathไดเร็กทอรีจากapสิ่งนี้: ../../2nd/pathอันดับแรกไปที่ root กว่าไดเร็กทอรีที่ต้องการ หากไม่ได้ผลโปรดแบ่งปัน


2

หากคุณรวมไว้/ที่จุดเริ่มต้นของการรวมการรวมจะถูกใช้เป็นเส้นทางจากรากของไซต์

หากไซต์ของคุณคือhttp://www.example.com/game/forum/files/index.phpคุณสามารถเพิ่มการรวมลงใน /includes/boot.inc.php ซึ่งจะแก้ไขเป็นhttp://www.example.com /includes/boot.inc.php .

คุณต้องระมัดระวังในการ..ข้ามผ่านเนื่องจากเว็บเซิร์ฟเวอร์บางแห่งปิดใช้งาน นอกจากนี้ยังทำให้เกิดปัญหาเมื่อคุณต้องการย้ายไซต์ของคุณไปยังเครื่อง / โฮสต์ใหม่และโครงสร้างแตกต่างกันเล็กน้อย


1

ฉันเห็นคำตอบของคุณและฉันใช้เส้นทางรวมกับไวยากรณ์

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

และเซิร์ฟเวอร์ http (Apache 2.4.3) แสดงข้อผิดพลาดภายใน 500

เมื่อฉันเปลี่ยนเส้นทางเป็น

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

ทุกอย่างปกติดี.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.