[ neb @ 12.07.2011. 16:57 ] @
Da li neko ko ima vise iskustva sa radom u PHP script jeziku moze da kaze kako bih mogao da resim problem koji mi se javlja prilikom pisanja koda za jedan web sajt.

U nastavku teme potrudicu se da opisem problem sto je bolje moguce:

Sadrzaj celog web sajta smestio sam u sledeci folder

Citat:

D:\htdocs\sajt\www


Kreirao sam 'home.php' fajl koji sadrzi PHP i HTML kod glavne pocetne web stranice i isti fajl sam smestio u sledeci direktorijum
Citat:

D:\htdocs\sajt\www\home.php


u istom fajlu sam napisao sledeci deo PHP koda:
Code:

<?php
include 'php/header.php';
?>


Fajl 'header.php'
se nalazi u direktorijumu
Citat:

D:\htdocs\sajt\www\php\header.php


Fajl 'header.php' sadrzi sledeci kod:
Code:

<?php
include 'cookies.php';
include 'hitcounter.php';
?>


Oba fajla koja se pozivaju nalaze se u istom direktorijumu gde se nalazi i sam 'header.php' fajl
Citat:

D:\htdocs\sajt\www\php\cookies.php
D:\htdocs\sajt\www\php\hitcounter.php


Problem koji sam uocio se javlja kod poziva fajla 'hitcounter.php'

Sam fajl sadzi kod za izvrsavanje brojaca broja posecenosti samog web sajta sto se moze uociti i prema samom imenu istog fajla. Kod koji isti fajl sadrzi je sledeci:

Code:

<?php
$hits;
if(!isset($_COOKIE["Sajt"]))
{
$count_my_page = ("..\hitcounter.txt");
$hits = file($count_my_page);
$hits[0] ++;
$fp = fopen($count_my_page , "w");
fputs($fp , "$hits[0]");
fclose($fp);
}
else
{
//echo "cookie je vec postavljen";

$count_my_page = ("..\hitcounter.txt");
$hits = file($count_my_page);
$fp = fopen($count_my_page , "r");
fclose($fp);
}
?>



Problem nastaje kada otvorim glavnu stranicu u web klijentu pozivom na sledeci link


Brojac pocinje da broji od broja 1 umesto od poslednje vrednosti.

Razlog ovom problemu jeste sto isti brojac kreira zaseban 'hitcounter.txt' fajl na sledecoj lokaciji i podrazumevano pocinje da broji ponovo od broja '1'.

Citat:

d:\Apache\htdocs\sajt\hitcounter.txt


umesto da inkrementira i cita vec postavljenu vrednost u potrebnom fajlu

Citat:

d:\Apache\htdocs\sajt\www\hitcounter.txt


Brojac radi normalno kada otvorim neku od pod web stranica unutar samog sajta koja se nalazi u zasebnom folderu.

Na primer:
Citat:

D:\Apache\htdocs\sajt\www\Proizvodi\Proizvodi.php


PHP kod fajla 'Proizvodi.php' izgleda ovako:
Code:

<?php
include '../php/header.php';
?>


Kada otvorim istu pod stranicu sve radi normalno tj. brojac otvara trazeni fajl na datoj lokaciji
Citat:

d:\Apache\htdocs\sajt\www\hitcounter.txt


Ovaj problem se javlja jedino kada se vrsi poziv brojaca sa glevne web stranice iz glavnog 'home.php' fajla koji se nalazi na lokaciji
Citat:

d:\Apache\htdocs\sajt\www\home.php


PHP kod fajla 'home.php':
Code:

<?php
include 'php/header.php';
?>


Da li neko ko ima vise iskustva sa PHP-om moze da kaze kako da osiguaram da se trazeni 'hitcounter.txt' fajl uvek poziva sa iste lokacije nevezano za to gde se nalazi sam fajl u kome se vrsi poziv brojaca preko fajla

Code:

include 'php/header.php';

ili
Code:

include '../php/header.php';


Ja sam proucio dole navedene clanke vezane za PHP medjutim jos nisam odgonetnuo sta moze tacno da bude problem.

Google
Citat:

php path problem
php path problem for includes file
http://php.net/manual/en/function.include.php

[ Aleksandar Ružičić @ 13.07.2011. 01:41 ] @
Problem ti ne prestavlja include vec file i fopen funkcije, kada njima prosledis relativnu putanju do fajla php ce je resolveovati na osnovu "trenutnog direktorijuma" (pogledaj getcwd() funkciju) a to je onaj direktorijum u kom se nalazi skripta koja je prva pozvana, tj ona koja je includeovala sve ostale (home.php u tvom slucaju). Ovo vazi za situaciju kada se php izvrsava na web serveru, pokretanje preko cli-a je druga stvar, ali te to sad verovatno ne interesuje..

Probaj da ovo (btw, ove zagrade nemaju nikakav smisao ovde, nije greska da se stave ali nemaju nikakav semanticki znacaj):
Code (php):

$count_my_page = ("..\hitcounter.txt");
 


zamenis sa ovim:
Code (php):

$count_my_page = realpath(rtrim(dirname(__FILE__), '\\/') . '/../hitcounter.txt');
 


evo sta ovo tacno radi:

1. __FILE__ je specijalna php konstanta i sadrzi apsolutnu putanju do fajla u kom se nalazi (u ovom slucaju to bi bilo D:\htdocs\sajt\www\php\hitcounter.php)
2. dirname() funkcija vraca samo putanju do foldera, u ovom slucaju to je D:\htdocs\sajt\www\php
3. posto dirname moze nekad da vrati putanju sa slashom na kraju (u slucaju da je u pitanju root putanja) sa rtrim() uklanjamo / ili \ sa kraja stringa koji je dirname fja vratila
4. spajamo string koji imam do sad (D:\htdocs\sajt\www\php) sa /../hitcounter.txt da dobijemo D:\htdocs\sajt\www\php/../hitcounter.txt
5. realpath() fja sredjuje slasheve i backslasheve i resolvuje . i .. tako da na kraju dobijemo D:\htdocs\sajt\www\hitcounter.txt sto je apsolutna putanja do fajla koji ti treba

ovako ces uvek imati ispravnu putanju bez obzira koja skripta (tacnije iz kog foldera) je includeovala hitcounter.php
[ neb @ 10.08.2011. 14:28 ] @
Hvala ti puno