Autor Zpráva
xaverista
Profil
Zdravím mám problém,

chtěl jsem udělat funkci, která mi bude porovnávat, zda uživatel má oprávnění nebo ne, pokud ne tak ho přesměruje na index... Nicméně mi funkce nechce kontrolovat, ani vypsat proměnnou... Přikládám kód

$con_users = mysql_query("SELECT * FROM `cp_users` WHERE `username` = '".$nick."' LIMIT 1", $spojeni); 
$info_users = mysql_fetch_array($con_users);

function admin(){
  echo $info_users['group'];
}

správně funkce, která porovnává oprávnění, vypadá takto:

function admin(){
  if($info_users['group'] != 6){
    header("location: /");
    die();
  }
}

a v souboru, kde to chci vypsat/porovnat:

<?php admin(); ?>

děkuji za nápady
juriad
Profil
xaverista:
Funkce může přistupovat pouze k proměnným, které jsou jí předány jako paramery, k superglobálním proměnným $_GET, $_POST, $_FILES, $_SERVER a podobným (není dobrý nápad) a k proměnným označeným jako global (to není vůbec dobrý nápad).
xaverista
Profil
Jak mám tedy postupovat, když potřebuji oveřit pomocí fce zda má oprávnění, nebo ne? abych to nemusel složitě stále vypisovat?
juriad
Profil
To záleží na tom, jaké jsi prase. Pokud velké, stačí do funkce admin připsat řádek:
global $info_users;

Pokud menší, musíš předat funkci admin $info_users jako parametr.

Pojmenovávat tuto funkci admin není dobrý nápad. Není také dobrý nápad porovnávat s náhodou konstantou 6. Ono oprávnění by mělo být řešeno systematičtěji. Samotné přesměrovaní je sice dobrý nápad, ale není dotáhlý do konce (lepší je mu ukázat přihlašovací stránku a po přihlášení ho nasměrovat na požadovanou stránku).

Ta funkce netestuje zda má oprávnění, ta dělá mnohem víc. A to navíc by mělo být odděleno do jiné funkce. Ideálně bys měl mít nějakou reprezentaci uživatele (asociativní pole nebo objekt) a ten předat funkci s požadovaným oprávněním. Funkce t vrátí TRUE nebo FALSE. A podle toho se rozhodneš, zda mu zobrazíš stránku, odkaz, přihlašovací formulář, cokoli.
Alphard
Profil
Ta funkce netestuje zda má oprávnění, ta dělá mnohem víc. A to navíc by mělo být odděleno do jiné funkce.
Konkrétněji řečeno tady chybí oddělený Controller a Autorizátor. Řízení životní cyklu requestu by mělo být svěřeno jediné vrstvě, controlleru* (model ani jiná vrstva si nesmí přesměrovávat, jak ho napadne).
*Povolil bych to i routeru, aby mohl normalizovat adresy.
Joker
Profil
xaverista:
Většinu z toho už zmínili kolegové, ale ještě shrnu:

1. Je-li potřeba předat data do funkce zvenku, dělá se to přes argumenty.
2. Je-li potřeba předat data z funkce ven, dělá se to přes návratovou hodnotu.
3. Funkce má být navržená tak, aby byla pokud možno nezávislá na okolí a použitelná i když budu stejnou funkčnost potřebovat v jiné aplikaci.
4. Funkce by měla dělat jednu věc. Pro orientaci by šlo říci, že na otázku „Co ta funkce dělá?“ by měla existovat odpověď jednoduchou větou. Pokud je odpovědí výčet několika činností, je funkce nejspíš špatně navržená.
xaverista
Profil
Moc díky :-) to že má fce načítat promennou z venku mi úplně mojí blbostí vypadlo

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: