Autor Zpráva
Dranel
Profil
Zdravím, mám níže uvedenou fci na includování stránek z adresářů dle URL, ale nějak mi to nechce šlapat. Mohl by mi to prosím někdo přeorat? Předem dík...

<?php
function ukazstranku() {
if ((string)$_GET['str'] <> '') {

  if ((string)$_GET['rub'] <> '') {
    $kategorie = $_GET['kat'];
    $rubrika = $_GET['rub'];
    if ((string)$_GET['str'] <> '') $stranka = $_GET['str']; else $stranka = "uvod";
    if (is_file("$kategorie/$rubrika/$stranka.php")):
      $nazevstranky = $stranka.".php";
      require ("$kategorie/$rubrika/$nazevstranky");
    elseif (is_file("$kategorie/$rubrika/$stranka.htm")):
      $nazevstranky = $stranka.".htm";
      require ("$kategorie/$rubrika/$nazevstranky");
    elseif (is_file("$kategorie/$rubrika/$stranka.html")):
      $nazevstranky = $stranka.".html";
      require ("$kategorie/$rubrika/$nazevstranky");
    else:
      $nazevstranky = $stranka.".htm";
      require ("notfound.php");
    endif;
  }
  elseif ((string)$_GET['rub'] == '') {
    $kategorie = $_GET['kat'];
    if ((string)$_GET['str'] <> '') $stranka = $_GET['str']; else $stranka = "uvod";
    if (is_file("$kategorie/$stranka.php")):
      $nazevstranky = $stranka.".php";
      require ("$kategorie/$nazevstranky");
    elseif (is_file("$kategorie/$stranka.htm")):
      $nazevstranky = $stranka.".htm";
      require ("$kategorie/$nazevstranky");
    elseif (is_file("$kategorie/$stranka.html")):
      $nazevstranky = $stranka.".html";
      require ("$kategorie/$nazevstranky");
    else:
      $nazevstranky = $stranka.".htm";
      require ("notfound.php");
    endif;
  }

}
else {
$stranka = "uvod";
  if (is_file("uvodnik/$stranka.php")):
    $nazevstranky = $stranka.".php";
    require ("uvodnik/$nazevstranky");
  elseif (is_file("uvodnik/".$stranka.".htm")):
    $nazevstranky = $stranka.".htm";
    require ("uvodnik/$nazevstranky");
  elseif (is_file("uvodnik/".$stranka.".html")):
    $nazevstranky = $stranka.".html";
    require ("uvodnik/$nazevstranky");
  else:
    $nazevstranky = $stranka.".htm";
    require ("notfound.php");
  endif;
}
}
?>
djlj
Profil
ale nějak mi to nechce šlapat
Že by rozbitá šlapátka? Já mám Authory za 400 a jsou fakt výborný, jen dělají díry na podrážce bot.

A teď vážně: zkus blíže popsat, co ti nešlape. Nejsem si jistý, zda se někomu bude chtít s tím babrat.
Mastodont
Profil
No jak se na to dívám, nebylo by lepší namísto kombinace is_file + require prostě použít readfile nebo file_get_contents?
Dranel
Profil
djlj
www.demo8.cz - koukni se sám - skus si proklikat pár položek v menu...

Mastodont
S tím nemám tolik zkušeností... bere to i PHP scripty? Mohl bys mi to přiblížit?
Dranel
Profil
Aha - už jsem na to přišel - nejede to na localhostu (píchnul jsem). Kříží se to totiž s modem_rewrite...

Tím pádem bych vás chtěl požádat o to, jestli ten script nejde nějak zjednodušit/zrychlit/zabezpečit
Mastodont
Profil
Dranel
No, mně především naprosto uniká, proč máš v těch adresářích míchanici PHP a HTML souborů ... buď mám statický web dělaný z HTML souborů a staticky to linkuju, nebo mám dynamický web s články v databázi, které tahám přes nějaký SELECT podle GET parametrů.

Ty nejdřív testuješ, jestli existuje něco.php, když ne, tak testuješ něco.htm a nakonec něco.html. To musíš mít v těch složkách hrozný hokej, ne?
Akacko
Profil
Pokud si ještě dobře pamatuji tak takhle podobně do dělali na linuxsoft.cz v seriálu php, akorát to bylo 4x kratší.
Dranel
Profil
Akacko
Ano, základ je z linuxsoftu... ale mě základ nestačil tak jsem si to obohatil.

Mastodont
Mám v plánu to změnit na DB, ale tohle potřebuju pro střední weby, kde DB nebude. Btw v složkách mám jen php, asi máš pravdu že to htm a html od sebe vyházím, ale tohle si připravuju scripty který budu prodávat - a to musí bejt univerzální.

Jde to tedy prosím nějak zjednodušit/zrychlit/zabezpečit?
tiso
Profil
Dranel - ide.
Dranel
Profil
tiso
Heh dík no :-)

PS: Nechceš prozradit jak?
tiso
Profil
Dranel - a čo za to?
Jan Tvrdík
Profil
To je fakt strašně napsaný, zkusím mu to celý přepsat :)

(Chvíli to potrvá)
PS: Neručim za bezpečnost
Jan Tvrdík
Profil
Nevím, jak to přesně mělo fungovat, tak jsem to zkusil typnout.
Moje tři poznámky:
1. pokud nepředáš parametr kategorie, tak vypíše notice (nevěděl jsem, jak si to přeješ ošetřit)
2. Proměná $nazevstranky je vlastně zbytečná. Nevím, jestli je dál používaná, ale radši jsem ti ji tam nechal.
3. V bezpečnosti se nevyznám (já nikdy takhle šíleně soubory nenačítal), ale IMHO to moc bezpečný není
function ukazstranku()
{
	$pripony = array("php","htm","html");
	if(isset($_GET['kat'])) $kategorie = $_GET['kat'];
	if(isset($_GET['rub'])) $rubrika = $_GET['rub'];
	if(isset($_GET['str'])) $stranka = $_GET['str']; 
	
	if(!empty($stranka))
	{
		$url = empty($rubrika) ? "$kategorie/$stranka" : "$kategorie/$rubrika/$stranka";
		foreach ($pripony as $pripona)
		{
			if(is_file("$url.$pripona"))
			{
				$nazevstranky = "$stranka.$pripona";
				require("$url.$pripona");
				break;
			}
		}
		if(!isset($nazevstranky))
		{
			$nazevstranky = "$stranka.htm";
			require ("notfound.php");
		}
	}
	else
	{
		foreach ($pripony as $pripona)
		{
			if(is_file("uvodnik/uvod.$pripona"))
			{
				$nazevstranky = $stranka.".php";
				require ("uvodnik/$nazevstranky");
			}
		}
		if(!isset($nazevstranky))
		{
			$nazevstranky = "uvod.htm";
			require ("notfound.php");
		}
	}
}
Dranel
Profil
Jan Tvrdík
Díky za ochotu, ale přečtěte si prosím toto vlákno ohledně isset() a empty() - řekl bych, že původní porovnávání <> bylo více na místě.

Nicméně script vypadá výtečně - pokuste se ještě prosím opravit výše uvedené problémy.
Jan Tvrdík
Profil
Operátor <> používám nerad (Mám radši !=) a nevidím důvod proč ho použít zde. Použití isset a empty zde nezpůsobí žádné problémy. Jediná situace, kde by v současné době mohl nastat problém je, když se soubor bude jmenovat 0 (nula) + přípona, což si v reálné situace nedovedu představit.

Ohledně (1.) - řekni, jak chceš danou situaci řešit - killnout skript přes die(), nebo říct že soubor neexistuje, nebo oznámit uživateli že jeho IQ nebylo shledáno dostatečně vysoké pro prohlížení webu :) - stačí si vybrat

Ohledně bezpečnosti je to celý IMHO strašně riskantně navržená archtektura.

PS: Můžeme si tykat :o)
Jan Tvrdík
Profil
Ještě bych měl jednu otázku: Bude $nazevstranky ještě někde později použit ?
Jan Tvrdík
Profil
Jinak ten kód co jsem posílal šel napsat samozřejmě i o kus kratší
function ukazstranku()
{
	$pripony = array("php","htm","html");
	if(isset($_GET['kat'])) $kategorie = $_GET['kat'];
	if(isset($_GET['rub'])) $rubrika = $_GET['rub'];
	if(isset($_GET['str'])) $stranka = $_GET['str']; 
	
	if($stranka != "")
	{
		$url = $rubrika != "" ? "$kategorie/$stranka" : "$kategorie/$rubrika/$stranka";
		foreach ($pripony as $pripona)
		{
			if(is_file("$url.$pripona"))
			{
				$nazevstranky = "$stranka.$pripona";
				require("$url.$pripona");
				break;
			}
		}
	}
	else
	{
		$stranka = "uvod";
		foreach ($pripony as $pripona)
		{
			if(is_file("uvodnik/$stranka.$pripona"))
			{
				$nazevstranky = $stranka.".php";
				require ("uvodnik/$nazevstranky");
			}
		}
	}
	if(!isset($nazevstranky))
	{
		$nazevstranky = "$stranka.htm";
		require ("notfound.php");
	}
}
Dranel
Profil
Jan Tvrdík
PS: Můžeme si tykat :o)
Promiň - já už jsem z tý webtvorby celej zblblej :-)

Operátor <> používám nerad (Mám radši !=) a nevidím důvod proč ho použít zde.
Mimochodem <> není to samé jako != (je to to samé jako !==)

Ohledně (1.)
Jak mu to oznámit? Načíst soubor notfound.php, který je v kořenu webu. Toď vše. Omluvy jsou totiž v tomto souboru :-)

Ohledně bezpečnosti je to celý IMHO strašně riskantně navržená archtektura.
Vím - půjde to přes DB. Tohle potřebuju na středně rozsáhlé weby, které budu tvořit pro lidi (za peníze).
Jan Tvrdík
Profil
Anebo ještě líp :)
function ukazstranku()
{
	$pripony = array("php","htm","html");
	if(isset($_GET['kat'])) $kategorie = $_GET['kat'];
	if(isset($_GET['rub'])) $rubrika = $_GET['rub'];
	if(isset($_GET['str'])) $stranka = $_GET['str']; 
	
	if($stranka == "")
	{
		$stranka = "uvod";
		$rubrika = "";
		$kategorie = "uvodnik";
	}
	$url = $rubrika != "" ? "$kategorie/$stranka" : "$kategorie/$rubrika/$stranka";
	foreach ($pripony as $pripona)
	{
		if(is_file("$url.$pripona"))
		{
			$nazevstranky = "$stranka.$pripona";
			require("$url.$pripona");
			break;
		}
	}
	if(!isset($nazevstranky))
	{
		$nazevstranky = "$stranka.htm";
		require ("notfound.php");
	}
}
Dranel
Profil
Jan Tvrdík
To mě docela zajímá, co z toho ještě vymlátíš :D
Počkám si schválně na ráno (ať tam pls něco zbyde)
Jan Tvrdík
Profil
Mimochodem <> není to samé jako != (je to to samé jako !==)
Ne, zkus si spustit tohle:
<?php
$a = "99";
$b = 99;

echo "!= " . (int)($a != $b) . "<br>";
echo "!== " . (int)($a !== $b) . "<br>";
echo "<> " . (int)($a <> $b) . "<br>";
?>


function ukazstranku()
{
	$pripony = array("php","htm","html");
	if(isset($_GET['kat'])) $kategorie = $_GET['kat'];
	if(isset($_GET['rub'])) $rubrika = $_GET['rub']; else $rubrika = "";
	if(isset($_GET['str'])) $stranka = $_GET['str']; 
	
	if($stranka == "")
	{
		$stranka = "uvod";
		$rubrika = "";
		$kategorie = "uvodnik";
	}
	if(isset($kategorie))
	{
		$url = $rubrika != "" ? "$kategorie/$stranka" : "$kategorie/$rubrika/$stranka";
		foreach ($pripony as $pripona)
		{
			if(is_file("$url.$pripona"))
			{
				$nazevstranky = "$stranka.$pripona";
				require("$url.$pripona");
				break;
			}
		}
	}
	if(!isset($nazevstranky))
	{
		$nazevstranky = "$stranka.htm";
		require ("notfound.php");
	}
}
Jan Tvrdík
Profil
Jinak IMHO je stejně ten zápis s empty lepší než
else $rubrika = "";
+
$rubrika != ""

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0