Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Странное поведение php: include() и т.п.  (Прочитано 19761 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« : 24-02-2006 13:24 » 

В двух словах: include() отказывается подключать файлы, находящиеся ниже по дереву файлов, через относительный путь. Аналогично: require() и т.п.
При этом, если относительный путь правильный, не ругается.
Но у меня получилось еще забавнее.

И так, подробно.

Скажем, такая вот структура файлов:
dir1/file1.php
dir1/dir2/file2a.php
dir1/dir2/file2b.php
dir1/dir2/dir3/file3.php


Вызывают они друг груга в такой последовательности:
file1 -> file2a -> file3 -> file2b

Примерный код:
Код: (PHP) dir1/file1.php
<?php
require_once('dir2/file2a.php');
?>
Код: (PHP) dir2/file2a.php
<?php
require_once('dir3/file3.php');

$b = new bbb();
$b->b1();
?>
Код: (PHP) dir2/file2b.php
<?php
class aaa
{
    function a1() ....
    function a2() ....
    function a3() ....
}
?>
Код: (PHP) dir3/file3.php
<?php
class bbb
{
    function b1()
    {
        require_once('../dir2/file2b.php');
 
        $a = new aaa();

        $a->a1();
        $a->a2();
        $a->a3();
    }
}
?>

В dir3/file3.php ругается на вызов a1() и a2() - undefined function.
Если две эти строки закоментировать, то на a3() уже не ругается.

Вставка отладочной печати в dir2/file2b.php не помогает - не выводит ничего. Вставлял в конструктор, просто в тело класса и перед классом.

Провел проверки в dir3/file3.php:
- перед new проверил наличие класса
- после new проверил наличие объекта заданного класса, НО, метод a1() не определен!

Вылечил указанием абсолютного пути при загрузке dir2/file2b.php.

Вот такая вот хрень.
Кто с таким сталкивался? В чем причина?
« Последнее редактирование: 11-12-2007 18:28 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 24-02-2006 13:50 » 

RXL, Я точно не знаю. Текуший каталог для файла file3.php будет ./dir1/dir2/dir3
Ты вызываеш require_once('../dir2/file2b.php'); т.е. ./dir1/dir2/dir2/file2b.php
это моё предположение.
« Последнее редактирование: 11-12-2007 18:35 от Алексей1153++ » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 24-02-2006 14:21 » 

Finch, к сожалению нет - это я тут ошибся, а в оригинале просто "../tags1.php".
Если путь не совпадает, то php говорит об отсутствии файла.
К тому де, class_exists('tags1') заявляет, что класс есть, а он находится только в этом файле. И new tags1() срабатывает.
« Последнее редактирование: 11-12-2007 18:36 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
lubitel3
Гость
« Ответ #3 : 18-06-2010 11:48 » 

Проблема в том что не выполняется include.
Часть скрипта php работает, а та что должна выполняться посредством include НЕТ.
Как запустить скрипт? С php не знаком вот прошу помощи у знатоков.
Страница c примером _h**p://csg.dp.ua/proba.html
« Последнее редактирование: 18-06-2010 11:54 от Finch » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 18-06-2010 11:55 » 

lubitel3, Показывай лучше исходники.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
lubitel3
Гость
« Ответ #5 : 18-06-2010 12:04 » new

Код:
<?php include "include/cfg.php";
$res mysql_query ("SELECT * FROM ".$tbl." ORDER BY id DESC",$db);
$row mysql_fetch_array ($res);
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Комментарии - проба</title>
</head>

<body>
      <?php
if (mysql_num_rows($res) > 0) {
do {
printf ("<div class=&#39;comment&#39;><div class=&#39;top&#39;>Добавил: <strong>%s</strong> (%s) в %s</div><div class=&#39;text&#39;>%s</div></div>",$row["name"],$row["email"],$row["date"],$row["text"]);}
while(
$row =  mysql_fetch_array ($res));
}
      
?>

<h1 class="title">Добавление комментария:</h1>
<form name="comment_f" class="comment-form" method="post" action="comment/submit.php">
<p>Имя:<br/><input name="name" type="text"/></p>
<p>Email:<br/><input name="email" type="text"/></p>
<p>Текст:<br/><textarea name="text" rows="5" cols="30"></textarea></p>
<p>Вставьте символы<br/><img class="spam-img" align="middle" src="comment/images/spam.jpg" alt="Включите изображение"/>
<input type="text" size="3" name="spam"/></p>
<p><input class="button" name="button" type="submit" value="Добавить"/></p></form>
</body>

</html>
Часть скрипта запускается по команде post, первая часть просто высвечивается на странице.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 18-06-2010 12:27 » 

Ты можеш смотреть лог ошибок Апача? Если да, то что он пишет?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
lubitel3
Гость
« Ответ #7 : 18-06-2010 12:34 » 

Нет.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 18-06-2010 12:41 » 

А хосnинг поддерживает php?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
lubitel3
Гость
« Ответ #9 : 18-06-2010 12:44 » 

Хостинг поддерживает версия 5.0.90
Если файл пере сохранить в php то выдаёт ошибку:
Цитата
Warning: include(include/cfg.php) [function.include]: failed to open stream: No such file or directory in /home/csgdpua/public_html/proba2.php on line 1

Warning: include(include/cfg.php) [function.include]: failed to open stream: No such file or directory in /home/csgdpua/public_html/proba2.php on line 1

Warning: include() [function.include]: Failed opening 'include/cfg.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/csgdpua/public_html/proba2.php on line 1

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in /home/csgdpua/public_html/proba2.php on line 2

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/csgdpua/public_html/proba2.php on line 3

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/csgdpua/public_html/proba2.php on line 16
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 18-06-2010 13:00 » 

lubitel3, Четко написано. Нет файла  /home/csgdpua/public_html/proba2.php Поэтому у тебя и происходит падения всего скрипта.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
lubitel3
Гость
« Ответ #11 : 18-06-2010 13:07 » 

Хорошо, переписал файл в туже директорию и всё равно не работает.
на странице следующее
Код:
0) { do {printf ("
Добавил: %s (%s) в %s
%s
",$row["name"],$row["email"],$row["date"],$row["text"]);} while($row = mysql_fetch_array ($res)); } ?>
Добавление комментария:

Как и изначально. Правда если файл php заработало, но весь интерес чтоб работало когда страница html
« Последнее редактирование: 18-06-2010 13:13 от lubitel3 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 18-06-2010 13:17 » 

У тебя в файле "include/cfg.php" в первой строчке скорее всего есть include "proba2.php"; Согласно этому http://www.php.net/manual/en/ini.core.php#ini.include-path php подключает файлы с каталогов, которые прописаны в настройках. Если только ты вручную не вбиваеш весь путь к файлу. Отсюда делай вывод.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
lubitel3
Гость
« Ответ #13 : 18-06-2010 13:26 » 

В файле "include/cfg.php" только обращение к БД.
proba2.php и proba.html  это один и тот же файл с разным расширением для проверки.
В итоге страница.php работает без стилей но нужно чтоб работало когда страница .html но в этом варианте высвечивается часть кода и не работает. Не понял
Админка работает нормально и стили работают. На странице proba.html от кнопки "добавить" срабатывают подсказки (error), не запускается файл include/cfg.php значит не срабатывает include...
« Последнее редактирование: 18-06-2010 13:35 от lubitel3 » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #14 : 18-06-2010 13:28 » 

lubitel3, файл с расширением html не должен отрабатываться php по умолчанию. Нужно настраивать апач для этого.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
lubitel3
Гость
« Ответ #15 : 18-06-2010 13:40 » 

Цитата
lubitel3, файл с расширением html не должен отрабатываться php по умолчанию. Нужно настраивать апач для этого.
У меня на странице с расширением html стоял моноскрипт php обратной связи и отлично работал.
Записан
lubitel3
Гость
« Ответ #16 : 18-06-2010 15:37 » 

Всем спасибо за комментарии. Вопрос закрыт, оказалась запись в файле htaccess должна быть немного другая для данного хостинга.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines