R.E. Login 2.0 -tól oldalak megtekintésének korlátozása és jogok (rangok).

Kérek mindenkit, akinek nem a rangokkal, oldalak megtekintésével van problémája, a következő oldalon kérdezzen:
Meghívós loginrendszer - R.E. Login v2.0

Ez a login talán a legnépszerűbb programom. De való igaz, hogy nem készítettem hozzá részletes használati útmutatót. Mivel egy komplett leírásra egyszerre nincs időm, úgy döntöttem, a leggyakrabban feltett kérdésekre válaszolok. Amik egyben a leglényegesebbek is.

Hogyan kössem regisztrációhoz egy oldal megtekintését?

Teljes oldal letiltása

Ebben a verzióban létezik egy System osztály, ami többek között tartalmaz egy protectedSite() nevű metódust. Ez a metódus mondja meg a loginnak, hogy az adott oldal védett. Tehát nem tekintheti meg akárki. Paraméter nélkül hívva csak a belépést követeli meg. És ilyenkor a config-ban beállított ( Telepítéskor megadott, vagy utólag a classes/Config.class.php -ben beállított ) főoldalra irányít át, vagy külön beállított „Védett oldal fájlja” jelzésű ( config fájlban FILE_PROTECTED_SITE konstans ) oldal esetén utóbbira..

<?php
require_once 'init.php';
System::protectedSite();
?>
Amit ide írok, azt kizárólag belépett user tekintheti meg. A többi át lesz irányítva.

Az oldal egy részének letiltása

Ha az oldalon csak egy rész van, amit nem láthat akárki, akkor a System::$logged változó vizsgálata szükséges. Ami true értéket kap, ha a felhasználó bejelentkezett és false marad, ha még nem lépett be.

<?php
require_once 'init.php';
?>
Ezt a tartalmat bárki láthatja
<?php if (System::$logged) : ?>
       Ezt viszont csak aki bejelentkezett
<?php endif ?>

Bonyolultabb korlátozások jogok megkülönböztetett jogok alapján

A loginban léteznek különböző rangok. Ezek hivatottak a jogosultságokat megkülönböztetni. Alapvetően két fő adatból áll. A változónév, ami alapján programból azonosítani lehet a rangot, és egy név a megjelenítéshez.

Előre beállított rangok

Változó név Név a megjelenítéshez Magyarázat
guest Vendég Be nem jelentkezett felhasználó.
user Felhasználó Egyszerű felhasználó. Alapértelmezett rang a regisztráció után.
banned Tiltott Olyan regisztrált tag, akinek a belépését egy adminisztrátor megtiltotta.
admin Adminisztrátor Korlátozott adminisztrációs jogokkal rendelkező tag.
owner Tulajdonos Teljes körű adminisztrációs jogokkal rendelkező tag. Az első regisztráló ezt a rangot kapja.

Teljes oldal letiltása rangoktól függően.

A már említett protectedSite() metódust lehet használni hozzá. De paraméterként át kell adni a változónevek tömbjét, amely rangú tagoknak engedélyezett az oldal megtekintése.

Fontos tehát, hogy nem azokat kell felsorolni, akik tiltva vannak!

<?php
require_once 'init.php';
System::protectedSite(array('owner', 'admin'));
?>
Amit ide írok, azt kizárólag admin és tulajdonos tekintheti meg. A többi át lesz irányítva.

De

<?php
require_once 'init.php';
System::protectedSite(array('guest', 'user'));
?>
Amit ide írok, azt vendég is láthatja és egyszerű felhasználó is. Viszont se admin, se tulajdonos nem.

A banned rangnak csak beléptetéskor van jelentősége. Így ez egy amolyan kakukktojás rang. Mert ilyen esetben a beléptetés nem történik meg és a rang marad vendég.

Az oldal egy részének letiltása rangok alapján

A System::protectedSite() metódus egy másik metódust használ fel a rangok eldöntésére. A System osztálynak van egy tulajdonsága, ami az aktuális böngésző felhasználót tartalmazza. Ez pedig a System::$user Ennek van egy rank() metódusa, aminek átadva a rangok tömbjét (vagy egyetlen rangott stringként), visszakapjuk logikai értékként, hogy azon rangok közül bármelyikkel is egyezik-e a tag rangja.

<?php
require_once 'init.php';
?>
Ezt mindenki látja.
<?php if (System::$user->rank('user')) : ?>
Ezt csak felhasználó rangúak látják.
<?php endif ?>
<?php if (System::$user->rank(array('owner','admin'))) : ?>
Ezt csak admin és tulajdonos látja.
<?php endif ?>

Új rangokat is fel lehet venni admin felületen. Majd azokat az előbb ismertetett módon lehet vizsgálni.

Tag aktuális rangjának lekérdezése:

Megjelenítendő rangnév

Erre gyakrabban lehet szükség, ezért létezik rá egy metódus szintén. Ez pedig rankName().

echo System::$user->rankName();

Kiírja például, hogy „Adminisztrátor”.

A tag rang ID-jának lekérdezése

A users táblában a rang csak egy id formájában jelenik meg. Mivel ez egy egyszerű tulajdonság, így a következőképpen írható ki:

echo 'Felhasználó rangjának ID-ja:'.System::$user->rank;

A felhasználói jog változónevének lekérdezése

Ez már ritkábban kellhet. inkább az ellenőrzésekre van szükség. Ezért nincs rá külön metódus a userben. Viszont megoldás persze van. Létezik egy Ranks osztály, amit tulajdonképpen a User osztály is felhasznál. Ennek a Ranks osztálynak vannak különböző metódusai. A legáltalánosabb, és egyben az egyetlen lehetőség a rang változójának lekérdezésére a getRank().

        /**
         * A rang egy adatának lekérdezése
         *
         * A $return mező értékét kérdezi le, ha a $by mező értéke $value
         * Ha egy rang sem felel meg a feltételnek, akkor null-t ad vissza.
         *
         * @param string $return Lekérdezendő mező neve
         * @param string $by Milyen mezőnév alapján kérdezzen le
         * @param mixed $value Mi legyen a $by mező értéke.
         * @return mixed
         */

        public static function getRank($return, $by, $value)
        {
                $by = strtolower($by);
                $value = strtolower($value);
                foreach (self::getInstance() as $row)
                {
                        if (strtolower($row[$by]) == $value)
                        {
                                return (is_null($return)) ? $row : $row[$return];
                        }
                }
                return null;
        }

echo 'A felhasználó rangjának változója: '.Ranks::getRank('varname','rankid', System::$user->rank);

Egyéb lehetőségek

Név lekérdezése ID alapján: echo Ranks::getNameById(System::$user->rank);
Név lekérdezése változó alapján: echo Ranks::getNameByVar('admin');
ID lekérdezése változó alapján: echo Ranks::getIDByvar('admin');

A fenti példákban a System::$user változót használtam a tag objektumának elérésére. A profil megtekintése és változtatása oldalakon elég csak a $user változót használni. És az az épp megtekintett tag objektumát adja. Ennek megfelelően változhatnak a megoldások a fenti példákhoz képest.

Kategóriák: 
Megosztás/Mentés

Hozzászólások

Gaborka képe

Hello, először is köszi a leírást! Sokat segített! Másodszor lenne egy kérdésem ehhez a részhez:
<?php
require_once 'init.php';
?>
Ezt a tartalmat bárki láthatja
<?php if (System::$logged) : ?>
Ezt viszont csak aki bejelentkezett
<?php endif ?>

ha azt szeretném, hogy ki is írja, ha valaki nincs bejelentkezve, azt hogy csináljam? (Pl.: van egy oldal, azt csak regisztrált/bejelentkezett felh-ók nézhetik meg, és ha nincs bejelentkezve akkor kiírja, hogy "Nem vagy bejelentkezve. ) Én az "echo" és az "else" parancsot próbálgattam, de mindig szintaktikai hiba volt...

Rimelek képe

Igen, else ág kell. Pontosabban egyszerű if. De ha éppen mindkét ágra szükséged van, akkor persze else is. Ez már alap php szintaktikai kérdés, de azért írok neked példákat és válogass:

<?php if (System::$logged) : ?>
Be vagy jelentkezve
<?php else : ?>
Nem vagy bejelentkezve
<?php endif ?>

Vagy

<?php if (System::$logged) { ?>
Be vagy jelentkezve
<?php } else { ?>
Nem vagy bejelentkezve
<?php } ?>

Vagy

<?php if (System::$logged) :
echo "Be vagy jelentkezve";
else :
echo "Nem vagy bejelentkezve";
endif; ?>

Vagy

<?php if (System::$logged) {
echo "Be vagy jelentkezve";
} else {
echo "Nem vagy bejelentkezve";
} ?>

Vagy

<?php if ( ! System::$logged) : ?>
Nem vagy bejelentkezve
<?php else : ?>
Be vagy jelentkezve
<?php endif ?>

Még sorolhatnám. A lényeg ugyanaz. Számtalan lehetőség van. Ha nem megy így sem, írd be ahogy próbálkoztál. Csak úgy tudok rávilágítani a hibádra.

Gaborka képe

Szia, köszönöm szépen a választ, a második tökéletes lett. Pont erre gondoltam :) Még egyszer nagyon köszi! :)

Tonek képe

Szia.

Nekem olyan kérdésem lenne,hogyan lehetne megcsinálni azt,hogy ki tudjam írni az oldalt bőngészők nevét rangok szerint.
Olyanra gondolok,hogy az oldalon 5 vendég van és 1 admin.

Rimelek képe

Szia, ez a funkció sincs benne. Ha kell, akkor neked kell sql-ből lekérdezni. Amihez kelleni fog a sessions tábla és a users. Össze kell kapcsolnod a két táblát userid szerint. Illetve group by -al csoportosítani rank mező szerint. És egy count függvénnyel ( sql-ben ) megszámolni, hányat tartoznak a csoportba. Azt pedig ki tudod írni az oldalon. De az előzőekben linkelt cikkben megtalálod, hogyan kapod meg a rank mezőből a rang nevét. Viszont figyelembe kell venned azt is, hogy lejárt -e már a session-je a usernek. Ez lesz a nehezebb. De van már rá példa sql a System.class.php -ben. Most nincs időm részletesebb tanácsot írni. Talán majd este, ha el nem felejtem. Addig próbálkozz.

Dual képe

Szia :)

Nagyon hasznosnak vettem a leírásod, ezalapján már kitudtam iratni egy két dolgot.
Viszont arra lennék kiváncsi hogy pl:

A felhasználónevet hogy tudnám kiíratni?
Próbáltam így de nem sikerült:
echo System::$user->userName();

következő, néztem a rank részét, olyat szeretnék megoldani hogy ne kiírja a rangját hanem egy képet mutatna helyette. Akárhogy próbálom, nem megy :/

Köszi előre is

Rimelek képe

Szia.

Felhasználó adatai:
A profil megtekintése oldalról leshetsz. $user->username. Csak az éppen bejelentkezett user esetén elé kerül a System::, ahogy azt te is írtad. De ez nagyjából minden mezőjére igaz. Ha valamit ki akarsz írni a usertől, nézd meg a users táblát, vagy a profiles táblát. És a mező nevével megegyező tulajdonságban megtalálod az értéket. Ha konkrétan egy táblára akarsz hivatkozni, akkor $user->T_users_username is működik. Az aláhúzás az elválasztás. A T_ pedig jelzi, hogy táblanév is benne lesz a tulajdonság nevében. Ez inkább akkor kell, ha mindkét táblában van azonos nevű mező és egyébként kétértelmű lenne.

Rangok képekkel
Használd a rang változónevét a kép neveként. És kiírásnál csak a kiterjesztést kell mögé írnod. Ha nem megy, írd le, hogy próbáltad meg.

Dual képe

Rere :)))
Közben rájöttem :$ Viszont hasznát vettem a $user->T_users_user... változónak :)))
köszi :P

A kép név kiíratásához gőzöm sincs hol keresem :/ ill mi módon :/

+ugye az admin.php-n azt szeretném hogy mikor rákattint az illető akkor ne a settingset adja be.
Mát megcsináltam hozzá a linket, "admin.php?admact=index" csak nem tudom h teszem elsődlegessé :/

Rimelek képe

A képneves dolgot szerintem már nem kéne fejtegetnem, mert a bejegyzésben részletesen leírtam, hogy kapod meg a rang nevét. Onnantól már csak string összefűzés az egész. Egyszerűen felhasználod a képnévhez. De hadd ne én írjam le mindennek a megoldását, ha lehet, te is közel jártál, csak kis javítás kell hozzá képest. Szóval ha valami nem megy, de megpróbáltad, akkor írd le, hogyan próbáltad!

A másik kérdés viszont nem is kapcsolódik a jogosultságokhoz. A loginnak pedig van saját bejegyzése, ahova szintén lehet írni :) És nem is tudom hogy csináltál új oldalt, így röviden annyit, hogy a relogin2/includes/admin.php -ben a $file = 'config_admin'; adja meg, hogy a config töltsön be alapból. Ha nem sikerül ezzel az infóval, kérdezz a login bejegyzése alatt. Köszi.

UI: Nézz utána az emailcímed helyességének, mert nem tudtalak értesíteni a másik kérdésed áthelyezéséről ( A login bejegyzése alá került ).

Dual képe

Hali ...

Nos, én így próbáltam de nem megy :S

if ($var == 'sex')
        {
                $value = ($value == 'f') ? $img = 'Nő'; else $img = 'Férfi';
               

                <img alt="" src="design/img/<?=$img?>.png" />
        }

ugye kezdtem vna itt a kép kiíratását, majd a rangot :D /Bots ha rossz helyre írok :) /

Rimelek képe

Alap szintaktikai hibát vétesz. Lehet, nem egy loginrendszert kéne módosítanod, ha szintaktika sem megy. Sőt, biztos!

if ($var == 'sex')
{
      $value = '<img alt="" src="design/img/'.$value.'.png" />';
}

vagy alt szöveggel:

if ($var == 'sex')
{
      $alt = ($value == 'f') ? 'Nő' : 'Férfi';
      $value = '<img alt="'.$alt.'" src="design/img/'.$value.'.png" />';
}

A női kép legyen f.png, a férfi kép pedig m.png

De hogy a ranghoz is legyen köze a témának, leírom azt is, mert ha ez nem ment, a rangok se fog.
Ezt:

<?php
print "<b>".$user->username.'</b> '. ($user->isOnline() ? "online" : "offline") . ' (' .  $user->rankName().')'; ?>

írd át erre:

<?php
print "<b>".$user->username.'</b> '. ($user->isOnline() ? "online" : "offline") . ' (' .
 sprintf('<img src="%s" alt="%s" />',Ranks::getRank('varname','rankid',
$user->rank),$user->rankName()).')'; ?>
Dual képe

Szia :/

Köszi a segítséget, de nem írja ki :S

A nem kiítatásánálál: csak a szöveget írja ki a weboldalon :S Felmásoltam a megfelelő png-t pedig :S

    if ($var == 'sex')
    {
          $alt = ($value == 'f') ? 'Nő' : 'Férfi';
          $value = '<img alt="'.$alt.'" src="design/img/'.$value.'.png" />';
    }

Ha a value elé teszek egy "/" jelet mint a Te kódodban, akkor az egész oldal eltűnik csak a header marad meg :S

A rangnak megfelelő képeket is elneveztem
ugye: 0-1-2 stb.
Ott viszont ugyan úgy írja ki mint eddig.

Dual képe

Re ....

Hát akár h akarom kiíratni a nemet képpel nem megy :/ Nem értem :SSSS

Rimelek képe

Próbálkozz! Ezt tudom mondani. Ez már messze nem jogosultság kérdés. Még ha egyébként a jogokat is így szeretnéd formázni. Hibakeresést kell végezned. Szívesen segítek / segítünk a codenet.hu fórumon tippekkel. Illetve olvashatsz is a hibakeresésről. Meg talán már javasoltam is egy cikket. Abból én nem tudok neked segíteni, hogy "valamiért nem megy". És itt nem is szeretnék elkalandozni.

Dual képe

Hali Rim Elek.
Megint elakadtam :S
Ugye sql-ben létrehoztam a "csoport" részt. Megis van ki is írja oldalon ..
Viszont changeprofile.php-ba beraktam ownerként hogy onnan is tudjuk alkalmazin :/ De hiába kattintok rá nem csinálja meg :S

Pedig az alapján lett mint az avatár rész.

Íme az egész amiről szó van:

<tr>
                <td colspan="2">Egyéb:</td>
        </tr>
        <tr>
                <td colspan="2">
                        <textarea name="profile[other]" cols="40" rows="5" ><?php print $data['other'] ?></textarea>
                </td>
        </tr><br />
    <?php if (System::$user->rank(array('owner'))) : ?>
    <tr>
    <tr><center><dfn>ADMIN</dfn></center></tr>
    <td></td>
    </tr>
    <tr>
    <td>Csoport:</td>
                        <td><input type="radio" name="profile[csoport]" <?php if($data['csoport'] == "Felhasználó") print 'checked="checked"' ?> value="Felhasználó" />
                        Felhasználó
                        <br />
                        <input type="radio" name="profile[csoport]" <?php if($data['csoport'] == "E-VIP") print 'checked="checked"' ?> value="E-VIP" />
                        E-VIP
            <br />
            <input type="radio" name="profile[csoport]" <?php if($data['csoport'] == "VIP") print 'checked="checked"' ?> value="VIP" />
            VIP
                <br />
                <input type="radio" name="profile[csoport]" <?php if($data['csoport'] == "Admin") print 'checked="checked"' ?> value="Admin" />
            Admin</td>
                </tr>
    <?php endif ?>
        <tr>
                <td colspan="2"><input type="submit" value="Módosítás" /></td>
        </tr>
</table>
</form>

Netán vmit elírtam vna? :/

Dual

Rimelek képe

A classes mappában a ChangeProfile.class.php -ben van a request metódus, ahol a kapott adatokból megkapja a user az új értékeket. Ott kell felvenned a csoportot is a többi mintájára.

Dual képe

Naaaagyon köszi :))))

Dual képe

Még egy gyors kérdés :$$

Ugye van a rangok ... Ugyan így bemásoltam a formot, majd change-classban is felvettem.

Viszont vmiért hiába állítom át, a szerkesztett profilhoz 0 ( vendég ) rankid-ét vesz fel :S :/

Rimelek képe

Mivel a value-ba szöveget írtál. A mező típusa pedig gondolom integer.

deger képe

Még mindig kérdőjelek vannak az ékezetes karakterek helyett...nem értem. Nem használ semmilyen karakterkódolást az egész csak a Te adminodét használja. Amit behívok annak jó a kódolása, de amibe behívom annak nem.

Igazából biztos, hogy valami nagyon egyszerű a megoldás, csak én vagyok láma hozzá :)

A forrásom:

<?php
require_once '/home/gyalradi/domains/gyalradio.hu/public_html/admin2/init.php';
require_once '/home/gyalradi/domains/gyalradio.hu/public_html/admin2/relogin2/userlist.php';
?>

<center><?php
require_once('db.php');
echo'<center><h2>Gyál-FM Szerver-infó '.$version.'</h2><br>';
error_reporting(E_ALL ^ E_DEPRECATED);
$server="87.229.24.114";
$port=8750;
$fp=@fsockopen($server, $port, $errno, $errstr, 120);
$pd='';
if(!$fp) {
    echo "OFFLINE<br>";
   exit;
}
else {
    fputs($fp,"GET /7.html HTTP/1.0\r\nUser-Agent: XML Getter (Mozilla Compatible)\r\n\r\n");
    while(!feof($fp)) { $pd.=fgets($fp, 1024); }
    fclose($fp);
    $pd=ereg_replace(".*<body>", "", $pd);
    $pd=ereg_replace("</body>.*", ",", $pd);
    $p=explode(",",$pd);
}
?><center><br>
<font color="red"><b><u>Gyál-FM Rádió-infó</u></b></font><br><br>
Műsor:<font color="red"><?= $p[6]; ?></font><br>
Max. kapacitás:<font color="red"><?= $p[3];?></font><br>

<font color="red">
<?php
echo $footer;
?>
</font>

Rimelek képe

Te jó ég, téged el is felejtettelek... Már biztosan nem aktuális a kérdés és egyébként nem is ide illik, de azért másnak még érdekes lehet. Én mindent utf-8 -ban mentettem el a fájlokat BOM nélkül. Adatbázis is utf-8. Ennyire kell csak figyelni.

Anonymous képe

a Config.class.php fájl 16. sorában helytelenül szerepel ez a sor DBCHARSET = 'utf8',
erre javítsátok ha még érdekel valakit: DBCHARSET = 'utf-8', Ezzel elvoltam egy darabig mire összehangoltam az oldalt a login rendszerrel. Viszont engem meg nem jelentkeztet ki valamiért...

Rimelek képe

Üdv. Az utf8 volt a helyes. Ha MySQL adatbázisban állítasz be utf8 kódolást, akkor nem kell és nem is szabad kötőjelet tenni az utf után. Ha html meta tag-ben adod meg a kódolást, ott írhatod kötőjellel. Sőt, ott valóban az a helyes, mert az a hivatalos. Persze másképp is felismerhetik a böngészők. Viszont adatbázis esetén nem használunk sehol sem kötőjelet.

Ha nálad gondot okozott, hogy nem volt kötőjel, arra tippelek, hogy valahogy felhasználtad azt a konstanst például az említett meta tag-ben. Ahogy a neve mutatja, csak az adatbázis beállítására való. Ott is inkább a telepítés előtt érdekes.

Az volt a terv, hogy majd könnyen lehet váltani latin2 (iso-8859-2) és utf8 között, de ez megmaradt tervben, mivel a fájlokat is konvertálni kellett volna tudni. A konstans viszont bent maradt. Persze így is van értelme, csak nem sok :) De átírni nem kell.

Kijelentkezés kérdése

A kijelentkezéssel kapcsolatban javaslom, nézd meg ennek a blogbejegyzésnek a tetején "Megjegyzés" blokkban linkelt oldalt is. Ott írtam a különböző tárhelyeken (egy részük már nem létezik) a helyes konfigurálásról.

Anonymous képe

lefrissítettem mindent, kivéve a config file-t.
Íme:

final class Config
{
         const
                /*Adatbázis hoszt*/
                DBHOST = 'mysql10.000webhost.com',
                /*Adatbázis név*/
                DBNAME = '********',
                /*Adatbázis Felhasználó*/
                DBUSER = '********',
                /*Adatbázis Jelszó*/
                DBPASS = '**********',
                /*Tábla prefix*/
                DBPREF = 'relogin_',
                /*Karakterkódolás pl. (utf8)*/
                DBCHARSET = 'utf-8',
                /*Egybevetés*/
                DBCOLLATE = 'utf8_general_ci',
                /*Felhasználónév min hossza*/
                MINLENGTH_USERNAME = '3',
                /*Felhasználónév max hossza*/
                MAXLENGTH_USERNAME = '20',
                /*Jelszó min hossza*/
                MINLENGTH_PASSWORD = '5',
                /*Felhasználó pattern*/
                USERNAME_PATTERN = '^[a-z0-9_]+$',
                /*SMTP használata*/
                SMTP_ON = false,
                /*SMTP szolgáltató*/
                SMTP_HOST = 'localhost',
                /*SMTP port*/
                SMTP_PORT = '25',
                /*Hitelesített kapcsolat*/
                SMTP_AUTH = false,
                /*STMP felhasználó*/
                SMTP_USERNAME = '',
                /*SMTP jelszó*/
                SMTP_PASSWORD = '',
                /*E-mail cím (Feladóként)*/
                MAIL_FROM = '***',
                /*E-mail cím (Válaszcím)*/
                MAIL_TO = '***',
                /*Blokkolt regisztráció*/
                REG_BLOCKED = false,
                /*Blokkolt belépés*/
                LOGIN_BLOCKED = false,
                /*Meghívó mód*/
                INVITATION_MODE = false,
                /*Email aktiváció szükséges*/
                EMAIL_ACTIVATION = false,
                /*Főoldal url-je*/
                FILE_HOME = 'index.php',
                /*Regisztrációs fájl neve*/
                FILE_REGISTER = 'register.php',
                /*Profil fájl neve*/
                FILE_PROFILE = 'profile.php',
                /*Profil módosítás*/
                FILE_CHANGE_PROFILE = 'changeprofile.php',
                /*Elfelejtett jelszó fájl neve*/
                FILE_FORGOTPASS = 'forgotpass.php',
                /*Üzenet olvasó fájl neve*/
                FILE_MESSAGES_READ = 'msgread.php',
                /*Üzenet író fájl neve*/
                FILE_MESSAGES_WRITE = 'msgwrite.php',
                /*Hírek fájlja*/
                FILE_MESSAGES_NEWS = 'news.php',
                /*Bejövő levelek fájlja*/
                FILE_MESSAGES_INBOX = 'msginbox.php',
                /*Kimenő levelek fájlja*/
                FILE_MESSAGES_OUTBOX = 'msgoutbox.php',
                /*User lista*/
                FILE_USERLIST = 'userlist.php',
                /*User kereső*/
                FILE_SEARCH = 'search.php',
                /*Védett oldal fájlja.Ide ugrik jogosultság hibakor*/
                FILE_PROTECTED_SITE = 'index.php',
                /*Kijelentkezés url-je*/
                FILE_LOGOUT = 'logout.php',
                /*Hány mp-ig számítson onlinenak egy user?*/
                MAX_ONLINE_TIME = '30',
                /**/
                PATH_BASE = '/';
        private static $instance;
        private function __construct(){}
        function __get($var)
        {
                if (!isset($this->$var))
                {
                        eval('$ret = self::'.$var.';');
                        return $ret;
                }
        }
        public static function getInstance()
        {
                if (!isset(self::$instance)) {
                        $c=__CLASS__;
                        self::$instance = new $c;
                }
                return self::$instance;
        }
}
Anonymous képe

a probléma lemaradt :) Na szóval a kijelentkezés még mindig hibádzik. Mintha rá sem kattintottam volna a kijelentkezés link-re :/

Anonymous képe

Már minden jó! Persze én voltam a ludas:)
Most az index.php file legelejére tettem és működik :D
Bocsánat a sok post-ért!
későn includeoltam be az init php fájlt.. A header.php fileban includeoltam mert minden oldalon használni szerettem volna és lusta módon egy file-t szerkeszteni...
Tehát így nézett ki

if (!isset($_SESSION)) session_start();
        if(isset($_GET['sort_order']))
        {
                if(trim($_GET['sort_order'])=="ASC" || trim($_GET['sort_order'])=="DESC")
                        $_SESSION['sort_order'] = trim($_GET['sort_order']);
        }
        if(isset($_GET['sort_by']))
        {
                if(trim($_GET['sort_by'])=="orderid" || trim($_GET['sort_by'])=="votes" || trim($_GET['sort_by'])=="views")
                if(trim($_GET['sort_by'])=="orderid")
                        $_SESSION['sort_by']="date";
                else if(trim($_GET['sort_by'])=="votes")
                        $_SESSION['sort_by']="likes";
                else if(trim($_GET['sort_by'])=="views")
                        $_SESSION['sort_by']="views";
                else
                        $_SESSION['sort_by']="date";
        }
        if(!isset($_SESSION['sort_by']))
                $_SESSION['sort_by'] = "votes";
        if(!isset($_SESSION['sort_order']))
                $_SESSION['sort_order'] = "DESC";
        if($_SESSION['sort_by']=="date")
                $sort_by="orderid";
        else if($_SESSION['sort_by']=="likes")
                $sort_by="votes";
        else if($_SESSION['sort_by']=="views")
                $sort_by="views";
        else
                $sort_by="orderid";
        include "functions.php";
       
        $page=1;
        $limit=posts_per_page();
        $next=2;
        $prev=1;
       
       
                                        if((allow_pictures()) && (!allow_videos()) && (!allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1 and type=0");
                                        }
                                        if((!allow_pictures()) && (allow_videos()) && (!allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1 and type=1");
                                        }
                                        if((!allow_videos()) && (!allow_pictures()) && (allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1 and type=2");
                                        }
                                        if((allow_videos()) && (allow_pictures()) && (!allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1 AND type=0 OR type=1");                                     
                                        }
                                        if((!allow_videos()) && (allow_pictures()) && (allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1 and type=0 OR type=2");
                                        }
                                        if((allow_videos()) && (!allow_pictures()) && (allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1 and type=1 OR type=2 order");
                                        }
                                        if((allow_pictures()) && (allow_videos()) && (allow_gifs()))
                                        {
                                                $data = mysql_query("SELECT id FROM media where approved=1");
                                        }
       
       
        //============================================================================================
        $rows = mysql_num_rows($data);
        $last = ceil($rows/$limit);
        if($last==0)
        $last=1;
        if(isset($_GET['page']) && $_GET['page']!='' && ($_GET['page']>=1 && $_GET['page']<=$last))
        {
                $page=$_GET['page'];
                if($page>1)
                $prev=$page-1;
                else
                $prev=$page;
                if($page<$last)
                $next=$page+1;
                else
                $next=$page;
        }
        include "header.php";
Rimelek képe

Önmagában az, hogy egy másik fájlban includeolod az init.php-t, amit pedig beillesztesz mindenhova, nem probléma. Az a probléma, ha az a másik fájl más könyvtárszinten van, mert az init.php az aktuális könyvtárhoz képest hivatkozik egy osztályra, de akkor nagyobb hiba történt volna. Most így nem is tudom, mi lehetett a konkrét gond. Az én fejemben sem olyan friss már ez a login.

Egyre viszont rájöttem. Hogy nem te, hanem én használtam olyan helyen a DBCHARSET konstanst, ahol nem kellett volna. És ez pont az init.php, ahol http fejlécben megadtam a karakterkódolást. Ha ez volt, amit nem ismertek fel a böngészők (bár nekem nem tűnt fel ilyen hiba sosem), javaslom, hogy inkább ott írd át fixen a konstans használata nélkül a kódolást "UTF-8" -ra kötőjelesen. És a config-ban pedig maradjon kötőjel nélküli. Mert ha egyszer újra akarod telepíteni a logint, akkor majd meglepődsz, hogy már a telepítés is hibás, ha nem ismeri fel a kötőjeles kódolást.

U.I.: Az idézett forráskódodban kitöröltem az emailcímeket is, mert hamar rátalálnának a spam robotok.

izzsi képe

Szia Ákos!
Egy kis segítséget szeretnék kérni, hogy adott a relogin_users tábla és egy hirfolyam tábla. A hirfolyam táblában csak regisztráltak által írt hírek tárolódnak és ha van pisti(user rangú) és főnök(owner rangú).
Azt hogyan tudom megcsinálni ha a relogin_users tábla és a hirfolyam tábla a felhasználónevek megegyeznek, akkor a nevük mellett megjelenjen a saját rangjuk. Az $user->rankName() csak a bejelentkezett rangját írja ki.
Segítségedet előre köszönöm
ui.: A jelenlegi ötletem, hogy a hírfolyam táblában letárolom a rangot is.

Rimelek képe

Üdv

Ne a felhasználónévvel, hanem a felhasználó azonosítóval kapcsold össze a táblákat. A nevet igazából sehol se kéne tárolnod. Csal a userid-t. Ahogy én sem tároltam a profiles-ban a nevet újra Csak id-t. És egyszerűen lekérdeztem a users-szel együtt. Neked is ezt kell tenned. Tárolni a userid-t, és lekérdezni a hírfolyam táblával együtt a users-t. Amiben benne van a rangazonosító.

mrhill képe

Üdvözlet! Azon gondolkoztam, hogy hova kellene az átirányítást tenni ahhoz, hogy a külső kezdőlapról, ahol a bejelentkezés modulja van, átdobjon a belső kezdőlapra. A bejelentkezés rendben van, csak nem dob át. A belépés űrlapjához tettem egy kódot. Hova kellene tenni és mit (pl. header(Location:... )?
Egy másik probléma, nem tudom, miért van, hogy ha kilépek, akkor bejön a lap, de ha a vissza gombra kattintok, kiírja a Fox, hogy lejárt a dokumentum, ám ha az előugrott ablakon az Újraküldésre kattintok, akkor bent vagyok a fiókomban. Ez nem túl biztonságos. Ez egy hiba, vagy csak egy kivédetlen rés? (A kilépést végrehajtó php kódjába nem nyúltam.)
Köszönöm segítséged.

mrhill képe

Megtaláltam a megoldást. A belépést elvégző fájlba tettem egy header(Location: )-t. A ProtectedSite() beillesztése után törölnöm kellett az fájlt, mert nem működött (mindig azt írta ki, hogy Protected Site), és a kód törlése után sem változott semmit, amit nem teljesen értek. Hogyan kell használni azt a kódot? Úgy írtam be, ahogy a bejegyzésedben leírtad. Köszönöm előre is.

Rimelek képe

Ez a kilépés és visszaléptetés akkor lehet, ha belépés után azonnal kilépsz. Mivel belépéskor bekerül a http fejlécbe az elküldött név és jelszó. Ha rögtön a kilépésre kattintasz, akkor bár újratölt az oldal, de a vissza gombbal újra elküldheted azt. Ez azért viszonylag ritka. És nem gondoltam erre, de a megoldásod jó lehet. Majd egy újabb verziónál ( ha lesz ) gondolok rá.

A protectedSite -os kérdésedet nem értem. Hogy hogyan kell használni, azt a bejegyzésben írtam. Ha be vagy jelentkezve, akkor nem kéne kiírnia, hogy protectedsite. Sőt, ha máshonnan linkeltél oda, akkor sem. Mert visszairányítana egy megjelölt oldalra. Ha megtalálja. Ha jól let megadva az útvonala.

mrhill képe

A visszalépés most úgy van megoldva, hogy a kijelentkezéskor egyből a kezdőlapra dob, így nem tud visszalépni, teszteltem. A protectedSite-os részt is elolvastam alkalmazás előtt, de biztos valamit elrontottam. Mindegy, a System::logged-del oldottam meg, azzal tökéletes. Köszönöm.

Gábor képe

Szia! nekem olyan problémám lenne, hogy bejelentkezés után ha egy védett lapra akarok menni azonnal kidob hogy jelentkezzek be. Olyan mintha nem regelné be a sessiont, de a classos rendszer miatt nem látom át mi lehet a hiba. Előre is köszi a segítséget.

Rimelek képe

Üdv. Melyik tárhelyen vagy?

A session-öket egyébként adatbázisban tárolja a rendszer. Ha onnan le tudja kérdezni és fel tudja vinni, akkor kell, hogy működjön. Olyankor lehet még hasonló hiba, ha úgy illeszted be a logint egy saját oldalba, hogy ott valami más is használ session-t. Vagy netán kimenetet küld még a login sessionkezelése előtt. Erről persze kellene, hogy dobjon hibaüzenetet, de a hibaüzeneteket ki lehet kapcsolni a tárhelyen.

Gábor képe

Szia!
Köszönöm a válaszod, meglett a hiba a saját sessionjeimmel kavarodott össze :-/
Localhoston fejlesztek Xamppot használok. mert itt gyorsabb az élet mint kapásból webre fejleszteni :)

Gábor képe

Szia!
Lenne még egy kevésbé idevágó kérdésem. A meghívó rendszert próbálom beüzemelni gmail smtp segítségével.
Adminban szépen kitöltöm az adatokat
smtp.googlemail.com, 25 vagy 465 vagy 587 porton próbáltam hitelesítés:on és "Hiba az email küldésnél" ezt kapom. most nyakig vagyok a classokban de nem találom honnan jön ez az üzenet.
Valami ötlet mit rontok el?
Előre is köszönöm, Gábor

Rimelek képe

Ne egyenként keresgéld az ilyen üzeneteket, mert beleőszülsz! Keress egy eszközt, amivel a fájlok tartalmában kereshetsz. És oda írd be az üzenetet. Vagy egy részét, ami feltehetően nem dinamikusan van összeállítva. Ilyen eszköz például a NetBeans, ami egyébként sokban megkönnyítheti a dolgodat programozás közben. Jelen esetben az egész üzenet simán ki van írva. Mégpedig a System.class.php -ben a sendEmail() metódusban.

if (($err = $mailer->send()) !== true) {
        ob_end_clean();
        exit('Hiba az email küldésnél');
}

A $mailer->ErrorInfo változóban van elvileg az utolsó hibaüzenet, amit a PHPMailer írna. Azt hiszem, itt írt olyan infókat, amiket jobbnak láttam nem megjeleníteni a nagyvilágnak, ezért lett ez a nagyon semmitmondó hibaüzenet. És esküdni mernék, hogy az $err változóban volt a hiba, amikor még kiírtam. De a forráskód szerint sosem ad vissza hibaüzenetet, vagy csak nem látom. Mindegy is. De ha ezt beírod a fenti kód helyett:

if (($err = $mailer->send()) !== true) {
      ob_end_clean();
      print '<pre>';
      var_dump($err, $mailer->ErrorInfo);
      print '</pre>';
      exit('Hiba az email küldésnél');
}

Akkor több infót fogsz kapni arról, miért nem ment el az üzeneted. Valószínű, mégsem jó a gmailes smtp.

Amúgy, ha nem a jogokkal, rangokkal kapcsolatos kérdésetek van, inkább a másik bejegyzésnél kérdezzetek: R.E. Login ( komplikált áthelyezni és nincs kedvem hozzá :) )

Kusi képe

Szia!
Kicsit láma kérdésem lesz.
Mi kapcsolja össze a user és a profile táblákat, illetve hol találom azt a funkciót? Ha jól sejtem a system::user-ből lehrt rá hivatkozni és a profilok oldalon elég csak a user.
Lényegében egy második profil sql tábláról lenne szó amit készítenék. Csak ott 1 usernek több profilja lenne(max8db). Ezt szeretném megjeleníteni és módosíthatóvá tenni a profilok oldalon.
Köszi a segítséget! :)

Rimelek képe

Szia

A bejegyzés legelejére betettem most egy megjegyzés blokkot. Kérlek, olvasd el, és legközelebb aszerint kérdezz. Köszönöm!

A user és profile táblákat sql lekérdezésben kapcsolja össze a program. De használja az R.E. DB Objects osztálykönyvtárat. Ettől működik a rendszer úgy, hogy a mezőket simán objektumtulajdonságként le lehet kérdezni.

A classes mappában a User.class.php-ben levő User osztály konstruktorában történik az sql paraméterezése. Ha neked lenne egy harmadik táblád, akkor ide kéne beszúrni új sorba az új tábla nevét és a benne lekérdezendő mezők listáját. De ez akkor működik, ha 1-1 kapcsolat van a táblák között. Azaz egy userhez egy profil tartozik. Ha te 8 profilt is engedni akarsz, azt kénytelen leszel külön lekérdezni ott, ahol szükséges.

Ha a kérdésed csak arra irányult, hogy mi az a mező a táblákban, ami alapján azokat összekapcsolja a program akkor a válasz a userid mező. Ez az elsődleges azonosító, és ez alapján lehet minden más táblából hivatkozni a felhasználóra. Tehát a saját egyedi profil tábládban is ezt kell tárolnod.

Józsika képe

Kedves RimElek!

Telepítettem a RELogin 2.0.3 verziót, de elakadtam egy kicsit, sajnos!
A regisztrációnál a Captcha kód nem jelenik meg!
Ebben kérném a segítséged, hogy mi lehet a hiba, vagy egy olyan másik lehetőség, hogy ezt kiiktatni a rendszerből!
Válaszod előre is köszönöm!
A telepített rendszer jelenleg itt: http://www.galambjozsef.hu/1/register.php

Rimelek képe

Kedves Józsika!

Eltévesztetted a "házszámot" :) Ennek a bejegyzésnek a legelején kiemelve linkeltem azt a bejegyzést, ahova a kérdésed valójában való, és ahol egyébként a választ is meglelheted. Mások is jártak már így. Ezért tettem ki fent a linket annak idején.

Viszont úgy látom, megoldottad a problémát azóta, mert a linkelt oldalon működőnek látszik a captcha.

OsztO képe

Helló!

Az lenne a kérdésem hogy mi lehet a hiba akkor ha telepítés után az eső regisztrációt meg akarom csinálni hogy létrejöjjön a tulajdonosi felhasználó de amikor rányomok hogy regisztráció folyton hibát ír. "Hiba történt:
Érvénytelen ellenőrzőkód!"
Pedig az ellenőrzőkódom helyesen lett megadva. Akár mit teszek mindig ez a hiba üti fel a fejét.

Rimelek képe

Helló. Ugyanazt tudom mondani neked is, mint az előtted kérdezőnek. A bejegyzés elején linkelt oldalon egyébként pont nem rég válaszoltam meg egy hasonló kérdést. Kérlek, próbáld meg az alapján felderíteni a hibát. Ha nem megy, akkor ott még kérdezhetsz.

A hasonló kérdést és utána a válaszaimat a következő linkre kattintva találod meg:
LINK

furminka képe

Üdv ! a kérdésem a következő.
van egy adott oldalam www.valami.atw.hu
na most lényegtelen hogy atw mert a lényeg az hogy ha beírom hogy www.valami.atw.hu/userlist.php akkor kiírja az felhasználó listát. Nos a kérdésem az lenne hogy ezzel a kóddal tudom meg akadályozni azt hogy ne mutassa :
<?php
require_once 'init.php';
System::protectedSite();
?>
?? És ha igen akkor pontosan hová kéne beillesztenem ? A classes/Config.class.php -ba ? de az elejére ? :/ bocsánat hogy ilyen értesületlen vagyok meg hogy ilyen dolgokat kérdezek !

Rimelek képe

Természetesen nem a config-ba. Egészen egyszerűen a userlist.php -be kell tenned, hiszen azt akarod védeni. Nem a config-ot. Amivel egyébként az összes oldalt védenéd. Beleértve a logint is. Érdekes volna, ha csak bejelentkezve jelentkezhetnél be :)

Egyébként azt jegyezd meg, hogy a relogin mappában levő fájlokat, ahol a classes mappa is van, ne módosítsd soha! Az azon kívüliek mind szabad préda. Nem azért, mert a többit ne lenne szabad, hanem mert nem kell. És nem ajánlott, ha nem valami határozott szándékkal, megfelelő hozzáértéssel próbálkozol.

Dual képe

Heyho :)

Nos, olyannal küszködöm már egy ideje, hogy van a profile.php adatok amiket bekér a relogin2/includes/profile.php -ből.

  <table border="0" align="center">
$alap = array(
        'regtime'                               => 'Regisztrált:',
        'logintime'                             => 'Belépett:',
        'refreshtime'                   => 'Frissített:',
        'onlinetime'                    => 'Online ideje:',
        'lastname'                              => 'Vezetéknév:',
        'firstname'                             => 'Keresztnév:',
        'birthdate'                             => 'Született:',
        'country'                               => 'Ország:',
        'city'                                  => 'Város:',
        'website'                               => 'Weboldala:',
        'T_users_useremail'             => 'E-mail címe:',
        'skype'                         => 'Skype:'
       
);

s ezt ugye így listázza ki adatlapnál:

<?php foreach ($alap as $var => $cimkek) {
        $value = trim($user[$var]);
        if (empty($value)) continue;

        else if ($var == 'T_users_useremail' and !$user->public_mail)
        {
                if (System::$user->rank != 1 and $user != System::$user) continue;
                $value = "Rejtett: ".$user->T_users_useremail;
        }
        else if($var == 'onlinetime')
        {
                $value = User::getOnlineTime($user->onlinetime,'{day} nap, {hour} óra, {min} perc és {sec} mp');
               
        }

        $value = nl2br(htmlspecialchars($value));
        if ($var == 'website')
        {
                $value = trim($value);
                if (!empty($value))
                {
                        $value = "<a href='".$value."'>Link</a>";
                }
        }
        ?>
        <tr>
                <td valign="top"><?php print $cimkek ?></td>
                <td valign="top"><?php print $value; ?></td>
        </tr>
   
<?php } ?>
</table>
<?php } ?>

Nos, olyat próbáltam hogy megkettőztem a

$alap = array(
);

részt más névvel: pl $loged = array( );

S az adatlapnál is logedként szerettem volna lekérni, viszont ami ott van rész azt nem írja ki, vagy eltűnik az egész :/ Miért lehet?

Rimelek képe

Egy részt ezt nem értem, mert nem használtam $alap változót. Más részt a kérdésedet sem értem, hogy mit akarsz. Harmad részt pedig te már nem a login nehézségeivel küzdesz, hanem a PHP-val. Talán több ideig kellene próbálkoznod és megtanulnád, mit hogy kell. Tehetsz egy kísérletet a problémád érthetőbb leírására, de az ilyen fejlesztésekhez tényleg megfelelő PHP ismeret kell. És miközben ilyeneket kérdezel, a valóban a loginrendszerrel kapcsolatos kérdések és válaszok elvesznek az oldalak közt.

Mellesleg ez itt a jogok és rangok bejegyzése. Tehát mi a kérdésed a jogokkal és rangokkal kapcsolatban.

Dual képe

Tudom hogy Te nem az $alap változót használtad :) hanem a $title-t
Részben jogokkal kapcsolatos az amit meg szeretnék oldani xD

a title változót 2 szedni.
azaz: $alap > csak a nicket, rangot regisztrációt írná ki

<?php if (System::$user->rank(array('owner','admin','user','vip'))) : ?>
$loged > mikor frissitet, regiszrált, weboldal stb stb
<?php endif ?>

Remélem így érthetőbben írtam le :D
A.

Rimelek képe

Vagyis igazából az a gondod, hogy nem jelenik meg amit a feltételbe írtál?