Přesměrování na část dokumentu

Školení, která pořádám

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.

Jakub Vrána, Řešení problému, 18.11.2005, diskuse: 11 (nové: 0)

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

ikona Jakub Vrána OpenID:

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.

Leo:

Aha, ja myslel, ze cilem je presmerovat na posledni, ne muj. Leo

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."

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).

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&amp;ID=$ID#view\" method=\"post\"

header("Location:/comments.php?ID=$ID&amp;view=$NO");

vystup URL v IE po presmerovani:
comments.php?ID=31&amp;view=29 , zalozka chybi

muzete prosim nekdo poradit, kde delam chybu ? dekuji

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

ikona Jakub Vrána OpenID:

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 &amp; je správně samotné &.

mj41:

Trochu offtopic. Pro http-equiv="refresh" má být escapovaný nebo ne? Nějak to nemůžu najít. Díky.

ikona Jakub Vrána OpenID:

Pokud se to zapisuje do HTML dokumentu, tak by to samozřejmě escapované být mělo.

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

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.