Forum » Izdelava spletišč » Php register/login problem
Php register/login problem
i33a ::
Živjo, naredil sem spletno stran in na njej registre/login sistem.
Registracija deluje pravilno, login pa samo delno.
Ko v obrazec za prijavo vnesem up ime in geslo mi javi da je prijava uspešna, ko pa kliknem povezavo do member.php pa mi ta javi da se moram prijaviti. Vse delam z sessioni... najdete kakšno napako v kodi? ali bi se stvari moral drugače lotiti?
V Login.php
Member.php
Kje je napaka?
Se naj tega lotim drugače? kako?
Lp
Registracija deluje pravilno, login pa samo delno.
Ko v obrazec za prijavo vnesem up ime in geslo mi javi da je prijava uspešna, ko pa kliknem povezavo do member.php pa mi ta javi da se moram prijaviti. Vse delam z sessioni... najdete kakšno napako v kodi? ali bi se stvari moral drugače lotiti?
V Login.php
// Sem že povezan z podatkovno bazo //preverjanje pravilnosti vnosa $_SESSION['email'] = $email; // email je vnešen e-mail in se uporablja kot uporabniško ime
Member.php
<?php session_start(); if($_SESSION['email']){ echo "Dobrodošel, ".$_SESSION['email']; } else die("Prijavi se!"); ?>
Kje je napaka?
Se naj tega lotim drugače? kako?
Lp
Nextor ::
email variable ni nastavljen kot boolean, se pravi ne moreš preverjat "if($_SESSION['email'])", lahko samo if($_SESSION['email'] == "tvoj mail")
Login.php
Member.php
http://hungred.com/useful-information/p...
Login.php
<?php session_start(); $_SESSION['email'] = $email; $_SESSION['prijava'] = true; ?>
Member.php
<?php session_start(); if($_SESSION['prijava']) { echo "Dobrodošel, ".$_SESSION['email']; } else die("Prijavi se!"); ?>
http://hungred.com/useful-information/p...
Zgodovina sprememb…
- spremenilo: Nextor ()
krho ::
tam, kjer se session sploh ne shrani na disk. permission problem.. programiraš pa s production setting php.ini..
si.Mail odprto-kodni odjemalec elektronske pošte. - http://www.simail.si
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
Uredite si svojo zbirko filmov, serij in iger - http://xcollect.sf.net
i33a ::
Še nikoli nisem imel tega problema.
Kaj moram zdaj narediti v setting php.ini?
Je to problem na računalniku in je koda uredu ali moram popraviti tudi to kodo?
Lp
Kaj moram zdaj narediti v setting php.ini?
Je to problem na računalniku in je koda uredu ali moram popraviti tudi to kodo?
Lp
Putr ::
1. Nextor motiš se.
je povsem valid v PHP, vendar bo, vkolikor je vrednost NULL vrglo notice. V funkciji empty() imaš med return values spisek vseh vrednosti, ki jih PHP smatra za false, ostalo smatra za true. To je feture not a bug, vendar rado povzroča preglavice.
2. i33a zakaj sploh delaš custom login? Če to delaš da se učiš je to seveda zelo dobro in pohvalno, vkolikor je to production site ti toplo svetujem kakšen CMS (wordpress, drupal, simplecms, ...) ali pa saj support z frameworkom (zend framework, symphony). Vsekakor si preberi kaj tudi o varnosti prijav.
3. Koda v teoriji zgleda dobro. Tvoj problem lahko povzročajo naslednje stvari:
- Napačna konfiguracija PHP+serverja(nginx, apache) zaradi česar se ti session ne shranjuje.
- Izklopljeni cookiji na tvojemu browserju (session se tracka z cookiji)
- V login.php ne zaštartaš sessiona (ok to ne vem a bi ti vrgl error al bi nastavl samo navadn variable. Preveri)
- V login.php po tem ko nastaviš email le-tega zbiršeš, unsetaš. To testiraj tako da dodaj še kaj drugega v session in v member.php dumpaj cel SESSION. Glej da dumpaš po tem ko zastartaš session.
Vsekakor pa če se ti napaka nadaljuje prilepi celo kodo v en pastebin in dodaj link da pogledam vse.
4. Pametno bi bilo preveriti (vkolikor to ne veš) če imaš vkolpljeno poročanje napak. Pojdi v php.ini in preveri error reporting da ti poroča VSE napake. To seveda delaš na localhost ali development strežniku.
if($_SESSION['email']){
je povsem valid v PHP, vendar bo, vkolikor je vrednost NULL vrglo notice. V funkciji empty() imaš med return values spisek vseh vrednosti, ki jih PHP smatra za false, ostalo smatra za true. To je feture not a bug, vendar rado povzroča preglavice.
2. i33a zakaj sploh delaš custom login? Če to delaš da se učiš je to seveda zelo dobro in pohvalno, vkolikor je to production site ti toplo svetujem kakšen CMS (wordpress, drupal, simplecms, ...) ali pa saj support z frameworkom (zend framework, symphony). Vsekakor si preberi kaj tudi o varnosti prijav.
3. Koda v teoriji zgleda dobro. Tvoj problem lahko povzročajo naslednje stvari:
- Napačna konfiguracija PHP+serverja(nginx, apache) zaradi česar se ti session ne shranjuje.
- Izklopljeni cookiji na tvojemu browserju (session se tracka z cookiji)
- V login.php ne zaštartaš sessiona (ok to ne vem a bi ti vrgl error al bi nastavl samo navadn variable. Preveri)
- V login.php po tem ko nastaviš email le-tega zbiršeš, unsetaš. To testiraj tako da dodaj še kaj drugega v session in v member.php dumpaj cel SESSION. Glej da dumpaš po tem ko zastartaš session.
Vsekakor pa če se ti napaka nadaljuje prilepi celo kodo v en pastebin in dodaj link da pogledam vse.
4. Pametno bi bilo preveriti (vkolikor to ne veš) če imaš vkolpljeno poročanje napak. Pojdi v php.ini in preveri error reporting da ti poroča VSE napake. To seveda delaš na localhost ali development strežniku.
Zgodovina sprememb…
- spremenil: Putr ()
i33a ::
Putr: Učim se še ja, ob tem pa probam narediti neko spletno stran ki pa verjetno nikoli nebo uporabna, ker se to da z CMS-i narediti v 5 min :)
Zdaj sem sledil še enemu tutorialu LINK pa mi deluje vse kot bi moralo.
Zdajle sem pa opazil, da v login.php nisem pravilno napisal: session_start();
Ko napišem to mi še v login.php izpiše error: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\...\login.php:25) in C:\xampp\htdocs\...\login.php on line 26.
V vrstici 26 pa se nahaja koda: session_start();
Je mogoče zdaj kaj bolj jasno kje je napaka?
Lp
Zdaj sem sledil še enemu tutorialu LINK pa mi deluje vse kot bi moralo.
Zdajle sem pa opazil, da v login.php nisem pravilno napisal: session_start();
Ko napišem to mi še v login.php izpiše error: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\...\login.php:25) in C:\xampp\htdocs\...\login.php on line 26.
V vrstici 26 pa se nahaja koda: session_start();
Je mogoče zdaj kaj bolj jasno kje je napaka?
Lp
i33a ::
Ok, ampak a je uredu če imaš prej napisano še html kodo?
Jaz imam tako:
Jaz imam tako:
<html> ... </html> <?php session_start(); ... ?>
misek ::
i33a, v splošnem lahko. Vendar ne v tvojem primeru, ker ne smeš ničesar poslati brskalniku. In ta html koda se pošlje preden se začne izvajati php koda.
i33a ::
Uff... pa res! Hvala za pomoč. Zdaj deluje uredu :)
Zanima me še kako bi zdaj povezavo do member.php ob uspešni prijavi lahko prikazal na določenem mestu v html kodi, ker sedaj seveda povezavo izpiše ne vrhu strani. Obstaja kakšen enostaven način? Če pa bom pa malo drugače naredil vse skupaj.
Hvala vsem za pomoč
Zanima me še kako bi zdaj povezavo do member.php ob uspešni prijavi lahko prikazal na določenem mestu v html kodi, ker sedaj seveda povezavo izpiše ne vrhu strani. Obstaja kakšen enostaven način? Če pa bom pa malo drugače naredil vse skupaj.
Hvala vsem za pomoč
Putr ::
i33a:
PHP engine v defaultu deluje tako da takoj ko dobi nekaj za izpis to pošlje browserju. Če je to prvi izpis prej pošlje še HTML headerje. Cookiji so v HTML headerju in session_start() upravlja z temi cookiji (nastavi novega, posodbi itd.) zato mora biti klicana preden imaš kaj izpisa drugače zamudiš priložnost za vstavljanje v headerje.
To rešiš tako da z izpisom začneš kasneje. Vendar najbolj pravilno, pregledno in daleč najlažje za na dolgi rok je če HTML kodo in PHP kodo ločiš saj nimata kaj skupaj počet. (ločit tudi CSS in JS kodo).
To narediš tako da HTML kodo (izpis) prestaviš v template fajle. O tem si lahko prebereš več na internetu, vendar ti svetujem da vzameš v roke en obstoječ CMS in se malo poigraš z njim da vidiš kako obstoječi delujejo nato pa poskusiš to replicirat sam. (to odgovori tudi tvoje vprašanje, ki si ga ravno podal)
Good luck!
PHP engine v defaultu deluje tako da takoj ko dobi nekaj za izpis to pošlje browserju. Če je to prvi izpis prej pošlje še HTML headerje. Cookiji so v HTML headerju in session_start() upravlja z temi cookiji (nastavi novega, posodbi itd.) zato mora biti klicana preden imaš kaj izpisa drugače zamudiš priložnost za vstavljanje v headerje.
To rešiš tako da z izpisom začneš kasneje. Vendar najbolj pravilno, pregledno in daleč najlažje za na dolgi rok je če HTML kodo in PHP kodo ločiš saj nimata kaj skupaj počet. (ločit tudi CSS in JS kodo).
To narediš tako da HTML kodo (izpis) prestaviš v template fajle. O tem si lahko prebereš več na internetu, vendar ti svetujem da vzameš v roke en obstoječ CMS in se malo poigraš z njim da vidiš kako obstoječi delujejo nato pa poskusiš to replicirat sam. (to odgovori tudi tvoje vprašanje, ki si ga ravno podal)
Good luck!
Zgodovina sprememb…
- spremenil: Putr ()
i33a ::
Hvala za vse nasvete, zdaj vse deluje kot mora
Za naprej sem pa mislil, da bi naredil nek file uploader, z katerim bi lahko datoteke uploadal na server.
To sicer že znam, ampak bi rad dosegel, da bi lahko vsak uporabnik dostopal samo do svojih datotek.
Ima kdo kakšno idejo/uporaben tutorial/link?
Za naprej sem pa mislil, da bi naredil nek file uploader, z katerim bi lahko datoteke uploadal na server.
To sicer že znam, ampak bi rad dosegel, da bi lahko vsak uporabnik dostopal samo do svojih datotek.
Ima kdo kakšno idejo/uporaben tutorial/link?
Putr ::
Za to rabiš nek sistem pravic.
1. Rabiš bazo uporabnikov
2. Rabiš bazo datotek
3. Povezavo med obema bazama
4. Datoteke serviraš prek umesnika in ne direktno z webserverjom. Torej imaš en php file, user pride gor, preveriš kdo je, preveriš če ima dostop do fajla k ga želi in če ima mu ga serviraš.
To je najbolj basic pristop.
1. Rabiš bazo uporabnikov
2. Rabiš bazo datotek
3. Povezavo med obema bazama
4. Datoteke serviraš prek umesnika in ne direktno z webserverjom. Torej imaš en php file, user pride gor, preveriš kdo je, preveriš če ima dostop do fajla k ga želi in če ima mu ga serviraš.
To je najbolj basic pristop.
i33a ::
Ok, bom kar sledil temu sistemu.
Ampak imam že nov problem: Nalaganje datotek.
Napisal sem kodo:
Ter:
Kdo mogoče ve zakaj ne dela? Sicer ne izpiše nobenega errora, a tudi datoteke ne naloži.
Ampak imam že nov problem: Nalaganje datotek.
Napisal sem kodo:
<?php session_start(); include 'nalozi.php'; if($_SESSION['email']){ if(isset($_FILES['file'])){ $errors = array(); $allowed_ext = array('jpg', 'jpeg', 'gif', 'docx', 'doc', 'pdf'); $file_name = $_FILES['file']['name']; $file_ext = strtolower(end(explode('.',$file_name))); $file_size = $_FILES['file']['size']; $file_tmp = $_FILES['images']['tmp_name']; if(in_array($file_ext, $allowed_ext) === false){ $errors[] = 'Extension not allowed'; } if($file_size > 2097152){ $errors[] = 'File size must be under 2mb'; } if(empty($errors)){ if(move_uploaded_file($file_tmp, 'C:\xampp\htdocs\ZOTKS\files\\'.$file_name)){ echo 'File uploaded'; } } else{ foreach($errors as $error){ echo $error, '<br/>'; } } } } else{ echo "Prijavi se!"; } ?>
Ter:
<html> <head> </head> <body> <form action="nalaganje.php" method="POST" enctype="multipart/form-data"> <p> <input type="file" name="image" /> <input type="submit" value="Upload" name='upload' /> </p> </form> </body>
Kdo mogoče ve zakaj ne dela? Sicer ne izpiše nobenega errora, a tudi datoteke ne naloži.
keworkian ::
$file_name = $_FILES['file']['name']; $file_ext = strtolower(end(explode('.',$file_name))); $file_size = $_FILES['file']['size']; $file_tmp = $_FILES['file']['tmp_name'];
Obscenities in B-Flat
Mesar ::
http://php.net/manual/en/function.move-...
"The destination directory must exist; move_uploaded_file() will not automatically create it for you." + preveri kaj piše pri "Notes".
"The destination directory must exist; move_uploaded_file() will not automatically create it for you." + preveri kaj piše pri "Notes".
Your turn to burn!
Zgodovina sprememb…
- spremenil: Mesar ()
i33a ::
Hvala za linke. Zdaj sem rešil tudi to
Zaenkrat imam bazo uporabnikov, bazo datotek(ime datoteke, lastnik datoteke).
Kako naj naredim povezavo med bazama?
In kako naj to da, bo uporabnik lahko videl, datoteke ki si jih lasti in jih tudi prenesel z strežnika?
Zaenkrat imam bazo uporabnikov, bazo datotek(ime datoteke, lastnik datoteke).
Kako naj naredim povezavo med bazama?
In kako naj to da, bo uporabnik lahko videl, datoteke ki si jih lasti in jih tudi prenesel z strežnika?
i33a ::
Ja to vem, a ne vem točno kako bi se tega lotil?
Verjetno je kakšna funkcija, ki bi primerjala ti 2 polji in izpisala tiste ki imajo enak id.
Ampak potem pa nevem kako naj naredim, da se bodo v ta tekst dodali linki?
Bi moral potem preprečiti tudi brskanje uporabnikov po datotekah(z htaccess mogoče?)?
Verjetno je kakšna funkcija, ki bi primerjala ti 2 polji in izpisala tiste ki imajo enak id.
Ampak potem pa nevem kako naj naredim, da se bodo v ta tekst dodali linki?
Bi moral potem preprečiti tudi brskanje uporabnikov po datotekah(z htaccess mogoče?)?
MisterR ::
2 select stavka, ampak razmisli o tem, kaj če bo več uporabnikov imelo dostop do iste datoteke.
To lahko rešiš z vmesno tabelo ali uporabiš serializacijo.
To lahko rešiš z vmesno tabelo ali uporabiš serializacijo.
i33a ::
Zaenkrat bom naredil to na bolj enostaven način, kasneje bom pa poizkušal še to z vmesno tabelo in serializacijo.
Kaj pa naj vnesem v select stavka in kako naj ju potem primerjam?
O tem res zaenkrat še ne vem veliko, ker se do zdaj nisem toliko ukvarjal z podatkovnimi bazami... zato bi rabil malo pomoči vsaj da začnem.
Kaj pa naj vnesem v select stavka in kako naj ju potem primerjam?
O tem res zaenkrat še ne vem veliko, ker se do zdaj nisem toliko ukvarjal z podatkovnimi bazami... zato bi rabil malo pomoči vsaj da začnem.
MisterR ::
1.$id_uporabnika = select id from uporabniki where username = $username
2. select * from datoteke where id_uporabnika = $id_uporabnika
Lahko uporabiš tudi JOIN, preberi si kako se sploh dela z bazami da se neboš preveč zapletal. Najbolje je tudi da podatke o uporabniku ki jih znova in znova uporabljaš shranjuješ v sejo ali kam drugam, da ne delaš preveč poizvedb.
2. select * from datoteke where id_uporabnika = $id_uporabnika
Lahko uporabiš tudi JOIN, preberi si kako se sploh dela z bazami da se neboš preveč zapletal. Najbolje je tudi da podatke o uporabniku ki jih znova in znova uporabljaš shranjuješ v sejo ali kam drugam, da ne delaš preveč poizvedb.
i33a ::
Bi bilo uredu tudi tako nekako? da bi uporabil kar ime seje za ime uporabnika, ker sta imeni isti?
<?php session_start(); $connect = mysql_connect("localhost", "root", ""); mysql_select_db("abc"); $id_uporabnika = $_SESSION['email']; $results = mysql_query("SELECT * FROM datoteke WHERE uporabnik = $id_uporabnika"); echo $results; ?>
MisterR ::
Bi šlo skozi, ampak $id_uporabnika = $_SESSION['email']; bi moral dati za mysql select.
Drugač pa tukaj je dokaj simpl način.
http://forum.codecall.net/php-tutorials...
Drugač pa tukaj je dokaj simpl način.
http://forum.codecall.net/php-tutorials...
Ziga Dolhar ::
Bi šlo skozi, ampak $id_uporabnika = $_SESSION['email']; bi moral dati za mysql select.
Zakaj bi pa to storil?
(No, mene sicer prej zvije ob zaupanju, da $_SESSION['email'] obstaja, in zaupanje, da ima ne-zlobno vrednost, ki ne bo storila harakirija nad bazo.)
https://dolhar.si/
i33a ::
Kaj bi bilo potem najbolje in najpreprosteje narediti...?
Ker tale moja ideja o sessionu je res neumna...
Ker tale moja ideja o sessionu je res neumna...
keworkian ::
Kaj bi bilo potem najbolje in najpreprosteje narediti...?
Ker tale moja ideja o sessionu je res neumna...
Da daš vsakemu userju en unikaten ime mape in notr namečeš fajle.
Obscenities in B-Flat
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [PHP] SejeOddelek: Programiranje | 705 (608) | Pimoz |
» | AJAX neznana težavaOddelek: Programiranje | 1179 (973) | luksorzi |
» | Php varen loginOddelek: Programiranje | 3808 (3308) | Volk| |
» | Koda za prijavoOddelek: Izdelava spletišč | 1204 (1059) | alien01 |
» | [php] Problem z dinamično stranjoOddelek: Izdelava spletišč | 1523 (1368) | Iskraman |