include i include path - błąd function.include

0

Cześć wszystkim :)

Już parę lat zajmuje się HTML'em i CSS'em, ale PHP itp. to jak na razie magia...
Odkryłem ciekawą możliwość pakowania kawałków stron które są wspólne dla całego serwisu do plików php i "includowanie" tego cuda.
Napisałem już parę stron w ten sposób i nie było problemów jednak dzisiaj siedzę cały dzień i nie mogę ogarnąć... nawet przenosiłem całą stronę po serwerze myśląc, że coś jest nie tak ze ścieżką do pliku, ale to chyba nie to.

Serwer na home.pl

Struktura katalogów:

katalogglowny/index.php
katalogglowny/content/header.php
katalogglowny/content/newsletter/bledy/1.php

Mój kod wygląda tak:

Index.php

<body>
	<?php include_once("analyticstracking.php"); ?>
	<?php include_once("content/header.php"); ?>
	
	<!-- START	 ZAWARTOSC CONTENTU DLA KONKRETNEJ STRONY -->
	<div id="box">

header.php

<div id="header">
	<div id="headercontent">
		<div id="logo">
		</div>
	</div>
</div>

1.php

<body>
	<?php include_once("analyticstracking.php"); ?>
	<?php include_once("content/header.php"); ?>
	
	<!-- START	 ZAWARTOSC CONTENTU DLA KONKRETNEJ STRONY -->

php.ini puste

Kod błędu:

Warning: include_once(analyticstracking.php) [function.include-once]: failed to open stream: No such file or directory in /*/*/*/webpage/content/newsletter/bledy/1.php on line 11

Warning: include_once() [function.include]: Failed opening 'analyticstracking.php' for inclusion (include_path='.:/:/usr/local/php/pear5') in /*/*/*/webpage/content/newsletter/bledy/1.php on line 11

Warning: include_once(content/header.php) [function.include-once]: failed to open stream: No such file or directory in /*/*/*/webpage/content/newsletter/bledy/1.php on line 12

Warning: include_once() [function.include]: Failed opening 'content/header.php' for inclusion (include_path='.:/:/usr/local/php/pear5') in /*/*/*/webpage/content/newsletter/bledy/1.php on line 12

Index.php znajduje się w katalogu [...]/webpage/
tam też jest podpięta domena

Index.php śmiga, natomiast */bledy/1.php nie...
Sprawdzałem inne moje strony i nigdzie nie zmieniałem ścieżek do includowanych plików.
Co jest nie tak? inne strony spokojnie śmigają...

link http://www.*.net.pl/content/newsletter/bledy/1.php

Gdzieś na forum znalazłem odniesienie do include_path ale za chorobe nie potrafię tego rozgryźć...

dodanie znaczników <code>, <code class="xml"> i `` - furious programming

0

W pliku 1.php musisz podać ścieżki względem tego pliku a nie katalogu głównego. Include path jak ustawisz na katalog glowny, to wtedy php wie, że ma tam też szukać i powinno działać (to jest drugie rozwiązanie). Tu masz funkcję do ustawienia include path: http://pl1.php.net/set_include_path

0

@tr: źle mówisz. include wyszukuje względem WYWOŁANEGO pliku, więc w przypadku gdy index wywołuje a.php, który próbuje wywołać b.php - to ścieżka do b.php musi byc podana relatywnie do indexu.
można użyć dirname(_FILE_), żeby szukać od aktualnego pliku

0

hmm racje poknociło mi się, niemniej jednak nie wiadomo gdzie ten 1.php jest includowany i tu bym szukał błędu. Ewentualnie tak jak @dzek69 powiedział, dirname(FILE) i potem sciezka względna

0

z tego co kojażę to należy się cofnąć o dwa katalogi z pliku 1.php, do katalogu głównego, ale próbowałem podać ścieżke bezwzględną tj.

1.php

<body>
    <?php include_once("analyticstracking.php"); ?>
    <?php include_once("http://www.*.net.pl/content/header.php"); ?>
 
    <!-- START     ZAWARTOSC CONTENTU DLA KONKRETNEJ STRONY -->

i ciągle nie działa.

chodzi o zastosowanie dirname(FILE) w ten sposób:

<?php include_once("dirname(http://www.*.net.pl/content/header.php"); ?>

?

poza tym właśnie staram się wyciągnąć od serwera ścieżkę poprzez funkcję "get_include_path" i echo, i mam na stronie taką ścieżkę:
".:/:/usr/local/php/pear5". z Manuala nie rozumiem z którego miejsca prowadzi... czy z głównego katalogu serwera czy z głównego katalogu strony.

a strona o której mowa tj. 1.php ma być wywoływana przez freshmail'a, ale to nie powinno mieć chyba znaczenia

0

Gdyby Bóg był sprawiedliwy to by Cię dawno rąbnął piorunem o.O

Includowanie plików z zewnątrz ("http") nie zadziała w domyślnej konfiguracji, rzuci też ostrzeżenie, ale Ty ostrzeżenia ukrywasz i masz gdzieś (na serwerze zdalnym zapewne się logują do pliku - zajrzyj tam).
Drugi kawałek kodu to w ogóle majstersztyk - błąd składniowy połączony z podawaniem funkcji z parametrami jako string o.O

w 1.php:

// .. - bledy
// ../.. - newsletter
// ../../.. - content
include_once("../../../header.php");

dirname nie będzie potrzebny, z początku myślałem, że includujesz 1.php z poziomu index, a tu jednak nie jak się przyjrzałem.

0

Ucze się :)

po rozczytaniu manuala zmontowałem dirname tak jak powinno być, a Bóg powinien trzaskać piorunami bez przerwy :)

pokombinowałem i zrobiłem przekierowanie z separacją serwisu (znów) i dodałem "/" przy
katalogglowny/content/newsletter/bledy/1.php

<?php 
	include_once("/analyticstracking.php");
	include_once('/content/header.php'); 
?>

aktualnie śmiga, tylko nie wiem czy nie mam więcej rażących błędów :)

Dziękuję :)

0

to Ci niby działa o.O
to jakoś magicznie skonfigurowany php
nie zadziała to na jakimkolwiek innym serwerze

ścieżka zaczynająca się od "/" będzie szukać od korzenia na dysku, nie korzenia wirtualnego hosta domeny

0

może home.pl jest magiczny :)

Zastanawiam się czy walczyć dalej czy zostawić bo działa

0

Zrób to porządnie, tak jak powinno być. W razie przenoszenia gdzieś indziej nie będziesz musiał znów poprawiać.

0

Ok, zastanawia mnie tylko sposób bezwzględnego podania adresu pliku.
Chodzi mi o to, że jak tworzę ręcznie dość skomplikowaną strukture katalogów to wszystkie ścieżki muszę poprawiać.

Czy da się to jakoś prościej zrobić?

podawanie adrsu http://... mnie nie bawi bo zdarza się, że adres jest zmieniany
myślałem o funkcji $_SERVER('PHP_SELF'), ale zwraca on dokładnie adres strony na której jest wykonywany,
może $_SERVER_ADDR?

0

Czemu się tak uczepiłeś tego http? Zostaw to w spokoju. Do pobrania adresu bezwzględnego możesz wykorzystać funkcję dirname - tak jak napisał @dzek69.
Ponad to słowo klucz na dzisiaj:

__FILE__
0

$_SERVER["DOCUMENT_ROOT"] powinien zawierać ścieżkę absolutną do korzenia domeny.

Oczywiście odpowiednio skopany serwer wskazuje inną ścieżkę :/

Generalnie najlepiej pisać stronki tak, że ZAWSZE wywołujesz index.php - a ten na podstawie parametrów odbiera i przetwarza dane i podejmuje decyzje co zwrócić. Wtedy nie ma problemów z includowaniem, bo zawsze podajesz ścieżkę relatywną od index. A i wiele innych zalet jest (tak jak łamane przez Ciebie DRY)

Edit: z http NIGDY Ci to nie zadziała. PHP pobiera wtedy stronę jak przeglądarka i wykonuje kod. Jak Ty wbijesz w przeglądarkę ten adres to nie widzisz kodu PHP tylko wynik działania. NIGDY pobieranie przez http nie przydaje się z include. Jak ktoś twierdzi inaczej to zastrzel, zanim się rozmnoży.

1 użytkowników online, w tym zalogowanych: 0, gości: 1