Manualai.lt Forumas
PHP ir SQL => PHP ir SQL - Klausimai ir pagalba => Temą pradėjo: Interneto keleivis 2013-02-26 00:10:46 am
-
Gan įdomiai gaunasi, localhoste jeigu esu atsijungęs (SESSSION['id'] = 0) man priskiriama tik viena konstanta - iGUEST. Jeigu esu prisjungęs - pagal mano teises priskiria tam tikrą konstantą.
Štai branduolys kaip tai vyksta:
<?php
$my_data = DB::queryRaw('SELECT * FROM users WHERE id = %i',$_SESSION['id']) -> fetch_assoc();
if(!(isset($_SESSION['id']))) {
$_SESSION['id'] = 0;
} else {
$teises = main::decode(substr($my_data['permissions'], 0, 2)); // iš permissions laukelio parenka du pirmus simbolius, kuriuose užkoduota mano teisės - tai viena iš raidžių O, A, B , C, D ar E.
define("iREADER",($teises == "E" ? 1 : 0));
define("iMEM",($teises == "D" ? 1 : 0));
define("iAUTHOR",($teises == "C" ? 1 : 0));
define("iMOD",($teises == "B" ? 1 : 0));
define("iADMIN",($teises == "A" ? 1 : 0));
define("iOWNER",($teises == "O" ? 1 : 0));
}
define("iGUEST",(!iADMIN and !iAUTHOR and !iMEM and !iMOD and !iREADER and !iOWNER ? 1 : 0));
?>
Šis mechanizmas puikiai veikia localhoste, bet svetainėje www.simplomino.blg.lt (http://www.simplomino.blg.lt) ...
Index.php pasirašiau štai tokį koduką, atvaizduojantį kokios yra mano teisės bei sesijos id.
<?php
if(iREADER) { echo 'Aš skaitytojas | '; }
if(iMEM) { echo 'Aš narys | '; }
if(iAUTHOR) { echo 'Aš autorius | '; }
if(iMOD) { echo 'Aš moderatorius | '; }
if(iADMIN) { echo 'Aš Adminas | '; }
if(iGUEST) { echo 'Aš svečias | ';}
echo 'SESSION[\'id\'] = '.$_SESSION['id'];
?>
Svetainėje atvaizduoja visas teises, nesvarbu ar svečias aš ar ne.
-
Pirmiausiai, tai konstantos yra skirtos visiškai ne tam, gali naudoti ką nors iš globalių kintamųjų, pvz. sesijas, bet ne konstantas,jos skirtos pastoviai ir vienai reikšmei aprašyti. O po to, tai sąlygos sakiniams naudok if elseif...
-
parodykit pavyzdį kaip su kintamaisiais atpažinti kas tu toks esi? Ar tu svečias, ar tu narys, ar tu adminas?
-
Keleivi, juk minėjo sesijas, tai pvz:
$_SESSION['role'] ir čia saugai rolę....
O define tam negali naudoti...
-
Pasidariau su sesijom, kol kas patestavimui šitaip:
Tiesa daug rašymo
<?php
if(!(isset($_SESSION['id']))) {
$_SESSION['guest'] = TRUE;
$_SESSION['reader'] = FALSE;
$_SESSION['memb'] = FALSE;
$_SESSION['author'] = FALSE;
$_SESSION['admin'] = FALSE;
$_SESSION['owner'] = FALSE;
} else {
$_SESSION['guest'] = FALSE;
$_SESSION['reader'] = TRUE;
$_SESSION['memb'] = TRUE;
$_SESSION['author'] = TRUE;
$_SESSION['admin'] = TRUE;
$_SESSION['owner'] = TRUE;
}
Ir panaikinau sesiją 'id' svečiui, taip daug geriau, negu, kad nustatyta 0 ir po to dar nustatinėk nesąmones visokias.
?>
-
Nu vistiek durnai darai...
Padarai vieną sesiją su ROLE, ten dedi skaičių nuo 0 iki kiek tau reikia. Kiekvienas skaičius reiškia kokią nors rolę ir baigta :)
-
Na štai pasidariau, viskas veikia, perfect.
<?php
if(isset($_SESSION['id'])) {
$my_data = DB::queryRaw('SELECT * FROM users WHERE id = %i',$_SESSION['id']) -> fetch_assoc();
$teises = main::decode(substr($my_data['permissions'], 0, 2));
switch($teises) {
case "O": // owner
$_SESSION['role'] = 1;
break;
case "A": // administrator
$_SESSION['role'] = 2;
break;
case "B": // moderator
$_SESSION['role'] = 3;
break;
case "C": // author
$_SESSION['role'] = 4;
break;
case "D": // member
$_SESSION['role'] = 5;
break;
case "E": // reader
$_SESSION['role'] = 6;
break;
}
}
else {
$_SESSION['role'] = 0; // guest
}
?>
-
siulau rasyti suprantama koda ir nenaudoti tokiu visokiu "id" rolei nusakyti. tiesigo
$_SESSION['role'] = 'admin';
ir viskas
-
a man gerai ir taip. 1, 2 - adminai, 0 - svečias. taigi if($_session['role'] !== 0) { // as prisijungęs } else { /rg } daug man tu visokiu roliu neprireiks jugi :).
-
a man gerai ir taip. 1, 2 - adminai, 0 - svečias. taigi if($_session['role'] !== 0) { // as prisijungęs } else { /rg } daug man tu visokiu roliu neprireiks jugi :).
tiesiog ne su numeriais roles butu labiau lengvai skaitomos ar kaip lietuviskai pasakyti.. more readable and human friendly..
-
a man gerai ir taip. 1, 2 - adminai, 0 - svečias. taigi if($_session['role'] !== 0) { // as prisijungęs } else { /rg } daug man tu visokiu roliu neprireiks jugi :).
tiesiog ne su numeriais roles butu labiau lengvai skaitomos ar kaip lietuviskai pasakyti.. more readable and human friendly..
Iš tikro, jei protinga dokumentacija būtų - galima ir taip :)
-
Lukai, aš darau taip kaip man ir sistemai patogiau, o ne dėl jūsų. Aš nekuriu universalios, nemokamos turinio valdymo sistemos, kad turėčiau būt įpareigotas rašyti human friendly pavadinimus, tuos skaičiukus aš mintinai žinau, tad problemų neturiu :)
-
Lukai, aš darau taip kaip man ir sistemai patogiau, o ne dėl jūsų. Aš nekuriu universalios, nemokamos turinio valdymo sistemos, kad turėčiau būt įpareigotas rašyti human friendly pavadinimus, tuos skaičiukus aš mintinai žinau, tad problemų neturiu :)
paziurek i ta savo koda po savaite, o po menesio? o jei to kodo parasysi ne 100 eiluciu, bet 10 000 ir visur nenaudosi human friendly vardu? Kodas turi buti skaitomas lengvai, nesvarbu kam rasai duotuoju momentu ar sau ar kitiems. Jis turi buti lengvai skaitomas, o kur neina is kodo tiesiogiai suprasti lengvai kas vyksta, nieko nezinant apie programa, tai turi buti bent menkiausias komentaras. Siulau iprasti tai daryti, labai naudingas ir gerbtinas iprotis
-
Lukas teisus, kad reikia readable kodą rašyt. Bet tikrai ne 'admin' ar ten 'supermoderator' ir pan. :) tam juk yra define'ai.
<?php
define('GUEST', 0);
define('ADMIN', 1);
define('SUPER_ADMIN', 2);
// ..........
$_SESSION['role'] = $access;
// ....
if ($_SESSION['role'] < ADMIN) {
// veiksmai ne adminui
}
if ($_SESSION['role'] >= SUPER_ADMIN) {
// veiksmai super adminui
}
// ir pan.
?>
Yra tokia taisyklė. Jeigu skaičius arba koks nors string'as kode pasikartoja daugiau negu 1 kartą ir yra su ta pačia logine prasme, jį reikia padaryt konstanta (arba define'u).
-
Lukas teisus, kad reikia readable kodą rašyt. Bet tikrai ne 'admin' ar ten 'supermoderator' ir pan. :) tam juk yra define'ai.
<?php
define('GUEST', 0);
define('ADMIN', 1);
define('SUPER_ADMIN', 2);
// ..........
$_SESSION['role'] = $access;
// ....
if ($_SESSION['role'] < ADMIN) {
// veiksmai ne adminui
}
if ($_SESSION['role'] >= SUPER_ADMIN) {
// veiksmai super adminui
}
// ir pan.
?>
Yra tokia taisyklė. Jeigu skaičius arba koks nors string'as kode pasikartoja daugiau negu 1 kartą ir yra su ta pačia logine prasme, jį reikia padaryt konstanta (arba define'u).
teisingas pastebejimas ;)
-
Nagi nagi, tai kas čia dabar prieštarauja, tai reikia kurti konstantas, tai nereikia kurti konstantų. Jūs biški apsispręskit ;) Bet dėl konstantų aš sutinku, keletą turėti nepakenktų.
-
Nagi nagi, tai kas čia dabar prieštarauja, tai reikia kurti konstantas, tai nereikia kurti konstantų. Jūs biški apsispręskit ;) Bet dėl konstantų aš sutinku, keletą turėti nepakenktų.
pasiziurek atidziau i pries tai buvusi koda ir sita, logine prasme skiriasi konstantu vartojimo
-
Taip.. Žinot, vakar pasidariau tokią funkciją, panašią kaip jūs čia nurodėt konstantas: esmė ta, kad man nereikėtų rašyti if(// aš admin or // aš superadminas), paprasčiausia funkciją iADM(), jei gražina true, puiku, jei ne, puslapis neprieinamas :D
<?php
public static function iADM() {
if($_SESSION['role'] == 1 or $_SESSION['role'] == 2) {
return TRUE;
} else { return FALSE; }
}
?>
-
1 dalykas. Su konstantom galėtum padaryti tiesiog if ($role >= ADMIN).
2 dalykas. Jei jau nori tokios funkcijos, tai ji gali atrodyti paprasčiau. Pvz taip:
<?php
public static function iADM() {
return ($_SESSION['role'] == 1 or $_SESSION['role'] == 2);
}
?>
-
o ką gražins? skaičių 1 ar 2, ar true/false? Aš tokių subtilybių nelabai žinau, darau senamadiškai :D
-
Nu ką programavimo kalboje gražina operatorius ==? Kodėl jis naudojamas sąlygose, kodėl sąlygoje negali naudoti vieno =? Siūlau pasiskaityti bendrą programavimo logikos literatūrą, nes pastebėjau, kad nežinant pagrindų žmonės bando lipti į viršunę :)