ugrás a tartalomhoz

Hogy Működik a header() függvény?

Medve · 2011. Júl. 5. (K), 13.19
Sziasztok. Nemrég kezdtem el php-val foglalkozni és belefutottam egy valószínüleg triviális problémába, de nem tudok tovább jutni, ezért kérném a segítségeteket.
Az oldal olyasmi mint egy fórum, és a bejegyzések törlésével illetve szerkesztésével van bajom.
meg is mutatnám azt a oldal azon részeit ahol a problémák vannak

<? include('connect.php'); 
if (isset($_REQUEST[cim]))
	{
		$sql="insert into cikkek (datum,cim,tartalom) values(NOW(),'".$_REQUEST[cim]."','".$_REQUEST[tartalom]."')";

		mysql_query($sql);
		echo "<script type='text/javascript'>alert('A bejegyzés sikeresen hozzáadva az adatbázishoz ".$_REQUEST[cim]." néven!');</script>";
		header("location:cikk_edit.php");
		
	}

	

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" />
<title>Adminisztr&aacute;ci&oacute;s oldal -> Mad&aacute;ch Musical T&aacute;nciskola</title>
<script type="text/javascript">
function modosit(){
		r = confirm("Biztos benne, hogy modosítani akarja a bejegyzést?");
		if (r == true){ 
			<?
			if (isset($_REQUEST[modositcim]))
			{
				$sql="update cikkek set cim='$_REQUEST[modositcim]', tartalom='$_REQUEST[tartalom]' where id=$_REQUEST[id]";

				mysql_query($sql);
				echo "alert('bejegyzés frissitve!')";
			}
			?>
		}
		else{}
	}
	</script>
<script type="text/javascript">
function torolcikk(){
		r = confirm("Biztos benne, hogy törölni akarja a bejegyzést?");
		if (r == true){ 
			<?
			if (isset($_REQUEST[szerkeszt]) && $_REQUEST[szerkeszt] == "torol")
		{
			$sql="delete from cikkek where id=$_REQUEST[id]";

			mysql_query($sql);
			echo "alert('bejegyzés törölve!')";
			header("location:cikk_edit.php?szerkeszt=none");

		}
	?>
		}
		else
		{<? header("location:cikk_edit.php?szerkeszt=none"); ?>}
	}

</script>
<script type="text/javascript" src="scriptek/jquery-1.3.2.js"></script>






<link rel="stylesheet" type="text/css" href="editor.css" media="all"></link>
</head>

<body>

<div id="oldalkeret">
<? include('menusor.php'); ?>
<div class="jobboldal">
	<div id="rejtett_doboz1" class="rejtettdiv">
   <form name="uj_cikk" method="post">
   	<span class="felirat2">C&iacute;m:</span><br/>
      <input type="text" name="cim" width="500"/>
      <br/>
      <span class="felirat2">Tartalom:</span><br/>
      <textarea name="tartalom" cols="50" rows="20"></textarea>
      <br/>
      <input type="submit" value="Mentés" onclick="ujcikk()"/>
   </form>
   </div>
	<div id="uj_cikk" class="felirat1">
    &Uacute;j cikk
   </div>
   
   
	<div id="rejtett_doboz2" class="rejtettdiv">
   <form method="post">
   <input type="hidden" name="szerkeszt" />
   <span class="felirat2">Az adatb&aacute;zisban szerepl&otilde; cikkek</span>
   <?
	
		$result=mysql_query("select * from cikkek order by -datum");
		echo "<div id='belso_tabla'><font color='#f5f4f2'><table width='95%'>";
		echo "<tr><th width='80%'>C&iacute;m</th><th width='10%'>T&otilde;rl&eacute;s</th><th width='10%'>M&oacute;dos&iacute;t&aacute;s</th></tr>";
		while ($sor=mysql_fetch_array($result))
		{
				echo "<tr><td>$sor[cim]</td><td align='center' valign='middle'><a href='cikk_edit.php?szerkeszt=torol&id=$sor[id]' onClick='torolcikk()'><img src='elemek/del.png'/></a></td><td align='center' valign='middle'><a href='cikk_edit.php?szerkeszt=szerkeszt&id=$sor[id]'><img src='elemek/mod.png'/></a></td></tr>";
		}
		echo "</table></font></div>";
		
	   if (isset($_REQUEST[szerkeszt]) && $_REQUEST[szerkeszt]== "szerkeszt")
		{ 
		$result=mysql_query("select * from cikkek where id=$_REQUEST[id]");
		$sor=mysql_fetch_array($result);
		?>
	   <form name="cikk_mod" method="post">
      <input type="hidden" name="id" value="<?=$_REQUEST[id]; ?>" />
      <span class="felirat2">C&iacute;m:</span><br/>
      <input type="text" name="modositcim" width="500" value="<?=$sor[cim]; ?>"/>
      <br/>
      <span class="felirat2">Tartalom:</span><br/>
      <textarea name="tartalom" cols="60" rows="10"><?=$sor[tartalom]; ?></textarea>
      <br/>
      <input type="submit" value="Ment&eacute;s" onclick="modosit()"/>
   
      </form>	
		<? }
		
	?>
   
   
   </form>
   </div>   
   <div id="cikk_szerk" class="felirat1">
   Szerkeszt&eacute;s
   </div>
   
   <div id="aktiv_ablak">
   
   </div>
</div>

</div>
</body>
</html>
Minden tök faszán működne rajta, ha a header() függvény csinálná ami a dolga, viszont mindig azt a hibát dobja ki hogy már előzőleg elküldte a header-t és nem akarja módósítani. Kérdésem az lenne hogy Header-t tényleg csak egyszer lehet elküldeni egy munkameneteten belül?
 
1

Ha nincs cache-elve(?) a

H.Z. v2 · 2011. Júl. 5. (K), 13.25
Ha nincs cache-elve(?) a header, akkor csak egyszer küldheted el, még azelőtt, hogy bármi egyebet elküldenél.
Ha csak egy szóköz vagy null karakter megelőzi, már nem fog működni.
(ennyi amit én tudok a témáról, aztán valaki biztosan mond róla többet is)
2

Szuper. és hogyan tudom

Medve · 2011. Júl. 5. (K), 13.28
Szuper. és hogyan tudom cache-elni? Az oldal elején kell meghívni valami függvényt, vagy php.ini-ben kell beállítani?
4

Passz. Talán a webszerver

H.Z. v2 · 2011. Júl. 5. (K), 13.31
Passz. Talán a webszerver konfigjában...
Ingyenes szolgáltatóknál, ahol reklámokkal szemetelik tele az oldalad, általában be van állítva.
7

Lévén reklám a statikus HTML

kuka · 2011. Júl. 5. (K), 13.37
Lévén reklám a statikus HTML dokumentumokba is kerül, arra valószínűleg más megközelítést használnak, például output filtert állítanak be a web szerverben, az pedig röptében hozzácsapja.
5

Pontosabban nem cache, hanem

kuka · 2011. Júl. 5. (K), 13.33
Pontosabban nem cache, hanem buffer, output buffer.
6

Na... ezért volt ott a

H.Z. v2 · 2011. Júl. 5. (K), 13.35
Na... ezért volt ott a kérdőjel. :-)
Köszi.
Ebből következően mégis php.ini, ha általánosságban kell.
8

BOM

solkprog · 2011. Júl. 5. (K), 13.52
Még emelinteném hogy BOM mint olyan is tudod ilyen hibát produkálni. (szerkesztőben kapcsolja ki)
3

A "header('Location...')"

deejayy · 2011. Júl. 5. (K), 13.29
A "header('Location...')" függvényhívás utasítja a brózert, hogy a location után lévő scriptet töltse be, nem törődve azzal, hogy milyen egyéb html kódot kap vagy nem kap a header után.

A lényege az, hogy átirányítson, és nem pedig az, hogy javascript alerteket értelmezzen.

Egyébként hogyan gondoltad ezt a dolgot? Rákattint az alert 'OK' gombjára, és csak utána megy tovább a location-re? Erre inkább a javascript window.location változóját ajánlanám.
10

Ez jó ötletnek tűnik, de...

Medve · 2011. Júl. 5. (K), 14.13
Ez a window.location jó ötletnek tűnik, viszont hiába van confirm ablakom, ha igent ha nemet nyomok akkor is lefuttatja a php scriptet. Valamit én írtam el, vagy ez így eleve rosz konstrukció?

<script type="text/javascript">
function torolcikk(){
		r = confirm("Biztos benne, hogy törölni akarja a bejegyzést?");
		if (r == true){ 
			<?
			if (isset($_REQUEST[szerkeszt]) && $_REQUEST[szerkeszt] == "torol")
		{
			$sql="delete from cikkek where id=$_REQUEST[id]";

			mysql_query($sql);

			

		}
		?>
                alert("bejegyzés törölve!");
		window.location.href="cikk_edit.php?szerkeszt=none";
		}
		else{
                window.location.href="cikk_edit.php?szerkeszt=none";
                }
	}

</script>
11

kliens vs szerver

Poetro · 2011. Júl. 5. (K), 14.21
Kérlek tanuld meg, mi fut a kliens, mi a szerver oldalon. A JavaScript a böngészőben van, és nincs közvetlen kapcsolata a PHPval, azaz nem is tudja irányítani annak működési struktúráját. Nézd meg az oldal HTML forrását a böngészőben és nem fogod benne megtalálni a PHP részt, csakis azért, mert arról nem tud a böngésző, és nem is tudná futtatni.
12

hmm... okés és php-ban van

Medve · 2011. Júl. 5. (K), 14.24
hmm... okés és php-ban van olyan lehetőség mint javascript-ben a confirm ablak???
13

Igazából szeretném

Medve · 2011. Júl. 5. (K), 14.29
Igazából szeretném hülyebiztossá tenni a programot és el szeretném érni hogy mielött az adatbázisba írna valamit kérdezzen rá hogy biztosan akarom-e. Php-hoz full lüke vagyok kb két hete kezdtem el foglalkozni vele és eddig az ilyen problémákat a javascript-es confirm ablakkal oldottam meg. Php-ban nem találtam erre kész függvényt, és fingom sincs hogy lehet ilyet fabrikálni kézzel. Bocs ha nagyon hülyének látszom, csak még nem teljesen világos hogy hogyan működik ez az egész. Eddig én csak kliens oldalon programoztam.
14

Új oldal

Poetro · 2011. Júl. 5. (K), 14.36
Igen, csinálhatsz egy új oldalt, amin egy form van, egy linkkel és egy gombbal. A link visszavisz arra az oldalra, ahonnan a felhasználó jött (ahol a törlés gomb van), a másik pedig megerősíti a törlést, majd onnan dobod vissza a felhasználót valahova. Csináltam neked egy videót, ami mutat egy példát.
15

Király vagy! :D Köszönöm

Medve · 2011. Júl. 5. (K), 15.25
Király vagy! :D
Köszönöm szépen így már jó lesz. :D
És köszönöm mindenki másnak is aki segített a problémám megoldásában. :D
9

Nem fog működni

Poetro · 2011. Júl. 5. (K), 14.13
Ez így ebben a formában nem fog működni. A JavaScript a kliens oldalon, a PHP pedig a szerver oldalon fut. Azaz a böngésző már nem látja a header hívásokat az oldal közepén, mivel az nincs benne a HTML tartalomban. Ha már JavaScriptet használsz a megerősítés feldobására (miért nem használsz hagyományos HTML formot?), akkor abban is oldd meg a felhasználó átirányítását window.location.assign függény használatával, illetve a window.location.href tulajdonság módosításával.