ugrás a tartalomhoz

Php-ban saját függvény írása, meghívása

geforce9600gt · 2012. Nov. 11. (V), 23.41
Hello

Valaki eltudná magyarázni nekem, hogy php-ban ha írunk függvényt, akkor milyen célra irjuk? Mármint milyen kódot írunk bele...adatbázis műveleteket, lekérdezést, ciklust...és hogy hivjuk meg ezt a függvényt?

Van egy kis kódom, ezzel a jelszavát tudja módosítani a user. Ez jó így ahogy van(isset-el aktiválódik), vagy ezt is lehetne függvénnyé alakítani?

if(isset($_POST['jelszo_submit']))
{
	$jelszavam=$user_adat['Jelszo'];
	$en=$user_adat['Felhasznalonev'];
	$pass1=mysql_real_escape_string($_POST['pass1']);
	$pass_hiba=array();
	if($pass1==$jelszavam)
	{
		$pass2=mysql_real_escape_string($_POST['pass2']);
		if(strlen($pass2)>=6 && strlen($pass2)<=15)
		{
			$pass3=mysql_real_escape_string($_POST['pass3']);
			if($pass2==$pass3)
			{
					$pass_csere=mysql_query("update regisztracio set Jelszo='$pass2' where Felhasznalonev='$en'");
					$_SESSION['adatok']['Jelszo']=$pass2;
					$pass_modosit=1;
					$_POST=array();
			}
			else
			{
				$pass_hiba[]="A megadott új jelszavak nem egyformák.";
			}
		}
		else
		{
			$pass_hiba[]="Az új jelszó minimum 6, maximum 15 karakter legyen.";
		}
	}
	else
	{
		$pass_hiba[]="A jelenlegi jelszavát hibásan adta meg.";
	}
}
Javascript függvénynél az oké, hogy egy onclick-nél hívom meg például, de php-ban?
 
1

Újrafelhasználható kód miatt

pp · 2012. Nov. 12. (H), 07.48
Újrafelhasználható kód miatt érdemes azokat külön függvénybe tenni. Nézzünk egy egyszerű példát:

A kódodban ellenőrzöd, hogy 6 és 15 karakter között legyen a jelszó. Ezt a fajta ellenőrzést, nem csak itt végezheted el, hanem elképzelhető, hogy még lesz az alkalmazásodban jó pár helyen olyan kód, amivel ezt szeretnéd ellenőrizni.

Jelzik a felhasználók, hogy ők kevesebb mint hat karaktert használtak, mégis beengedte őket a rendszer, másoknak meg nem fogadta el a 12 karakter hosszú jelszavát se.

Vizsgálódás után rájössz, hogy az a probléma, hogy ékezetes karaktereket használnak a felhasználók és az alap PHP string függvények(5.3-ra is igaz ez?) ezt nem kezelik, ahhoz az mb_ kezdetű függvények kellenek.

Ha írtál volna egy between nevű függvényt akkor nem kéne több helyen átírnod most a kódodat, hanem elég lenne csak egy helyen módosítani.

Természetesen a példa sántít, mint minden példa, mert itt az mb_ kezdetű függvényeket kéne már eleve használnod, de talán érthető amit írtam.

De ez egyébként egy tipikusan olyan kérdés, amit felesleges magyarázni, előbb utóbb úgy is rájössz, csak el kell kezdened kódolni és már minimális komplexitásnál előjön az igényed rá.

pp
(a $pass1 és a $jelszavam nem fog egyezni, ha ' jel van benne, mivel az egyiket eszképeled, míg a másikat nem.)
2

Hello Köszi a választ. De

geforce9600gt · 2012. Nov. 12. (H), 10.24
Hello

Köszi a választ. De egyezik a $pass1 és a $jelszavam, a $jelszavam az session-bol van kiszedve, ott azért nincs real escape...
3

Ne

Poetro · 2012. Nov. 12. (H), 11.24
Ne tárolj szenzitív adatot session-ben, mert amennyiben osztott szerveren vagy és a munkamement fájlokban van tárolva, akkor esetleg más is hozzáférhet ezen adatokhoz, akár csak olvasás szintjén. Ezen kívül mindekettő mysql_real_escape_string-el van kódolva?
4

Hát ami session-ból van,

geforce9600gt · 2012. Nov. 12. (H), 19.32
Hát ami session-ból van, annál nincsen, csak amelyik az űrlaporól jön.

Egyébként ez a login, itt állítom be a sessiont.

<?php
	$hiba=array();
	if(isset($_POST['login_submit']))
	{
		if(empty($_POST['login_mail']) or !isset($_POST['login_mail']))
		{
			$hiba[]="Hiányzó email cím.";
		}
		if(empty($_POST['login_pass']) or !isset($_POST['login_pass']))
		{
			$hiba[]="Hiányzó jelszó.";
		}
		if(count($hiba)==0)
		{	
			if(file_exists("./php/connect.php"))
			{
				include("./php/connect.php");
				$email=mysql_real_escape_string($_POST['login_mail']);	
				$jelszo=mysql_real_escape_string($_POST['login_pass']);
				$lekerdezes=mysql_query("select * from regisztracio where Email='$email'");
				if(mysql_num_rows($lekerdezes)==1)
				{
					$adat=mysql_fetch_assoc($lekerdezes);
					if($adat['Jelszo']==$jelszo)
					{
						$_SESSION['belepve']=1;
						$_SESSION['adatok']=$adat;
						$_SESSION['user_email']=$email;
						$_SESSION['vezeteknev']=$adat['Vezeteknev'];
						$_SESSION['keresztnev']=$adat['Keresztnev'];
						header("Location:./index.php");
					}
					else
					{
						$hiba[]="Hibás jelszó.";
					}
				}
				else
				{
					$hiba[]="Hibás vagy nem regisztrált email cím.";
				}
			}
			else
			{
				$hiba[]="Hiányzik a connect.php-fájl.";
			}
		}
	}
?>
És hogy a user be e van lépve, azt így ellenőrzöm:

<?php if(!isset($_SESSION['adatok'])) { ?>
        <a href="belepes.php" class="login_links">Bejelentkezés</a>
        <a href="regisztracio.php" class="login_links">Regisztráció</a>
        <a href="forgotpass.php" class="login_links">Elfelejtett jelszó</a>
        <?php } ?>
Ezek így jól vannak megírva nem?
5

nem

Poetro · 2012. Nov. 12. (H), 20.31
Érzékeny adatokat pakolsz a munkamenetbe, ráadásul nem az adatbázisban levő adattal szemben ellenőrzöl, hanem a munkamenetbelihez. Ha a felhasználónak két elő munkamenete van, akkor azok nem lesznek szinkronban az adatbázissal jelszóváltás esetében.
6

És miket kellene javítanom?

geforce9600gt · 2012. Nov. 12. (H), 21.07
És miket kellene javítanom? Mert akkor legalább legközelebb már jó lenne.
7

Címszavakban

Pepita · 2012. Nov. 18. (V), 20.33
- Regisztráció adatellenőrzéssel és escape-el mentve (utóbbi csak javasolt);
- Jelszó titkosítása a táblában (sózás, stb)
- IP-t is tárolj, valamint belépési és oldaltöltésenként frissített időpontot (táblában)
- Fenti kettővel biztonságosabbá teheted a működést, ha minden kérés elején ellenőrzöd az IP-t, valamint időkorlátot állítasz be (pl. ha a legutóbbi kérés több, mint 10 perce volt, akkor logout)
- Ahogy PP is javasolta: min. függvényekbe írd a cuccost, de nem ártana egy Login osztály.
8

A login osztálynak hogy

geforce9600gt · 2012. Dec. 17. (H), 02.11
A login osztálynak hogy kellene kinéznie? Segitenél elindulni benne?
9

felhasználokezeles

Pepita · 2012. Dec. 18. (K), 18.44
itt elolvastad a munkamenetkezelésről és juzerekről irt cikkeket? Abból indulj, szolj ha elakadsz.
10

8-asra

Pepita · 2012. Dec. 19. (Sze), 14.17
Ezt a 8-ra írtam volna, kicsit pontosítok.

- Először is PHP manual: objektumok és osztályok, session.
- Itteni cikkek a témában, Munkmenetkezelés, Felhasználókezelés
- Első nekifutásra én azt javasolnám, hogy egyetlen login osztályból indulj ki, majd később, ha jobban belejössz, úgyis szét fogod szedni több részre.
- Határozd meg pontosan, hogy milyen adatokra lesz szükséged a Júzertől ill. a progidtól. Ez alapján készítsd el az adattáblákat. (Különösen figyelj a titkosítandó adatok hosszára.) Ne lepődj meg, ha nem egyetlen táblában tudod megoldani, pl. ha különböző jogosultságokat / csoportokat akarsz.
- A (hívjuk most így:) users táblában legyen egy user_data text-oszlopod is, ezt később tudod majd egyéb (szerializált) adatok tárolására használni.
- Szép sorban írd meg a szükséges fv-eket, regisztrációtól ki- és beléptetésen át a mindennemű ellenőrzésekig, naplózás, stb.
- Teszteld sokat, javítsd ha kell.
- Lehetőleg használj a különféle űrlapokhoz (reg., belépés form, stb.), megjelenítendő adatokhoz (Júzer adatlapja, stb.) sablonokat, akár általad készített nagyon egyszerűeket.
- SESSION-ben csak olyan adatot tárolj, amit akár "képernyőre is kiírsz". Minden oldalkérés elején hívd majd meg a "user_check" fv-edet, ebben a fv-ben fogod ellenőrizni a timelimit-et, be van-e logolva, stb-t; a végén, ha minden OK, akkor egy megfelelő változódba betöltheted a Júzer szükséges adatait (itt sem a jelszavát, hanem a felhasználónevét, jogosultságait, ...), és ezt a változót (objektumot) "viszed tovább" a többi programrészhez, amik pl. a fórumot kezelik.
- Csak akkor használd fel az osztályt (fórumhoz, stb.), ha már jól letesztelted és "átment".

Remélem így érthetőbb, sok sikert!