» »

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
// 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
<?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 ()

gufy123 ::

ena možnost je tud z isset
if (isset ($_SESSION['email']))...

i33a ::

Nobena od teh dveh rešitev mi ne deluje... še vedno je ista napaka.

keworkian ::

Nared var_dump($_SESSION), če imaš sploh kej v sessionu
Obscenities in B-Flat

Phoebus ::

Od kje pa naj bi dobil $email?

i33a ::

pri var_dump($_SESSION) mi izpiše: array(0) { }
Tako, da ne vem kje sem se zmotil...

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

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

Putr ::

1. Nextor motiš se.
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

misek ::

session_start uporabi na začetku kode preden karkoli pošlješ k brskalniku.

i33a ::

Ok, ampak a je uredu če imaš prej napisano še html kodo?
Jaz imam tako:
<html>
...
</html>
<?php
session_start();
...
?>

gufy123 ::

php fajl se mora začeti s php, torej
<?php
session_start();
?>
<html>
...
</html>

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č :)

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!

Zgodovina sprememb…

  • spremenil: Putr ()

Ziga Dolhar ::

https://dolhar.si/

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?

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.

i33a ::

Ok, bom kar sledil temu sistemu.
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

i33a ::

To sem popravil, a še vedno ne skopira datoteke v želeno mapo...

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".
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?

MisterR ::

id datoteke povežeš s idjem uporabnika.

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?)?

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.

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.

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.

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...

Ziga Dolhar ::

MisterR je izjavil:

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/

MisterR ::

Ker sem narobe gledal, sem mislil da on iz baze dobiva podatek za sejo. My mistake.

i33a ::

Kaj bi bilo potem najbolje in najpreprosteje narediti...?
Ker tale moja ideja o sessionu je res neumna...

MisterR ::

Sem ti dal link.

keworkian ::

i33a je izjavil:

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[PHP] Seje

Oddelek: Programiranje
5705 (608) Pimoz
»

AJAX neznana težava

Oddelek: Programiranje
81179 (973) luksorzi
»

Php varen login

Oddelek: Programiranje
203812 (3312) Volk|
»

Koda za prijavo

Oddelek: Izdelava spletišč
81204 (1059) alien01
»

[php] Problem z dinamično stranjo

Oddelek: Izdelava spletišč
111525 (1370) Iskraman

Več podobnih tem