jalur relatif di require_once tidak berfungsi

103

Saya memiliki struktur berikut

otsg
 > class
   > authentication.php
   > database.php
   > user.php
 > include
   > config.inc.php
   > encryption.php
   > include.php
   > session.php
 > index.php
 > registration.php

file include.php memiliki yang berikut ini

ini_set('display_errors', 1);
error_reporting(E_ALL);

ini_set('include_path',ini_get('include_path').':/Applications/MAMP/htdocs/otsg/:');
require_once 'config.inc.php';
require_once '../class/database.php';
require_once '../class/user.php';
require_once 'encryption.php';
require_once 'session.php';
require_once '../class/authentication.php';

dan di halaman index.php telah saya sertakan

require_once 'include/include.php';

Ketika saya membuka halaman index.php saya mendapatkan peringatan berikut dan kesalahan fatal. Saya tidak mengerti apa yang menyebabkan kesalahan ini. Ketika saya memberikan jalur absolut, itu berhasil. Tapi jalan absolut bukanlah ide yang bagus, saya percaya.

Warning: require_once(../class/database.php) [function.require-once]: failed to open stream: No such file or directory in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Fatal error: require_once() [function.require]: Failed opening required '../class/database.php' (include_path='.:/Applications/MAMP/bin/php5.3/lib/php:/Applications/MAMP/htdocs/otsg/include/:') in /Applications/MAMP/htdocs/otsg/include/include.php on line 9

Terima kasih sebelumnya

pengguna525146
sumber
Saya biasanya melakukan Objective-C dan mencoba untuk mendapatkan skrip php dan sedih melihat saya telah membuang waktu 2 jam untuk mencari tahu bagaimana memasukkan file dengan benar di PHP. Segalanya menjadi sangat mudah dengan X-code.
rohan-patel
Seseorang sering mengalami kesalahan ini, dan untuk memecahkan masalahnya dengan cepat, ikuti langkah-langkah berikut: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

Jawaban:

216

Menggunakan

__DIR__

untuk mendapatkan jalur skrip saat ini dan ini akan memperbaiki masalah Anda.

Begitu:

require_once(__DIR__.'/../class/user.php');

Ini akan mencegah kasus di mana Anda dapat menjalankan skrip PHP dari folder yang berbeda dan oleh karena itu jalur kerabat tidak akan berfungsi.

Edit: masalah garis miring diperbaiki

Raisen
sumber
42
Awas! __DIR__baru di PHP 5.3. Jika Anda membutuhkan skrip ini untuk dijalankan pada versi PHP sebelumnya, Anda harus menggunakan dirname(__FILE__).
Charles
27
Perhatikan bahwa Anda harus memasukkan garis miring setelahnya secara manual __DIR__. Jadi: require_once(__DIR__.'/../class/user.php'); Sesuai dokumentasi , garis miring di akhir dihilangkan kecuali untuk direktori root.
Ariel Allon
9
Terima kasih atas bantuannya, tapi saya masih tidak mengerti mengapa __DIR__perlu. Dokumen PHP tampaknya mengatakan bahwa PHP akan mencari direktori skrip saat ini secara default. Adakah yang bisa menjelaskan?
David
1
@David Saya rasa ini diperlukan saat Anda mengimpor file dari 2 tempat pada waktu yang sama. Misalnya, Anda memiliki file dengan require "../a.php". Jika file ini diimpor dari file lain (x) dir1/dir2/x.phpmaka file yang akan disertakan dir1/a.php, tetapi jika x ada dir1/dir2/dir3/x.php, file yang disertakan akan dir1/dir2/a.php, dll. Ataukah saya salah?
José Ramón
1
Sekarang ada daftar periksa pemecahan masalah untuk kesalahan yang sering terjadi ini di sini: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew
17

untuk php versi 5.2.17 __DIR__tidak akan bekerja itu hanya akan bekerja dengan php 5.3

Tapi untuk versi php yang lebih lama dirname(__FILE__)dengan sempurna

Misalnya tulis seperti ini

require_once dirname(__FILE__) . '/db_config.php';
Teknologi Seluler.
sumber
1

Dalam kasus saya itu tidak berfungsi, bahkan dengan __DIR__atau getcwd()terus memilih jalur yang salah, saya menyelesaikannya dengan menentukan costant di setiap file yang saya butuhkan dengan jalur dasar absolut proyek:

if(!defined('THISBASEPATH')){ define('THISBASEPATH', '/mypath/'); }
require_once THISBASEPATH.'cache/crud.php';
/*every other require_once you need*/

Saya memiliki MAMP dengan php 5.4.10 dan hierarki folder saya adalah basilar:

q.php 
w.php 
e.php 
r.php 
cache/a.php 
cache/b.php 
setting/a.php 
setting/b.php

....

linuxatico.dll
sumber
0

Saya baru saja menemukan masalah yang sama ini, di mana semuanya berfungsi dengan baik, sampai saya memiliki masukan di bagian lain.

require_once '../script/pdocrud.php';  //This worked fine up until I had an includes within another includes, then I got this error:
Fatal error: require_once() [function.require]: Failed opening required '../script/pdocrud.php' (include_path='.:/opt/php52/lib/php')

Solusi 1. (hardcode yang tidak diinginkan dari nama folder html publik saya, tetapi berhasil):

require_once $_SERVER["DOCUMENT_ROOT"] . '/orders.simplystyles.com/script/pdocrud.php';

Solusi 2. (komentar yang tidak diinginkan di atas tentang DIR hanya berfungsi sejak php 5.3, tetapi berhasil):

require_once __DIR__. '/../script/pdocrud.php';

Solusi 3. (Saya tidak dapat melihat kerugian apa pun, dan ini berfungsi dengan sempurna di php 5.3 saya):

require_once dirname(__FILE__). '/../script/pdocrud.php';
hamish
sumber