Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: header
Forum PHP.pl > Forum > Gotowe rozwiązania
DanielBB
Czy ktoś potrafi rozwiązać następujący problem?:
W poniższym skrypcie uruchamianym po raz pierwszy wartość ciasteczka $ciastko jest różna od 1. Program omija pierwszą pętlę warunkową i przechodzi do... no właśnie. Powinien dalej utworzyć to ciasteczko a on przeskakuje od razu do wykonywania instrukcji: header("Location: ../$site_name?action=vote&ok=1"); I ciacho nie jest wysłane. Bez tej linijki kodu: header("Location: ../$site_name?action=vote&ok=1"); ciacho jest wysyłane. Dlaczego tak się dzieje?
Z góry dziękuję za odpowiedź i pozdrawiam
Oto kod:
[php:1:c3f6d3ed70]
<?
$site_name="index.php";
if ($ciastko=="1") {
header("Location: ../$site_name?action=vote&ok=2");
die();
}
setcookie("ciastko", "1", time()+120);
$base="data/poll.dat";
$data=file($base);
$splitted=explode("||", $data[0]);
$splitted[2]=trim($splitted[2]);
$splitted[$id]++;
$str="$splitted[0]||$splitted[1]||$splitted[2]n";
$f=fopen("data/poll.dat", "w");
flock($f, 2);
fputs($f, $str);
flock($f, 3);
fclose($f);
header("Location: ../$site_name?action=vote&ok=1");
?>
[/php:1:c3f6d3ed70]
DeyV
http://forum.php.pl/viewtopic.php?t=789
DanielBB
To nie to. Mam register_globals na "on".
spenalzo
Manual się kłania:
ciastka są widoczne tylko w tym katalogu, dla którego są ustawione.
http://www.netscape.com/newsref/std/cookie_spec.html
Cudi
Wystarczy ustawić odpowiednio 4 parametr, i będą widoczne także w innych, ja to ustawiam tak:
[php:1:f6f7cb3abd]<?php
setcookie('ciastko', 1, time()+120, '/');
?>[/php:1:f6f7cb3abd]

W linku który podał Spenalzo też jest to napisane, szkoda że nie znałem tego adresu jak poszukiwałem tego rozwiązania kilka miesięcy temu (odziwo w manualu nie było, a komentarze były tak dziwnie napisane że cięzko było to wywnioskować, więc musiałem do tego dochodzić metodą prób i błędów smile.gif)
spenalzo
Link był w manualu php w wersji windows help.
Ale jak tak podasz to tylko jak skrypt jest w katalogu głównym, np. serwer.pl/ a jak bedzie serwer.pl/skrypty/pliki/ to chyba ciastka nie będzie już, nie wiem. Proszę o sprostowanie jeżeli się myle.
DanielBB
Testuje skrypt Na PWS. Ciacho przechowywane jest w katalogu WindowsCookies. Kiedy podaje komendę header("Location: ../$site_name?action=vote&ok=1"); to ciacho nie jest tworzone. Jeżeli zamiast tej linijki dam np.
If $ciastko=="1" Echo "jest ciacho";
to skrypt działa - w katalogu Windowscookies jest zapisane ciasteczko i skrypt je widzi wyświetlając: Jest ciacho. Coś nie tak z tym headerem? Nierozumiem dlaczego skrypt analizuje go jakby w pierwszej kolejności przed utworzeniem ciacha.
spenalzo
Owszem ciastko jest utworzone, ale ty poprzez header("Location: ../$site...) przekierowujesz się do katalogu niżej, z którego ciastka już nie możesz odczytać!
podałem link.
Cudi
DanielBB -> A ja rozwiązanie problemu smile.gif

Cytat
Ale jak tak podasz to tylko jak skrypt jest w katalogu głównym, np. serwer.pl/ a jak bedzie serwer.pl/skrypty/pliki/ to chyba ciastka nie będzie już, nie wiem. Proszę o sprostowanie jeżeli się myle.

Chyba sie mylisz, bo ja trzymałem plik ustawiający ciacho głęęęboko na serwerze, a plik który go odczytywał leżał w katalogu o jeden stopień wyżej.


Cytat
Link był w manualu php w wersji windows help.

Szukałem w wersji online, tam pewnie też jest, ale wtedy chyba jeszcze nie potrafiłem do końca z niego (manuala) korzystać winksmiley.jpg
spenalzo
Cytat
Chyba sie mylisz, bo ja trzymałem plik ustawiający ciacho głęęęboko na serwerze, a plik który go odczytywał leżał w katalogu o jeden stopień wyżej.

Ok, sprawdziłem właśnie i tak:
w przypadku zapisywania ciastka w katalagu np. /pliki/ i próbie odczytania w katalogu /pliki/katalog/katalog2/ ciastko można odczytać
natomiast w przypadku zapisania np. w katalogu /pliki/katalog/ i próbie odczytania w katalogu /pliki/ takiego ciastka nie widać. Czyli przy zapisaniu ciastka w katalogu podrzędnym nie można go odczytać z nadrzędnego.

Czyli metoda Cudi'ego działa:
[php:1:678a7af28d]<?php
setcookie('ciastko', 1, time()+120, '/');
?>[/php:1:678a7af28d]
DanielBB
Sprawdzałem. U mnie na PWS'ie jest trochę inaczej, tzn nawet przy określeniu scieżki dla ciasteczka PWS wkłada go do Windows/cookies.
Nie ma to jednak znaczenia bo skrypt automatycznie po nie sięga i czyta wartość. Problem w tym, że jak mówiłem setcookie w przypadku kiedy jest linia z header... nic nie tworzy. skrypt w pierwszej kolejności wykonuje header (location.. itd. zwracając wartość ok=1. Przy następnym odwołaniu do skryptu $ciastko powinno mieć wartość 1 i skrypt powinien się zakończyć. Ja już się prawie poddałem...
KaMeLeOn
A może czas time()+120 to w końcu tylko 2 minuty...
DanielBB
Niestety nie. Czytałem gdzieś że IE 5.5 którego zresztą używam ma kłopoty z dobrą interpretacją funkcji header(). Jest to możliwe bo header w funkcji warunkowej (patrz: skrypt) sam się nie uaktywnia i pozwala na cookies, które jest aplikowane w następnej linijce. Natomiast kiedy ciasteczko jest przed headerem, jak to ma miejsce później w skrypcie, header() nie dopuszcza do jego utworzenia. Dziwne.... Na razie szukam czym by tu zastąpić tę funkcję...
KaMeLeOn
Cytat
[...] Natomiast kiedy ciasteczko jest przed headerem, jak to ma miejsce później w skrypcie, header()  nie dopuszcza do jego utworzenia. Dziwne.... [...]

To niemożliwe...
Co ma piernik do wiatraka?
DanielBB
A jednak.. U mnie ciacho jest traktowane jako nagłówek. Jeżeli ono działa to funkcja header jest nieaktywna. Nie powinno tak być wię coś mam chyba z softem, bo sprawdzałem już ten skrypt na setki razy.
No nic pozdrawiam i dziękuję za wskazówki.
KaMeLeOn
Cytat
A jednak.. U mnie ciacho jest traktowane jako nagłówek. [...]

Co takiego?
Cytat
Ciasteczko musi być wysłane zanim jakiekolwiek inne nagłówki zostaną wysłane (to jest ograniczenie ciasteczek, nie php).

Wogóle to zacznij od najprostrzego skryptu...
[php:1:e6bda0487e]<?php
$site_name="index.php";

if($_COOKIE['ciastko'] == "1")
{
header("Location: ../$site_name?action=vote&ok=2");
} else
{
setcookie("ciastko", "1", 0);
header("Location: ../$site_name?action=vote&ok=1");
}

die();
?>[/php:1:e6bda0487e]
DanielBB
No właśnie taka nawet najprostsza wersja nie działa. Przy pierwszym wykonywaniu skryptu, ponieważ ciacho nie jest jeszcze utworzone wykonuje się instrukcja:

setcookie("ciastko", "1", 0);
header("Location: ../$site_name?action=vote&ok=1");

tyle, że ciacho nie jest tworzone tylko od razu wykonuje się instrukcja headera ze zmienną ok=1.

Jeżeli usunę linie: header("Location: ../$site_name?action=vote&ok=1");
Ciacho jest tworzone. Mam php 4.3.2 na PWS Win ME IE 5.5
U Ciebie twój skrypt działa?
Cudi
A próbowałeś chcociarz z tym 4 parametrem ? Bo u mnie jak plik odczytujący leży wyżej niż wysyłający to ciacha nie widać nigdy, czy jest tam header(), czy go nie ma.
DanielBB
Tak sprawdzałem z 4 parametrem. To nie zależy od tego. Sprawdze jutro na Linux'ie na uczelni. Pozdrawiam
spenalzo
To sprawdź tak:
[php:1:b429f34090]<?php
// plik 1.php
if(!empty($HTTP_COOKIE_VARS["test"]))
{
header("Location: 2.php");
}
else
{
header("Location: 2.php");
setcookie("test","jest ciacho");
}

// plik 2.php
echo $HTTP_COOKIE_VARS["test"];
?>[/php:1:b429f34090]
I jeżeli pokaże się "jest ciacho" to znaczy że działa.
A czy ktoś zwrócił wogole uwagę na to co napisałem - że ciastka zapisane w katalogu podrzędnym nie są widoczne w nadrzędnym?
Cudi
Cytat
A czy ktoś zwrócił wogole uwagę na to co napisałem - że ciastka zapisane w katalogu podrzędnym nie są widoczne w nadrzędnym?


Wszyscy zwrócili, ale u DanielaBB ciastko o dziwo jest widoczne, chyba że wstawi tam header(). Może to jest spowowdowane konfiguracją serwera.

A tak wogóle to u mnie jeśli podam 4 parametr jako '/' to ciacho jest widoczne w katalogu nadrzędnym.

No ale może Twój kod pomoże wreszcie rozwiązać problem smile.gif
DanielBB
skrypt spenalzo u mnie nie działa. Oczywiście utworzyłem 1.php i 2.php do testów. To chyba jednak mój PWS. Przepraszam za tyle kłopotu i wielkie dzięki.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.