Geri 2 dizinden fazla bir dosyayı nasıl ekleyebilirim?


96

Geriye 2'den fazla dizin olan bir dosyayı nasıl dahil edersiniz? ../index.phpGeriye 2 dizin olan bir dosyayı eklemek için kullanabileceğinizi biliyorum , ancak bunu 3 dizin için nasıl yaparsınız? Bu mantıklı mı? Denedim .../index.phpama çalışmıyor.

/game/forum/files/index.phpİçinde bir dosyam var ve bir dosya eklemek için PHP include kullanıyor. İçinde bulunan /includes/boot.inc.php; /kök dizin olmak.


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

Yanıtlar:


154

..mevcut dizinden üst dizini seçer. Tabii ki, bu zincirlenebilir:

../../index.php

Bu iki dizin olacaktır.


1
@Brian Pekala, bu çok saçma, elma ve portakalları karşılaştırıyorsun. defineBurada a'nın kullanılacağı konusunda haklısınız, ancak (1) buradaki soru uzaktan bile değildi. Ve (2) define, tüm mutlak sunucu yolunu gerçekten sabit kodlamadıkça ve sadece dezavantajları olduğu için bundan kaçınırım. Veya (üçüncü alternatif), ana dizini (genişletilmiş) mevcut yoldan ayıklamak için dize işlemeyi kullanabilirsiniz, ancak bir kez daha bunun göreli yolları kullanmanın herhangi bir avantajı yoktur.
Konrad Rudolph

Maalesef bu bir cihazda çalışıp başka bir cihazda çalışmayabilir, /../çalışabilir veya ../çalışabilir veya ikisi de aynı ortam kurulumuna sahip üç farklı bilgisayarda çalışmayabilir
Douglas Gaskell

@DouglasGaskell Hayır, bu yanlış. ../Ve ../../(not: baştaki eğik çizgi yok !) Dahil göreli yol gösterimi tüm modern işletim sistemlerinde çalışır. Bu alışık değil Windows üzerinde çalışması ve ( uzun önce) Macintosh ama şimdi her yerde çalışır ve en az son on yıldır var. Bir yerde çalışmazsa, bunun nedeni dosya yapısının farklı olması ve / veya farklı bir çalışma dizininde olmanızdır. Ancak bu kodla alakası yok.
Konrad Rudolph

Konrad, bundan 10 dakika önce bir depoyu bir iş arkadaşımla bir sanal makine anlık görüntüsü kullanarak paylaştıktan sonra bu sorunu ele aldığım için söz ediyorum. Bazı nedenlerden dolayı , çevresi /../yerine tüm yolların olması gerekiyordu ../.
Douglas Gaskell

@DouglasGaskell Ve size hatanın alakasız olduğunu güvenle söyleyebilirim. Aslında, yol /../herhangi bir sistem için hiçbir anlam ifade etmiyor ( /ya da bir hataya eşdeğerdir ). Önüne bir şey yapıştırmadığına emin misin ?
Konrad Rudolph

51

Bir dosyayı bir dizin geriye eklemek için '../file'. Geri iki dizin için kullanın '../../file'. Ve bunun gibi.

Bununla birlikte, gerçekçi bir şekilde, geçerli dizine göre dahil etme işlemi yapmamalısınız. Ya o dosyayı taşımak istersen? Tüm bağlantılar kopacaktı. Dosyanızı taşırsanız bu bağlantıları korurken diğer dosyalara bağlanabilmenizi sağlamanın bir yolu şudur:

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

DOCUMENT_ROOT kodunuzun içinde bulunduğu temel dizini temsil eden bir sunucu değişkenidir.


2
Hey Dan hızlı soru: " gerçekçi bir şekilde, mevcut dizine göre içerik eklememelisiniz " diyorsunuz . Çoğu HTML belgesinde dağınık olan tüm göreli yollar ne olacak? Dosyamı taşırsam, onlar da kırılmaz mı? Göreli ve mutlak bağlantıların ne zaman kullanılacağına dair bir standart var mı? Şimdiden teşekkür ederim!
Govind Rai

2
bir bölü çizgisi eksik olduğunu düşünüyorum, şu olmalıdır: required_once ($ _ SERVER ['DOCUMENT_ROOT']. '/ dizin / dizin / dosya');
user889030

@ user889030 bildiğim kadarıyla, bu eğik çizgiye gerek yok, en azından çoğu durumda
BotMaster3000


28
. = current directory
.. = parent directory

Böylece ../size iki değil bir dizin geri alır .

../2 veya daha fazla seviye yukarı çıkmak için gerektiği kadar zincir yapın .


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

buradaki en iyi bahsinizdir ve diğer çözümlerde karşılaşabileceğiniz göreceli yol hatalarının çoğunu önleyecektir.

Aslında, dahil etmeyi her zaman bu kodun yerleştirildiği geçerli betiğin konumuna göre zorlayacaktır (uygulamanızın mimarisini tanımladığınız için büyük olasılıkla hangi konum kararlıdır). Bu, sadece include '../../index.php' yürütme (aynı zamanda "çağırma" olarak da adlandırılır) komut dosyasını ve ardından , dahil ettiğiniz komut dosyasının yolundan çözümlemek yerine, komut dosyanızı içeren ana komut dosyasını gösterecek olan mevcut çalışma dizinine göre farklıdır. .

PHP belgelerinden:

Dosyalar, verilen dosya yoluna göre dahil edilir veya hiçbiri belirtilmezse, belirtilen include_path. Dosya include_path içinde bulunamazsa, include sonunda başarısız olmadan önce çağıran komut dosyasının kendi dizinini ve geçerli çalışma dizinini kontrol eder.

Ve bu numaraya atıfta bulunarak bulduğum en eski gönderi , Tapken tarafından 2003 yılına dayanıyor .

Aşağıdaki kurulumla test edebilirsiniz:

Bunun gibi bir düzen oluşturun:

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

In parent.phpkoymak:

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

In sub/included.phpkoymak:

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

Erişirken elde edilen sonuç parent.php:

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

Gördüğümüz gibi, ilk durumda, yol çağıran komut dosyasından çözümlenirken parent.php, dirname(__FILE__).'/path'hile kullanılarak dahil etme, included.phpkodun yerleştirildiği komut dosyasından yapılır .

Dikkat edin, aşağıdakiler başka yerlerde okunabileceklerin aksine yukarıdaki hile ile eşdeğer DEĞİLDİR:

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

Aslında, önceden harcama /işe yarayacaktır, ancak tıpkı include ../../index.phpçağıran komut dosyasındaki gibi çözülecektir ( aradaki fark, include_pathbaşarısız olursa daha sonra bakılmayacak olmasıdır). PHP dokümanından :

Bir yol tanımlanırsa - ister mutlak (Windows'ta bir sürücü harfiyle veya \ ile veya Unix / Linux sistemlerinde / Unix / Linux sistemlerinde) veya mevcut dizine göre (. Veya .. ile başlayan) - include_path tamamen yok sayılır.


@diEcho: Neden "tamamen yanlış" olduğunu öğrenebilir miyim? Birkaç profesyonel sınıf uygulamasında kullanıyorum ve bu yöntem aslında her durumda işe yarayan tek yöntemdir. Ayrıca php kılavuzunda da ayrıntılı olarak açıklanmıştır : o kadar yanlış olamaz.
gaborous

ilk satır tamamen yanlış. ..Yolun ortasını ekleyemezsiniz (göreceli / mutlak).
diEcho

@diEcho Sizi PHP kılavuzuna da yönlendirmeliyim: php.net/manual/en/function.include.php
gaborous

İçerme ..işleminin ortasında kullanılan tek bir örnek söyle . her zaman dahil etmenin ilk kısmı olmalıdır
diEcho

github.com/lrq3000/dolibarr_customfields/blob/3.2/htdocs/… Profesyonel düzeyde bir ERP / CRM için profesyonel düzeyde bir modül. Siz bayım, ne söylediğinizi bilmediğinizde konuşmamalısınız.
gaborous

16

../bir dizindir, iki dizin için tekrarlayın ../../veya üç: ../../../vb.

Sabitleri tanımlamak kafa karışıklığını azaltabilir çünkü dizinler arasında geriye doğru ayrıntılara gireceksiniz.

Bazı sabitleri şöyle tanımlayabilirsiniz:

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

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

"BD" yi veya "temel dizin" i kullanırken şöyle görünür:

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

tanımlamak(); referans



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

Her bir örnek, ../bir dizin yukarı / geri anlamına gelir.


9

farklı dizinlere erişmenin yolları aşağıdadır: -

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

7

Yapabilirsiniz ../../directory/file.txt- Bu iki dizin geriye gider.

../../../- bu üçe gider. vb



7

php7 kullanıyorsanız, dirname işlevini 2 düzey parametresi ile kullanabilirsiniz, örneğin:

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

ikinci parametre "2", kaç seviye atladığını gösterir

dizin adı referansı


6

Ancak bir kullanıcının dosyayı seçmesine izin verirken ÇOK dikkatli olun. Örneğin, adında bir dosya almalarına gerçekten izin vermek istemezsiniz.

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

veya diğer hassas sistem dosyaları.

(Üzgünüm, linux sistem yöneticisi olduğumdan bu yana uzun zaman geçti ve sanırım bu, hatırladığım kadarıyla hassas bir dosya)




4

Bunu dene

bu örnek geriye bir dizin

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

bu örnek iki dizin geri

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

Tam olarak aynı ;-) Sanırım ikincisinde '../../images/yourimg.png' demek istiyorsun?
Edwin

opps bu benim hatam
rajpoot rehan

3

dahil olmak üzere dizinler proxy dosyası ile işlenebilir

  • kök
  • ..... | __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

Deneyin ../../. Sizi iki dizine geri götüreceğinden buna göre değiştirebilirsiniz. Önce kök dizine, ardından gerekli dizine erişin.

Örneğin, içeridesiniz root/inc/usr/apve başka bir dizin var root/2nd/path. pathDizine şu şekilde erişebilirsiniz ap: ../../2nd/pathönce istediğiniz dizinden kök dizinine gidin. Çalışmıyorsa lütfen paylaşın.


2

dahil etmenin /başına eklerseniz , içerme, sitenin kökünden gelen yol olarak alınacaktır.

siteniz http://www.example.com/game/forum/files/index.php ise, /includes/boot.inc.php'ye http: //www.example.com'a çözümlenecek bir ekleme ekleyebilirsiniz. /includes/boot.inc.php .

..Bazı web sunucularında devre dışı bırakıldığı için geçiş konusunda dikkatli olmalısınız ; sitenizi yeni bir makineye / ana bilgisayara taşımak istediğinizde de sorunlara neden olur ve yapısı biraz farklıdır.


1

Cevaplarınızı gördüm ve sözdizimi içeren yolu dahil ettim

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

ve http sunucusu (Apache 2.4.3) dahili 500 hatası döndürdü.

Yolu değiştirdiğimde

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

herşey yolunda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.