За последние 24 часа нас посетил 17891 программист и 1610 роботов. Сейчас ищут 940 программистов ...

Инклуды

Тема в разделе "PHP для новичков", создана пользователем IgorZ, 12 янв 2015.

  1. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Пожалуйста, не кидайтесь сразу какахами и не посылайте в rtfm (хотя наверное туда и дорога :) )

    Собирал я свой велосипед на апаче под виндой, в вроде бы всё работало, но появилась необходимость перенести его не бесплатный хостинг, а следовательно под линукс, где мне стало ругаться на мои инклуды, которые я писал ввиде include '/../folder/file.php' - т.е. выйти на 1 папку назад, в ней зайти в folder и тд.
    Код пишу для себя, он может быть индийским, вообщем как есть :)
    Почитав маны (или это были не маны :) ), я понял что мне надо инклуды параписывать ввиде:
    include './folder1/file1.php' - это если я хочу в текущей папке перейти в folder1...
    include '../folder2/file2.php' - это если мне надо вернуться на 1 папку ниже.
    Вроде-бы пока правильно ?
    Тогда вопрос. Вот структура (чисто теоретически):

    root/index.php
    root/login.php
    root/folder/data.php
    root/config/conf.php

    Открывается login.php с кнопкой, при нажатии вызывается data.php внутри которой инклудится conf.php
    т.е. в data.php: include '../config/conf.php' - из папки дата я выхожу на 1 назад, дальше захожу в config. Почему не срабатывает ? А срабатывает только если
    или include './config/conf.php' (почему ? я же вроде из папки data вызываю)
    или include '/../config/conf.php' (это я так понимаю что ниже рута не опускается просто и потом идёт вверх)
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    есть путь /path/to/file.php
    внутри этого файла:
    ./ = /path/to
    ./elif.php = /path/to/elif.php
    ../ = /path
    ../ot = /path/ot
    ../../ = /
    и так далее
    НО
    в половине твоих ссылок первым символом идет слеш - это ты указываешь абсолютный путь от корня файловой системы. поэтому файл и не находится.
     
  3. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    /path/folder/login.php
    внутри
    ../config/conf.php (/path/config/conf.php) <- так не видит. (видит если ./config/conf.php)

    Там же рядом лежит второй файл
    /path/folder/show_login.php
    внутри
    ../config/check.php (/path/config/check.php) <- видит
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    /path/folder/login.php и вызов из него ./config/conf.php
    слева направо
    дот-слеш = каталогу содержащему текущий файл (логин). этот каталог /path/folder
    относительно него путь "кофниг/конф.пхп" = /path/folder/config/conf.php

    не понял что значит там же рядом. очевидная неоднозначная формулировка. ну да ладно
    /path/folder/show_login.php и путь ../config/check.php
    дот-дот-слеш - родительский каталог каталога содержащего текущий файл. дот-слеш у нас /path/folder значит ../ указывает на /path
    и в нем config/check.php то есть /path/config/check.php

    вопрос-то какой?
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Может он не понимает, что путь нужно писать относительно первого загруженного файла?

    Есть файлы:
    /www/index.php
    /www/conf/default.php
    /www/conf/dev.php

    index.php <-первый загружаемый
    Код (PHP):
    1. include './conf/default.php';
    default.php
    Код (PHP):
    1. include './conf/dev.php'; // отсчитываем от папки /www, так как index.php в ней  
    dev.php
    Код (PHP):
    1. echo $_SERVER['PHP_SELF'];
     
  6. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Возможно. Постараюсь ещё раз.

    У меня есть 3 пути:
    1.
    /path/index.php

    2.
    /path/config/conf.php
    /path/config/check.php

    3.
    /path/folder/login.php
    /path/folder/show_login.php

    В login.php я хочу подключить conf.php и делаю:
    include '../config/conf.php' (и если я так делаю то его не видно - методом тыка если я сделаю ./config - то его будет видно)

    В show_login.php я подключаю check.php
    include '../config/check.php' (ошибок нет - подключает)

    Может быть проблема из-за того что у меня login.php вызывается из index'a который лежит уровнем ниже ? (моё предположение)
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    понятно. рекомендую познакомиться с константой __DIR__
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и __FILE__ и basepath()
     
  9. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Спасибо, почитаю.

    Добавлено спустя 9 минут 50 секунд:
    Ещё вопрос по этой же теме.
    Если с php ясно, а как насчёт css. Можно ли в нём оставить такие пути как есть ? Линукс не будет ругаться на такие ?
    Код (Text):
    1.  
    2. .tcalInput {
    3.     background: url('/../img/simple-calendar/cal.gif') 100% 50% no-repeat;
    4. }
    Это из разряда "скачал и подключил". Не моих рук дело :)
     
  10. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    А ты попробуй, отсчёт / идёт от корня домена
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Линукс к цсс никакого отношения не имеет.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    дайте ему ссылку на статью "на танке"
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  14. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Ну ладно-ладно. rtfm, как говорится :)
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну ты глянь, там всё доступно расписано ж
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    http://phpfaq.ru/paths
    а вот чего там нет:
    в PHP файле относительные пути расчитываются от текущей папки.
    для php-cgi и mod_php текущая папка это папка с первым подключенным php (точка входа).
    в php-cli текущая папка это текущая папка процесса, который открыл файл, то есть любая )))

    в CSS файле относительные пути расчитываются относительно этого самого CSS файла.

    вот так '/../' неправильно, правильно так: '../' или так '/чтототам/еще/../иеще'

    в PHP есть разница между
    include 'path/to/file.php' и
    include './path/to/file.php'
    в первом случае указанный путь будет подклеиваться ко всем сегментам настройки include_path, пока не найдется файл.
    во втором случае incude_path игнорируется, путь расчитывается один раз от текущей папки.
     
  17. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Ага. То есть, если на примере дира, то я должен у себя сделать к примеру так:

    Код (Text):
    1. include __DIR__ . "/" (добавить слеш, т.к. дир возвращает без него) . "../config/conf.cfg";
    2.  
    3. Либо, как я понимаю, через:
    4. $dr = $_SERVER['DOCUMENT_ROOT'];
    5. include $dr . '/config/conf.php';
    В любом случае большое спасибо.
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    для сайта с точкой входа в корневой папке (сайта), DocumentRoot совпадает с текущей папкой. то есть
    Код (Text):
    1. $dr = $_SERVER['DOCUMENT_ROOT'];
    2. include $dr . '/config/conf.php';
    аналогично
    Код (Text):
    1. include './config/conf.php';
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    когда ты пишешь не относительный путь - он у тебя начинает считать от разных точек. artoodetoo уже показал примеры.
    ключ DOCUMENT_ROOT суперглобального массива _SERVER доступен не во всех версиях SAPI. например в консольном его не может быть просто как факт.
    более универсальный путь (имхо) - использовать константу __DIR__ для фиксации "текущего каталога текущего файла" и уже относительно этого пути ходить вверх-вниз по иерархии которую видим - будет работать во всех случаях. даже с символическими ссылками корректно работает.

    Добавлено спустя 2 минуты 41 секунду:
    вот к этой мысли тоже свои пять копеек вставлю. если используется какой-то общий файл, который вызывается из многих точек входа - через __DIR__ . '/../../../path/to/common.php' находим этот общий файл а в нем объявляем define('ROOT', __DIR__); и всё остальное приложение уже может спокойно отталкиваться от этого рута.
     
  20. IgorZ

    IgorZ Новичок

    С нами с:
    23 дек 2014
    Сообщения:
    11
    Симпатии:
    0
    Понял. Надеюсь :)
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    DOCUMENT_ROOT может не совпадать с точкой входа, да.