Как выяснить неудачу include?

black_raven

Новичок
Как выяснить неудачу include?

include ($url);
Допустим что по $url не обнаружилось фаила. Могу я заменить сообщение об ошибке своим текстом (типа include ($url) or die ("Мой текст");)?
 

$cooter

Новичок
Код:
if (file_exists($filename)) {
   include($filename);
} else {
   echo "The file $filename does not exist";
}
 

Andreika

"PHP for nubies" reader
убираем доступ к файлу (chmod или на ntfs) - файл (file_exists) есть, а include не работает :)
 

zarus

Хитрожопый макак
PHP:
if (file_exists($filename)) {
   if (is_readable($filename)) {
      include($filename);
   }
   else {
      echo "The file $filename cannot be read";
   }
} else {
   echo "The file $filename does not exist";
}
Можно сразу поставить проверку на is_readable, но тогда ты не узнаешь, почему файл не инклюдится. Если этого не нужно, то лучше ставить сразу 2ю проверку.
Можно также с помощью
PHP:
if (include $filename != 'OK') {
   echo "The file $filename cannot be included";
}
 

white phoenix

Новичок
ржунимагу...
1. file_exists("/usr/bin") == TRUE, т.е. функция не различает папки и файлы
2. is_readable аналогично.
вводим туда "." без кавычек и наблюдаем warning в include().
PHP:
if (is_file($filename)) 
{
  if (is_readable($filename)) {include($filename);} 
  else {echo "The file $filename cannot be readed";} 
}
else {echo "The file $filename does not exist";}
спасибо за то что слегка подняли настроение.
 

zarus

Хитрожопый макак
Автор оригинала: white phoenix
ржунимагу...
1. file_exists("/usr/bin") == TRUE, т.е. функция не различает папки и файлы
2. is_readable аналогично.
вводим туда "." без кавычек и наблюдаем warning в include().
PHP:
if (is_file($filename)) 
{
  if (is_readable($filename)) {include($filename);} 
  else {echo "The file $filename cannot be read";} 
}
else {echo "The file $filename does not exist";}
спасибо за то что слегка подняли настроение.
Согласен, ступил, но это уже дело того, кто делает сайт пытаться инклюдить каталоги :)
 

white phoenix

Новичок
Макс
я и указал в примере is_file
zarus
советую прочесть первый пост... там $url, мне почему-то кажется что $filename задает пользователь.
 

Royal Flash

-=MaestrO=-
Если посетитель задает переменную $url, это плохо... Чтобы не возникло проблем с инклудами злонамеренных пользователей своих PHP скриптов в Ваш скрипт, необходимо все имена файлов, доступных include держать в базе (или файле) и проверять сразу, имеется ли файл с именем $url в базе.
 

white phoenix

Новичок
Royal Flash
зачем? достаточно фильтровать $url убирая дескрипторы, спец. символы и проверять через file_exists существование файла.
 

Royal Flash

-=MaestrO=-
white phoenix
21.11.05 16:39
ржунимагу...
1. file_exists("/usr/bin") == TRUE, т.е. функция не различает папки и файлы

22.11.05 13:49
и проверять через file_exists
Вы сами себе противоречите :)

Впринципе, согласен, можно фильтровать данные таким образом, чтобы не пропустить ссылки на другой хост и не допустить образования ошибки, только ведь это будет, хоть и не большой, но всеже, дополнительный код, что на мой взгляд будет приводить к лишней трате процессорного времени сервера и добавлять лишней работы разработчику. Гораздо проще работать с базой, всего 2 проверки и один запрос:

PHP:
// Ограничить длинну возможной ссылки
$url = substr($url, 0, 64);
// Прослешить данные пользователя
$url = mysql_real_escape_string($url);
// Зарос к базе
$sql = 'SELECT file FROM table WHERE url = "'.$url.'"';
Если результат запроса = 1, то все ок, иначе exit();
 

white phoenix

Новичок
Royal Flash
> Вы сами себе противоречите
нет, подумай еще раз :)
>
имхо, так хуже.
 

zarus

Хитрожопый макак
Проверка is_file | is_readable явно дает нагрузку на файловую систему, особенно, если одновременно очень много файлов и юзеров. Тут скорее мое незнание вопроса - как реализован алгоритм этих функций.

Вариант с базой файлов будет более удобным, если
1. Базу реализовать таблицей типа HEAP, если запросы довольно частые
2. Заполнять базу скриптом (при перезапуске сервера) и обновлять по расписанию (в часы наименьшей загрузки сервера) или по требованию (административка).
3. Состав базы - id, url, access...
PHP:
...
mysql_query("SELECT url FROM table WHERE url = '$url' AND access = 1");
...
ну или наподобие того.
 

vitus

мимо проходил
zarus
хинт: файловая система - тоже база данных, и она более быстрая чем любая другая, потомучто сидит на самом низком уровне.

а mysql работает уже поверх неё, да ещё и интерпретирует твои запросы.

"The results of this functions are cached."
 

zarus

Хитрожопый макак
Автор оригинала: white phoenix
zarus
алгоритм is_readable очень прост, смотрит права на файл и делает вывод.
Гхм... почитал описание функций внимательно. Написано, что результаты функций кэшируются.
В общем, нужно реализовать оба примера, и посмотреть, что выполняется быстрее. Хотя... где Фанат? Он-то наверняка знает как "правильно и лучше"...

-~{}~ 23.11.05 12:08:

Автор оригинала: vitus
zarus
хинт: файловая система - тоже база данных, и она более быстрая чем любая другая, потомучто сидит на самом низком уровне.

а mysql работает уже поверх неё, да ещё и интерпретирует твои запросы.

"The results of this functions are cached."
А результаты запросов в MySQL не кэшируются?
И таблица HEAP содержится в памяти - что может быть быстрее нее?
 
Сверху