За последние 24 часа нас посетил 194031 программист и 2149 роботов. Сейчас ищут 2230 программистов ...

Вопрос о include

Тема в разделе "PHP для новичков", создана пользователем klon5555, 9 янв 2012.

  1. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Сразу скажу что для своего сайта использую денвер.
    Так вот. Команда:
    PHP:
    1. <?include("/file.txt");?>
    возвращает скрипт в самый home каталог.
    можно ли как-то изменить это? что-бы возвращало в корневую папку сайта
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Тебе нужно использовать относительные пути. Структуру файлов и папок проекта ты всегда знаешь. Если тот, кто будет устанавливать себе и использовать твою программу возьмёт и поменяет структуру папок - это уже его проблемы.

    Например, скрипт лежит в папке /site/blocks относительно корневой папки сайта. А в корневой лежит некий file.php, который тебе нужно инклудить. Тогда:

    PHP:
    1. <?php
    2. // Определяешь абсолютный путь скрипта, который что-то инклудит
    3. $path = dirname(__FILE__);
    4. // Определяешь путь к корневой папке сайта. Ты же знаешь, что
    5. // этот твой скрипт лежит в папке /site/blocks - значит ты знаешь,
    6. // что тебе нужно подняться на 2 уровня вверх, чтобы добраться
    7. // до корневой папки. Тогда путь к корню сайта определяется так
    8. $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..');
    9. // Теперь можешь инклудить скрипт из корневой папки
    10. include($rootPath . DIRECTORY_SEPARATOR . 'file.php');
    11.  
    12. // DIRECTORY_SEPARATOR - используется для "кросс-серверности", чтобы
    13. // никак не зависеть от ОС сервера. В большинстве случаев достаточно
    14. // использовать просто символ / , но на винде может не работать.
    15. ?>
     
  3. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Вот как раз хотелось бы расставить в шаблоне инклуды, что-бы они были одинаковы но работали в любом удалении от корня.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Без / попробуй
     
  5. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    igordata а толку? Это укажет на находящуюся в этой же папке файл(или выше по уровням)
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не понимаю, чего ты хочешь? Чтобы не зависимо от того, в какой директории лежит некий файл (и ты не знаешь заранее, в какой директории он лежит) можно было его инклудить? Ну, или из него что-либо инклудить? ИМХО, оба варианта - это бред, структура папок программы заранее извествна всегда, ты же сам её придумываешь, когда пишешь.

    Можешь попробовать поэкспериментировать с set_include_path()
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Не всегда. Авторам фреймворков/библиотек неизвестно, в куда запихнут их код (а требовать, что в /lib - глупо). Поэтому,
     
  8. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    [vs], получается
    PHP:
    1.  <?php
    2.  // Определяешь абсолютный путь скрипта, который что-то инклудит
    3.  $path = dirname(__FILE__);
    4.  // Определяешь путь к корневой папке сайта. Ты же знаешь, что
    5.  // этот твой скрипт лежит в папке /site/blocks - значит ты знаешь,
    6.  // что тебе нужно подняться на 2 уровня вверх, чтобы добраться
    7.  // до корневой папки. Тогда путь к корню сайта определяется так
    8.  $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..');
    9.  // Теперь можешь инклудить скрипт из корневой папки
    10.  include($rootPath . DIRECTORY_SEPARATOR . 'file.php');
    11.  
    12.  // DIRECTORY_SEPARATOR - используется для "кросс-серверности", чтобы
    13.  // никак не зависеть от ОС сервера. В большинстве случаев достаточно
    14.  // использовать просто символ / , но на винде может не работать.
    15.  ?>
    это то что я ищу?

    При использовании всеравно получаю:
    [sql] include(/design/head.txt) [function.include]: failed to open stream: No such file or directory in КОРЕНЬ САЙТА\panel\index.php on line 8[/sql]
    ну а 8 линия это собственно и есть инклуд
    PHP:
    1. include($rootPath . DIRECTORY_SEPARATOR . 'design/head.txt');
    При использовании обычного инклуда в корневом файле ошибки не наблюдается
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А какая разница куда их запихнут? Хоть в /fkdsjfl/asdfa/addwd/sdadad/asfdas.......
    Библиотека же не должна инклудить что-то внешнее, это её должны инклудить, на сколько я понимаю. С фреймворками мне кажется, так же. Они инклудят "свои файлы", которые все лежат вот в этом "/fkdsjfl/asdfa/addwd/sdadad/asfdas". И всё что там лежит - имеет такую структуру папок и файлов, которую задумал разработчик этой библиотеки или фреймворка. Соответственно, в любом скрипте можно определить путь к файлу данного скрипта (dirname(__FILE__)) и уже относительно него - инклудить то, что нужно.

    На счёт именно фреймворков, конечно, не уверен на 100%, может фреймворк и должен инклудить какие-то "внешние" для него файлы, которых в нём самом нет, которые дописывает тот, кто пользуется этим фреймворком. Но всё равно тогда нужно ведь либо как-то указать этому фреймворку, откуда брать эти файлы, либо использовать его структуру.
     
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    klon5555
    1) Тот скрипт, из которого ты хочешь проинклудить "design/head.txt" - где лежит? Относительно корня сайта.
    2) Папка "design" - в корне сайта?
     
  11. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Вообщем так.
    Изанчально инклуд возвращает в home
    сверху находится структура вроде /[динамический IP]/www/корень
    нужно что-бы он возвращал в корень
    папка design лежит в этом самом корне
    и содержит все инклуды для шаблона

    скрипт из которого инклуд будет происходить лежит в корень/panel
    НО. Возможно ли сделать что-бы 1 шаблон с инклудами мог номрально инклудится в любом удалении от корня сайта?
    Т.е. не важно от куда исполняется инклуд.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Я про другое сейчас спросил.

    Тот скрипт, в котором ты пишешь include(что-то там) - он где находится? Относительно корня сайта.
     
  13. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Добавил чуть раньше в прошлый пост

     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Не понял этой фразы.
    И, мне кажется, ты меня тоже не понял.

    Вот у тебя есть
    корень/panel/script1.php

    И из него ты хочешь проинклудить что-либо. Тогда в нём ты пишешь:

    // определяешь путь к script1.php, т.е. это "ip/www/корень/panel"
    $path = dirname(__FILE__);
    // теперь ты определяешь путь к корню - "ip/www/корень"
    $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..');
    // теперь ты знаешь путь к корню. Инклудишь всё что хочешь:
    include($rootPath . DIRECTORY_SEPARATOR . 'design' . DIRECTORY_SEPARATOR . 'head.txt');

    Допустим, у тебя есть ещё какой-то скрипт
    корень/panel/folder/script2.php

    И из него ты тоже хочешь проинклудить что-либо. Тогда в нём ты пишешь:

    // определяешь путь к script2.php, т.е. это "ip/www/корень/panel/folder"
    $path = dirname(__FILE__);
    // теперь ты определяешь путь к корню - "ip/www/корень"
    $rootPath = realpath($path . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..');
    // теперь ты знаешь путь к корню. Инклудишь всё что хочешь:
    include($rootPath . DIRECTORY_SEPARATOR . 'design' . DIRECTORY_SEPARATOR . 'head.txt');

    Из script1.php достаточно подняться на 1 уровень выше, чтобы оказаться в корневой папке.
    Из script2.php нужно подняться на 2 уровеня выше, чтобы оказаться в корневой папке.

    И, собственно, всё.
     
  15. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Ладно уж. Видимо то что я хочу - невыполнимо. Спасибо вам и на этом:)
    Я хотел что-бы именно одинаковый код инклуда мог выполнятся в любом удалении от корня.
     
  16. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Можешь просто хранить все скрипты, к которым идёт обращение из браузера (т.е. которые не инклудятся какими-то скриптами, а именно которые запускаются первыми при запросе к серверу, которые из браузера запрашиваются) в одной папке - например в корне. И в них определять переменную $rootPath. Если скрипт лежит в корне, то путь к корневой папке сайта определится просто как

    $rootPath = dirname(__FILE__);

    Ну а дальше инклудь всё что надо. Определение этого пути тогда везде будет одинаковым.

    Переменная $rootPath будет видна и во всех остальных скриптах, которые ты будешь инклудить. Где бы они не находились :)
     
  17. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Думаю вопрос можно считать решенным. Уровней не так много, потерплю :p
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Можешь в .htaccess или php.ini ещё присвоить параметру include_path нужное значение (путь к папке design) и писать просто

    include('head.txt');
     
  19. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    А можете по поподробнее об этом?
    Как это будет выглядеть в .htaccess
     
  20. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    php_value include_path .:/ip/www/корень/design
     
  21. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Но может не сработать - зависит от настроек хостинга. Если ip - динамический IP (меняется) - то не знаю, как сделать. Может кто-то ещё знает и посоветует.
     
  22. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    как вариант - при запуске сервера использовать батник, который впишет текущий ип в htacces

    но что-то я указал строчку в htacces с текущим IP и ошибка:
    [sql]Warning: include(head.php) [function.include]: failed to open stream: No such file or directory in Z:\home\ИП\www\panel\index.php on line 6

    Warning: include() [function.include]: Failed opening 'head.php' for inclusion (include_path='.:/ИП/www/design/') in Z:\home\ИП\www\panel\index.php on line 6[/sql]
    ИП - текущий ип
     
  23. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    так и не вкурил, что конкретно надо, может быть поможет
    PHP:
    1. <?php
    2. set_include_path(get_include_path() . PATH_SEPARATOR . $_SERVER['DOCUMENT_ROOT']);
    и помни что если используем include_path, имя подключаемого файла не должно содержать пути (никаких точек или слешей в начале).
     
  24. klon5555

    klon5555 Активный пользователь

    С нами с:
    11 дек 2010
    Сообщения:
    74
    Симпатии:
    0
    Ухты. А ведь действительно работает :)
     
  25. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Для Windows:
    php_value include_path .;Z:\home\ИП\www\design

    Кроме того, обработка файлов .htaccess должна быть разрешена в конфиге Apache.
    Я думал там на хостинге.

    Про
    $_SERVER['DOCUMENT_ROOT']
    тоже как-то не подумал, забыл вообще о существовании такой переменной...