Как решить проблему: «Один из файлов на локалке не виден исключительно в корневой директории»?
Всем доброй ночи/утра/дня (надеюсь не вечера) ). Вчера столкнулся с такой вот проблемой: при подключении стороннего файла через include, в любой файл корневого раздела, выводится ошибка - Warning: include(../../app/db/functions.php): failed to open stream: No such file or directory in D:\OpenServer\domains\e-News\app\controllers\categories.php . Изначально грешил на неправильно прописанные пути/доступы, но проблема (насколько я могу судить) не в этом, т.к. пробовал абсолютно все виды указания путей (прямые, относительные, (__DIR__ . ""), проверял path в php.ini ) + права 777 - не видит файл и все! Честно, довольно долго пытался решить проблему, но вообще ума не приложу, что же пыхе не нравится.
P.S.
Возможно помогут некие уточнения - что и вообще и зачем я подключаю:
Задача вывести список категорий в сайд бар, при помощи categories.php, а сам сайд на главную страницу. То-есть изначально нужно было подключить categories.php только в сайд, на нем все прекрасно подключается и отрабатывает, тк находится он не в корне, но если зайти непосредственно на главную, то выводит ошибку подключения. После этого решил попробовать напрямую подключить categories.php на главную и... та дамс - все та же ошибка. Все хорошенько проанализировав, прописал инклюды categories и в другие файлы корневого раздела, и да - не подключается. Из чего можно сделать вывод ,что дело именно в корневом разделе, т.к. categories.php прекрасно подключается в сайд-баре и админке.
Но и это ещё не всё! (C) магазины-впариватели.
Если этот categories.php сам был include-нут из другого файла index.php - то текущей директорией становится директория файла index.php, и ../../ нужно считать уже начиная с директории файла index.php. Понимаешь?
я тоже об этом думал, и даже мог бы согласиться с тем, что ошибка именно в этом. Но у меня вопрос: почему же тогда в других директориях проблем с подключением categories и файлов из него не возникает? В категориях у меня всего один include https://skr.sh/sGzJAyeCDVT . Вот если что, то как я пытаюсь подключить categories.php https://skr.sh/sGzgIEUZ9Io , хотя думаю в ошибке и так был виден вполне корректный путь.
Вот весь пул ошибок на главной - https://skr.sh/sGzHieAPIef
Подключение категорий в файл с сайд-баром https://skr.sh/sGzgjwRdeea и его корректная работа https://skr.sh/sGzpzSav14G
3. В процессе создания вопроса пользователь Сервиса обязан:
3.8. Использовать для демонстрации фрагментов кода только специальный тег < code> или специальные демонстрационные ресурсы (например, JsFiddle - https://jsfiddle.net/). Размещение фрагментов кода в виде изображений запрещено.
Сергей delphinpro, в данном примере, естественно гораздо было бы удобней и практичней вставить по порядку код инклюдов, затем скинуть ссылку на репозиторий, чтобы пользователь ушел с вашего ресурса и посмотрел на структуру моего сайта.
Нет ничего хуже, чем бездумно следовать правилам ради пустой формальности.
AUser0, к сожалению на q&a все слишком любят умничать и при этом нести бред.
То что он не может получить доступ к инклюду внутри категорий указывается в самой ошибке, а точнее в одной из них. В комментарии к вашему ответу мной был задан вопрос: почему же в других директориях не возникает проблем с подключением этого инклюду внутри categories. Этот вопрос вы решили пропустить мимо глаз, по всей видимости от незнания ответа.
define('DIR_ROOT', __DIR__);
// Здесь у вас будет путь D:\OpenServer\domains\e-News
То-есть вы предлагаете вместо предопределенной константы создать свою собственную со значением предопределенной? Как это даже в теории могло бы помочь? И я не ищу решение этой проблемы, мне интересна ее сущность: как и почему она появилась.
TerryBear, Значение __DIR__ зависит от того, в каком файле она вызывается. Я предлагаю определить константу в корневом index и она всегда, во всех подключенных файлах будет указывать на корень вашего сайта.
мне интересна ее сущность: как и почему она появилась.
Это написано в самом тексте ошибки, и я выше помянул: файла по указанному пути нет.
Чтобы убедиться в этом, попробуйте перед проблемным инклудом вывести путь:
var_dump(realpath('../../app/db/functions.php'));
include '../../app/db/functions.php';