เส้นทางสัมพัทธ์ใน require_once ไม่ทำงาน


103

ฉันมีโครงสร้างดังต่อไปนี้

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

ไฟล์ include.php มีดังต่อไปนี้

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';

และในหน้า index.php ฉันได้รวมไว้

require_once 'include/include.php';

เมื่อฉันเปิดหน้า index.php ฉันได้รับคำเตือนและข้อผิดพลาดร้ายแรงต่อไปนี้ ฉันไม่เข้าใจว่าอะไรเป็นสาเหตุของข้อผิดพลาดนี้ เมื่อฉันให้เส้นทางที่แน่นอนมันได้ผล แต่เส้นทางที่แน่นอนไม่ใช่ความคิดที่ดีฉันเชื่อ

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

ขอบคุณล่วงหน้า


ฉันมักจะทำ Objective-C และพยายามที่จะรับมือกับการเขียนสคริปต์ php และเสียใจที่เห็นว่าฉันเสียเวลาไป 2 ชั่วโมงเพื่อหาวิธีรวมไฟล์อย่างถูกต้องใน PHP ทุกอย่างง่ายมากด้วย X-code
rohan-patel

มักจะพบข้อผิดพลาดนี้และเพื่อแก้ไขปัญหาอย่างรวดเร็วให้ทำตามขั้นตอนเหล่านี้: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

คำตอบ:


217

ใช้

__DIR__

เพื่อรับเส้นทางปัจจุบันของสคริปต์และควรแก้ไขปัญหาของคุณ

ดังนั้น:

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

วิธีนี้จะป้องกันกรณีที่คุณสามารถเรียกใช้สคริปต์ PHP จากโฟลเดอร์อื่นได้ดังนั้นพา ธ ญาติจะไม่ทำงาน

แก้ไข: แก้ไขปัญหา slash


42
ระวัง! __DIR__เป็นสิ่งใหม่ใน PHP 5.3 หากคุณต้องการให้สคริปต์นี้ทำงานบน PHP เวอร์ชันก่อนหน้าคุณควรใช้dirname(__FILE__)แทน
Charles

27
__DIR__โปรดทราบว่าคุณด้วยตนเองควรจะรวมถึงเฉือนท้ายหลังจาก ดังนั้น: require_once(__DIR__.'/../class/user.php'); ตามเอกสารประกอบเครื่องหมายทับท้ายจะถูกละเว้นยกเว้นไดเร็กทอรีราก
Ariel Allon

9
ขอบคุณสำหรับความช่วยเหลือ แต่ฉันยังไม่เข้าใจว่าทำไมจึง__DIR__จำเป็น ดูเหมือนว่าเอกสาร PHP จะบอกว่า PHP จะค้นหาไดเรกทอรีของสคริปต์ปัจจุบันตามค่าเริ่มต้น ใครช่วยส่องบ้าง
David

1
@David ฉันคิดว่าสิ่งนี้จำเป็นเมื่อคุณนำเข้าไฟล์จาก 2 ที่ในเวลาเดียวกัน ตัวอย่างเช่นคุณมีไฟล์require "../a.php". หากไฟล์นี้ถูกนำเข้าจากไฟล์อื่น (x) ในdir1/dir2/x.phpไฟล์ที่รวมไว้จะเป็นdir1/a.phpแต่ถ้า x อยู่ในdir1/dir2/dir3/x.phpไฟล์ที่รวมจะเป็นdir1/dir2/a.phpฯลฯ หรือฉันผิด?
JoséRamón

1
ขณะนี้มีรายการตรวจสอบการแก้ไขปัญหาสำหรับข้อผิดพลาดที่พบบ่อยนี้ที่นี่: stackoverflow.com/a/36577021/2873507
Vic Seedoubleyew

17

สำหรับ php เวอร์ชัน 5.2.17 __DIR__จะใช้งานไม่ได้จะใช้ได้กับ php 5.3 เท่านั้น

แต่สำหรับ php รุ่นเก่า dirname(__FILE__)อย่างสมบูรณ์แบบ

ตัวอย่างเช่นเขียนเช่นนี้

require_once dirname(__FILE__) . '/db_config.php';

1

ในกรณีของฉันมันใช้ไม่ได้แม้ว่าจะมี__DIR__หรือgetcwd()เลือกเส้นทางที่ไม่ถูกต้องก็ตามฉันแก้ไขโดยการกำหนด costant ในทุกไฟล์ที่ฉันต้องการด้วยพา ธ ฐานที่แน่นอนของโครงการ:

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

ฉันมี MAMP กับ php 5.4.10 และลำดับชั้นโฟลเดอร์ของฉันเป็นพื้นฐาน:

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

....


0

ฉันเพิ่งเจอปัญหาเดียวกันนี้ซึ่งทุกอย่างทำงานได้ดีจนถึงจุดที่ฉันรวมไว้ในรายการอื่น

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')

โซลูชันที่ 1 (ฮาร์ดโค้ดชื่อโฟลเดอร์ html สาธารณะของฉันที่ไม่ต้องการ แต่ใช้งานได้):

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

โซลูชันที่ 2 (ความคิดเห็นที่ไม่ต้องการด้านบนเกี่ยวกับ DIR ทำงานได้ตั้งแต่ php 5.3 เท่านั้น แต่ใช้งานได้):

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

โซลูชันที่ 3 (ฉันไม่เห็นข้อเสียใด ๆ และทำงานได้อย่างสมบูรณ์ใน php 5.3 ของฉัน):

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