Přesměrování na část dokumentu
Po vložení komentáře na těchto stránkách se provede přesměrování zpět na výpis diskuse. Pro zvýšení pohodlí se skočí přímo na nově přidaný příspěvek, aby si uživatel mohl vše zkontrolovat. Přesměrování jsem dělal zhruba takto:
<?php
header("Location: $url#d-" . mysql_insert_id());
?>
Moji čtenáři mě ale upozornili, že Opera tento způsob přesměrování ve shodě s normou nepodporuje a pro odkaz na část dokumentu se použije fragment z původního URL. Vzhledem k tomu, že ID nového příspěvku se dozvím až po uložení, je na to potřeba jít trochu jinak:
<?php
// formulář pro vložení nového příspěvku
echo "<form action='diskuse.php#new' method='post'>\n";
// diskuse.php
header("Location: $url?new=" . mysql_insert_id());
// výpis diskuse
$result = mysql_query("SELECT * FROM diskuse WHERE clanek = $clanek");
while ($row = mysql_fetch_assoc($result)) {
if ($row["id"] == $_GET["new"]) {
echo "<a name='new'></a>\n";
}
// zde je výpis diskusního příspěvku
}
mysql_free_result($result);
?>
Při přesměrování se za URL ve všech hlavních prohlížečích připojí původní odkaz na část dokumentu, vznikne tedy $url?new=$id#new
.
Mimochodem, s přísností Opery jsem se setkal už několikrát. Na jednu stranu mi je její snaha o soulad s normami sympatická, na druhou stranu si říkám, že pokud normy neodpovídají realitě a realita se jeví lepší než normy, měly by se změnit spíše ty normy.
Diskuse
Leo:
Nejak to nechapu. Pokud bude mit posledni prispevek na dane strance vzdy id="posledni", tak klidne klient muze presmerovat na fragment z puvodniho URL, protoze po pridani prispevku uz to odpovida tomu novemu, ne? Leo
18.11.2005 01:07:55
Ne. Když mezi uložením příspěvku a načtením stránky s výpisem vloží příspěvek někdo další, tak bych byl přesměrován na jeho příspěvek a ne na svůj.
18.11.2005 10:13:32
Leo:
Aha, ja myslel, ze cilem je presmerovat na posledni, ne muj. Leo
18.11.2005 18:12:02
xshot:
Možná jsem něco zaspal, ale tohle mi nějak nesedí:
<?php
// formulář pro vložení nového příspěvku
echo "<form action='diskuse.php#new' method='post'>\n";
// diskuse.php
header("Location: $url?new=" . mysql_insert_id());
//...
//...
?>
Jak můžete před headerem vypsat nějaký obsah?
"Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP."
18.11.2005 09:17:47
salko:
Jedná sa o dva rôzne skripty, to echo patrí do skriptu pre odosielanie údajov (je to tam aj napísane) a ten header patri do skriptu uloženie údajov do DB (a následne presmerovanie).
18.11.2005 10:09:23
Jakub Pavlík:
zdravim,
me to nejak nejde rozchodit pod IE (6.0 sp2) - v opere a ff to jde v pohode:
po headeru, kde neni v adrese uvedena zalozka si ji ie nedoplni:
form action=\"/comments.php?com=add&ID=$ID#view\" method=\"post\"
header("Location:/comments.php?ID=$ID&view=$NO");
vystup URL v IE po presmerovani:
comments.php?ID=31&view=29 , zalozka chybi
muzete prosim nekdo poradit, kde delam chybu ? dekuji
3.2.2006 00:55:34
Jakub Pavlík:
jeste dodatek:
vsimnul jsem si, ze se opere nelibi v headeru take dlouhe URL, pri kterem take "vytuhne" - vi o tom nekdo neco konkretniho? dik
3.2.2006 01:27:46
Fakt že jo, v IE6 to nefunguje.
Mimochodem, řetězec předaný funkci header() by neměl být HTML escapovaný, takže místo & je správně samotné &.
3.2.2006 12:16:43
Trochu offtopic. Pro http-equiv="refresh" má být escapovaný nebo ne? Nějak to nemůžu najít. Díky.
27.10.2009 17:53:12
Pokud se to zapisuje do HTML dokumentu, tak by to samozřejmě escapované být mělo.
28.10.2009 13:08:14
Jirka Roleček:
Snad bys mohl vědět, co s tímhle problémem :
potreboval bych pouzit funkci PHP Header('Location: down.php');
Ale kdyz tenhle prikaz provedu (je uplne na zacatku skriptu atd...), tak mi browser nabidne ke stazeni soubor down.php, po jehoz ulozeni je velikost souboru 0b.
Bezi to na Apache 2 s PHP 5.0.4 s virtalnim hostem na portu 443 se zabezpecenim SSL. Na zabezpecene strance to proste nefunguje. Ale kdyz tam dam Location: index.php tak to jede.
Kdyz tento skript dam do DocumentRootu pro port 80, tak to funguje... Z toho usuzuju, ze je chyba v nastaveni apache...
Byl bys ochoten mi s tim poradit? (treba bych i poslal httpd.conf)
Nechci te tim nejak zatezovat, ale uz nevim, v cem by mohl byt problem a konfiguraci apache nejak zvlast moc nerozumim ...
Dik
11.5.2006 16:05:15