Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Jak přesměrovat stránku?

ahoj, mám tu problém...
nevím, jak mám stránku přesměrovat... mám mám stránku profils-modify.php, kde je formulář a po té, co se vyplní, tak se to zase přepošle na tutéž stránku a nahoře (přes <html>) se vykonají podmínky, zápis do databáze, uložení souboru apod.
a teď nevím, jak stránku přesměrovat
pomocí header to nejde

$adresa = "www.XXX.eu/profil.php";
		Header("Location: ".$adresa);
        exit;

zkoušel jsem to i pomocí javascriptu

<script>
window.location.href="ADRESA";
</script>

ale byl jsem odhlášený a navíc mě to jaksi "přehodilo" stránku, kterou jsem musel aktualizovat, aby se dala zase do pořádku
meta tagem to dělat nejde (vzhledem k tomu, jak je stránka sepsaná, navíc by mě to odhlásilo...)
jak tedy přesměrovat stránku tak, abych byl stále přihlášený?

Předmět Autor Datum
Co znamená, že to pomocí "header" nejde?
Wikan 02.05.2015 12:06
Wikan
vypíše to: Warning: Cannot modify header information - headers already sent by (output started at /d…
Vilak 02.05.2015 13:13
Vilak
Píše ti tam, že už jsi nějakou hlavičku posílal, takže už ji nemůžeš měnit.
Wikan 02.05.2015 13:16
Wikan
před touto funkcí mám jen jiné funkce, které ošetří dané proměnné z formuláře, podmínky a potom násl…
Vilak 02.05.2015 13:36
Vilak
IMHO je problém v tom session_start() na začátku. Ale nevím, do PHP nefušuju už několik let. nový
Ilmarinen 02.05.2015 14:58
Ilmarinen
Tak tak: This function sends out several HTTP headers nový
Wikan 02.05.2015 16:09
Wikan
HTTP odpoveď pozostáva z dvoch častí: na začiatku sú HTTP hlavičky a potom nasleduje samotné telo od… nový
los 02.05.2015 16:39
los
prohodil jsem sessions a ten druhý script a už to jede (y) a děkuji za vysvětlení headeru, konečně u… nový
Vilak 02.05.2015 17:39
Vilak
Volanie session_start nastavuje cookie v prípade, že ešte nebol nastavený (cookie sa posiela v HTTP… nový
los 02.05.2015 19:07
los
dobře, beru na vědomí ;) nový
Vilak 02.05.2015 19:30
Vilak
ale efektivne jsi vypsal odradkovani, tudiz se musely odeslat hlavicky a i kus (1 znak/odradkovani)… nový
gilhad 03.05.2015 00:46
gilhad
Drobně offtopic, celý kód je náchylný na SQL Injection útok, doporučuji nastudovat a opravit. Plus p… poslední
martin.developer 04.05.2015 13:50
martin.developer

před touto funkcí mám jen jiné funkce, které ošetří dané proměnné z formuláře, podmínky a potom následné zapsání proměnných do databáze... nic víc
tudíž jsme žádnou hlavičku neposílal, ne?
celý code:

<?php
	session_start();
	if (isset($_GET['action']) && $_GET['action'] == 'odhlasit_se') {
		$_SESSION['name'] = '';
		$_SESSION['id'] = '';
		$_SESSION['rank'] = '';
		unset ($_SESSION['name']);
		unset ($_SESSION['id']);
		unset ($_SESSION['rank']);
	}
?> 
<?php
	if (isset($_POST['go_modify_prof'])) {
		if (isset($_POST['age_new'])) {
			$age_new = stripslashes(htmlspecialchars(trim(substr($_POST['age_new'], 0, 3))));
		}
		if (isset($_POST['born_new'])) {
			$born_new = stripslashes(htmlspecialchars(trim($_POST['born_new'])));
		}
		if (isset($_POST['sex_new'])) {
			$sex_new = stripslashes(htmlspecialchars(trim($_POST['sex_new'])));
		}
		if (isset($_POST['group_visit_new'])) {
			$group_visit_new = stripslashes(htmlspecialchars(trim($_POST['group_visit_new'])));
		}
		if (isset($_POST['subject_visit_new'])) {
			$subject_visit_new = stripslashes(htmlspecialchars(trim($_POST['subject_visit_new'])));
		}
		if (isset($_POST['list_id_new'])) {
			$list_id_new = stripslashes(htmlspecialchars(trim($_POST['list_id_new'])));
		}
		if (isset($_POST['style_web_new'])) {
			$style_web_new = stripslashes(htmlspecialchars(trim($_POST['style_web_new'])));
		}
		if (isset($_POST['type_web_new'])) {
			$type_web_new = stripslashes(htmlspecialchars(trim($_POST['type_web_new'])));
		}
		if (isset($_POST['state_new'])) {
			$state_new = stripslashes(htmlspecialchars(trim($_POST['state_new'])));
		}
		if (isset($_POST['city_new'])) {
			$city_new = stripslashes(htmlspecialchars(trim($_POST['city_new'])));
		}
		if (isset($_POST['street_new'])) {
			$street_new = stripslashes(htmlspecialchars(trim($_POST['street_new'])));
		}
		if (isset($_POST['psc_new'])) {
			$psc_new = stripslashes(htmlspecialchars(trim($_POST['psc_new'])));
		}
		if (isset($_POST['skype_new'])) {
			$skype_new = stripslashes(htmlspecialchars(trim($_POST['skype_new'])));
		}
		if (isset($_POST['icq_new'])) {
			$icq_new = stripslashes(htmlspecialchars(trim($_POST['icq_new'])));
		}
		if (isset($_POST['mobil_new'])) {
			$mobil_new = stripslashes(htmlspecialchars(trim($_POST['mobil_new'])));
		}
		if (isset($_POST['web_new'])) {
			$web_new = stripslashes(htmlspecialchars(trim($_POST['web_new'])));
		}
		if (isset($_POST['job_new'])) {
			$job_new = stripslashes(htmlspecialchars(trim($_POST['job_new'])));
		}
		if (isset($_POST['school_new'])) {
			$school_new = stripslashes(htmlspecialchars(trim($_POST['school_new'])));
		}
		if (isset($_POST['me_new'])) {
			$me_new = stripslashes(htmlspecialchars(trim(substr($_POST['me_new'], 0, 500))));
		}

		$last_up = Date("j/m/Y H:i:s", Time());
		$photo_new = ($_FILES['photo_new'] ['tmp_name']);
		$photo_new_name = ($_FILES['photo_new'] ['name']);
		$photo_new_size = ($_FILES['photo_new'] ['size']/1024)/1024;
		$povoleni = array('jpg', 'jpeg', 'png', 'gif');
		if ($photo_new_size > 2) {
			$photo_error_up = "<h3>Fotka má příliš velkou velikost. Maximální velikost fotky může být 2MB.</h3>";
		}
		elseif (is_uploaded_file($photo_new)) {
			if (!in_array(strtolower(pathinfo($photo_new_name, PATHINFO_EXTENSION)), $povoleni)) {
				$photo_error_up1 = "<h3>Koncovky souborů musí byt jpg, jpeg, png nebo gif.</h3>";
			}
			else {
				$cesta = "../img/user/";
				$photo_id = Date("jmYHis", Time());
				$photo_new_name1 = explode(".", $photo_new_name);
				include "../include/prevodni-tabulka.php";
				$photo_new_name2 = strtr($photo_new_name1[0], $prevodni_tabulka);
				$codec1 = explode(".", $photo_new_name);
				$codec2 = $codec1[1];
				$photo_new_name3 = "$photo_new_name2$photo_id.$codec2";
				if (move_uploaded_file($photo_new, $cesta.$photo_new_name3)) {
					$photo_move = "Obrázek $soubor_name byl úspěšně nahrán na server.<br>";

					require_once "../include/db.php";
					$dotaz = mysql_query("SELECT * FROM `XXX` WHERE `login` = '".$_SESSION['login']."'");
					while ($vypis = mysql_fetch_assoc($dotaz)) {
						$login = $vypis['login'];
					}
					$photo_cesta = "XXX".$photo_new_name3;
					mysql_query("UPDATE  `XXX`.`XXX` SET  `photo` =  '$photo_cesta' WHERE  `XXX`.`login` = '".$login."'");
					$vlozeni_info = "<h3>Soubor $photo_new_name3 byl úspěšně zapsán do databáze.</h3>";
				}
			}
		}
		require_once "../include/db.php";
		$dotaz = mysql_query("SELECT * FROM `XXX` WHERE `login` = '".$_SESSION['login']."'");
		while ($vypis = mysql_fetch_assoc($dotaz)) {
			$login = $vypis['login'];
		}
		mysql_query("UPDATE  `XXX`.`XXX` SET  `age` = '$age_new', `born` = '$born_new', `sex` = '$sex_new', `group-visit` = '$group_visit_new', `subject-visit` = '$subject_visit_new', `list-id` = '$list_id_new', `style-web` = '$style_web_new', `type-web` = '$type_web_new', `state` = '$state_new', `city` = '$city_new', `street` = '$street_new', `psc` = '$psc_new', `skype` = '$skype_new', `icq` = '$icq_new', `mobil` = '$mobil_new', `web` = '$web_new', `job` = '$job_new', `school` = '$school_new', `me` = '$me_new' WHERE  `XXX`.`login` = '".$login."'");
		$vlozeni_info = "<h3>Soubory byly úspěšně zapsány do databáze.</h3>";

		$adresa = "XXX";
		Header("Location: ".$adresa) ;
        exit;

	}
	/*if (isset($_POST['back_modify'])) {
		header("location: ".$_SERVER['SERVER_ROOT']."XXX");
	}*/
?>

HTTP odpoveď pozostáva z dvoch častí: na začiatku sú HTTP hlavičky a potom nasleduje samotné telo odpovede. Preto môžeš posielať HTTP hlavičky len dovtedy, kým nezačneš posielať na výstup samotné telo odpovede (ktorým je obvykle HTML). HTTP hlavičky posielaš funkciou header, ale nejaké sa posielajú napríklad aj pri použití funkcie start_session. Preto pred volaním týchto funkcií nemôžeš začať posielať na výstup telo odpovede.

Toľko k teórii, a teraz k samotnému problému. Priamo v chybovej hláške máš napísané, že nemôžeš nastavovať ďalšie HTTP hlavičky, pretože tie už boli odoslané. A odoslané boli preto, lebo si začal na výstup posielať samotné telo odpovede už na 12-tom riadku vo svojom kóde. Keď sa tam pozrieš, tak uvidíš túto zbytočnosť, ktorú treba vymazať:

?> 
<?php

prohodil jsem sessions a ten druhý script a už to jede (y)
a děkuji za vysvětlení headeru, konečně už to chápu, co to přesně dělá a na jakém principu to funguje
k tomu

?>
<?php

to vím, že to je zbytečnost, ale takto jsem si "oddělil" tyto 2 scripty, které nemají nic společného... vk onečném důsledku byhc to smazal... díky <?php ?> přesně vím co k čemu patří, než kdybych si dělal jen poznámky //, /* */ - je to prostě můj styl zápisu/dělení, který v konečném důsledku odstraním

Volanie session_start nastavuje cookie v prípade, že ešte nebol nastavený (cookie sa posiela v HTTP hlavičke). Takže keď si vymažeš cookie, tak ti to prestane fungovať s rovnakou chybovou hláškou ako predtým (bude tam iné číslo riadku).

Ten spôsob delenia je divný a je to príčina problému, na ktorý si narazil. Na rozdeľovanie kódu sa používajú triedy/funkcie, prípadne require/include.

Zpět do poradny Odpovědět na původní otázku Nahoru