Autor | Zpráva | ||
---|---|---|---|
davidmyska Profil |
#1 · Zasláno: 21. 5. 2011, 08:26:18 · Upravil/a: davidmyska
Ahoj, v PHP jsem uplný začátečník poraďte mi jak mám u tohoto udělat: Jste přihlášen/a jako (a uživatelské jméno přihlášeného). Potřeboval bych aby se to nacházelo na tomto souboru (asi bude potřeba změnit index2.html na index2.php)
můžete se přihlásit na účet: "test" a heslo: "test" |
||
Keeehi Profil |
#2 · Zasláno: 21. 5. 2011, 10:39:26
davidmyska:
„(asi bude potřeba změnit index2.html na index2.php)“ Ano bude. Bez PHP kódu ale nevíme, jak to u tebe funguje, takže ti nemůžeme pomoci. Ve většině případů by to bylo asi něco jako: echo "Jste přihlášen/a jako $_SESSION[uzivatel]"; , což zatím u tebe nebude, protože sessions nepoužíváš.
|
||
Neas Profil |
#3 · Zasláno: 21. 5. 2011, 12:21:57 · Upravil/a: Neas
souhlasím s Keeehi, bez php scriptu ti jen těžko můžeme poradit.
ps. to, že přihlášení přesměrovává na jinou stránku má nějaký důvod? pomocí ifu to můžeš zařídit tak, že přihlášeným uživatelům se zobrazý XXX a nepřihlášeným přihlašovaný formulář. EDIT: ve FAQ si najdi registraci a přihlašování uživatelů: http://diskuse.jakpsatweb.cz/?action=vthread&forum=9&topic=2111 |
||
davidmyska Profil |
#4 · Zasláno: 22. 5. 2011, 18:18:07 · Upravil/a: davidmyska
Neas:
díky přihlášení mám ale ještě bych k tomu potřebuval registraci |
||
Neas Profil |
#5 · Zasláno: 22. 5. 2011, 19:45:38 · Upravil/a: Neas
registrace je ještě jednodušší:
uděláš si formulář, ten odešleš metodou POST a někde na začátku scriptu (po připojení k databázi) napíšeš schematicky něco jako tohle: zkontroluješ si, zda je formulář odeslán: if(isset($_POST['odeslat'])) pokud ano, zkontroluješ si, zda jsou povinné údaje vyplněny: if(!empty($_POST['jmeno']) && !empty($_POST['heslo'])) pak už jen ošetříš vstupy a uložíš do databáze pomocí mysql_query: mysql_query("INSERT INTO users (username, password) VALUES ( ' ".mysql_real_escape_string($_POST['jmeno'])." ', ' ".sha1($_POST['heslo'])." ' "); je to to nejprimitivnější řešení, v praxi by jsi měl ohlídat ještě minimálně, aby neexistovali 2 uživatelé se stejným jménem a aby se ti na web neregistrovali boti (pakliže si v php začátečník, řešil bych to logickou otázkou, kterou bot zodpovědět neumí) od věci také není vložit na stránku 2 pole typu password, které se musejí rovnat (kvůli případným překlikům) etc. |
||
davidmyska Profil |
#6 · Zasláno: 22. 5. 2011, 20:05:04
promiň ale jedinné co tak dokážu je upravit registraci kterou jsem měl už předtím, toto jaksi nechápu ale i tak díky
|
||
HajekJirka Profil |
#7 · Zasláno: 22. 5. 2011, 21:04:02 · Upravil/a: HajekJirka
davidmyska:
„promiň ale jedinné co tak dokážu je upravit registraci kterou jsem měl už předtím“ No tak si ji uprav. Nebo požádej někoho ať Ti to udělá, třeba google. (viz první stránka) |
||
davidmyska Profil |
#8 · Zasláno: 23. 5. 2011, 16:17:29
Nějak jsem to sesmolil, registrace pracuje dobře, ale přihlašování mi nejede
index.php: <?php $path = "/"; // máte-li stránky v rootu, nechte bezezměny, pokud je provozujete v nějakém podadresáři, zadejte jeho jméno // např. stránky mám na moje-domena.cz/adresar/, tak zadám $path = "/adresar/"; // funkce pro ošetření vstupních dat od uživatele // viz http://cz.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc function gpc_addslashes($str) { return get_magic_quotes_gpc() ? $str : mysql_real_escape_string($str); } include "db.php"; // soubor db.php zajistí připojení k databázi a výběr databáze, se kterou pracujeme session_start(); // tohle je nezbytné a je nutné uvést tuto funkci na všech stránkách, kam se přihlášený uživatel dostane // možnost nastavit automatické spouštění session_start() nechávám stranou // zjistíme, co chce uživatel dělat if (isset($_SESSION['username']) && isset($_GET['logout'])) { // uživatel je přihlášen a chce se odhlásit, takže smažeme údaje o přihlášení $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } session_unset(); session_destroy(); // a přesměrujeme na index.php header("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303); exit; } elseif (isset($_SESSION['username'])) { //session_regenerate_id(); // ochrana před session fixation, lze vynechat // uživatel je přihlášen a nechce se odhlásit, zde zobrazíme obsah pro registrované // můžeme využit include apod. // tohle informuje uživatele, že je přihlášen a vypíše odkaz pro odhlášení // můžeme to ale přemístit do includovaného souboru (kam se nám hodí) echo "<p>Přihlášen: $_SESSION[username] <a href=\"http://".$_SERVER['SERVER_NAME'].$path."index.php?logout=1\">odhlásit</a></p>\n"; } else { // uzivatel není přihlášen // pokud odeslal přihlašovací údaje, snaží se přihlásit if (isset($_POST['username']) && isset($_POST['password'])) { // ošetříme vstupní údaje od uživatele // funkce trim() má význam hlavně u hesla, ořeže bílé znaky (např. mezery) na začátku a konci řetězce $username = gpc_addslashes(trim($_POST['username'])); $password = gpc_addslashes(trim($_POST['password'])); // zjistíme, jestli je v databázi daný uživatel a jestli se prokazuje platným heslem // více o ukládání hesel, např. o tzv. solení, najdete na http://php.vrana.cz/ukladani-hesel.php $result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')"); if (mysql_result($result, 0)) // předpokládáme, že dotaz proběhl úspěšně, pokud ne, bude stejně vráceno false // true (a splnění podmínky) nastane pouze tehdy, když v databázi existuje správná kombinace uživatelského jména a hesla { // uložíme potřebné SESSION proměnné $_SESSION['username'] = $username; $_SESSION['cas_prihlaseni'] = time(); // čas, kdy se uživatel přihlásil, pozor, nejedná se o čas poslední akce, nevím, jestli ho využijete, může být smazán // po přihlášení uživatele přesměrujeme na index.php header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303); exit; // aby bylo pravidlům učiněno zadost, zde stejně končí podmínka a jiná nemůže být splněna } else { // uživatel zadal neplatné přihlašovací údaje // přesměrujeme ho na index.php a zobrazíme chybovou hlášku header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php?incorrect_login=1", TRUE, 303); exit; } } else { // uživatel není přihlášen a ani neodeslal přihlašovací formulář, tak mu ho zobrazíme echo "<div>"; if (isset($_GET['incorrect_login'])) { echo "<p style=\"color: #F00\">Zadali jste neplatné uživatelské jméno nebo heslo</p>\n"; } // zobrazíme formulář pro přihlášení ?> <form action="index.php" method="post"> Jméno: <input name="username" type="text"><br> Heslo: <input name="password" type="password"><br> <input name="submit" type="submit" value="Přihlásit"> </form> </div> <?php } } ?> registrace.php: <?php ob_start(); // cachujeme vystup if(isset($_POST['sent'])){ // pokud byl odeslan formular pokracuj timto $username=trim($_POST['username']); $password1=$_POST['password']; $password2=$_POST['password_znovu']; $mail=trim($_POST['mail']); $web=trim($_POST['web']); if($username=="" or $password1=="" or $mail==""){ // pokud nebylo vyplněno něco z toho, co je povinné, dáme vědět a skript ukončíme echo "Nebyly vyplněny všechny povinné údaje!"; }else{ // povinné udaje vyplněny vsechny require "db.php"; // pripojime se k databazi $PocetStejnych=mysql_result(mysql_query("SELECT COUNT(*) FROM `uzivatele` WHERE `username`='$username' OR `mail`='$mail'"),0); if($PocetStejnych!=0){ // pokud v db je jiz takove jmeno nebo heslo... echo "Zadané jméno nebo email je již používán někým jiným!!!"; }elseif($password1 != $password2){ // pokud se hesla nerovnají echo "Zadané hesla se neshodují!!!"; }else{ // hesla se shoduji, vlozime tedy data do databaze $password=md5($password1); // zahashujeme heslo if($web=="http://" or $web==""){ //pokud nezadal web tak dame promennou web prazdnou $web=""; } $VlozData=mysql_query(" INSERT INTO uzivatele (`username`,`password`,`mail`,`web`) VALUES ('$username', '$password', '$mail', '$web') ") or die (mysql_error()); // Jako posledni hodnota je "0", to jsou ty prava uzivatele. if($VlozData){ echo "Data byla uložena"; } } } }else{ echo "Nebyl odeslán formulář"; } // pokud pouzijete HEADER LOCATION tak by pred nim nemelo byt zadne platne ECHO echo " <a href='index.php'>zpět</a>"; // samozrejme zde muze byt presmerovani na jinou stranku pomoci // header ("Location: index.php"); ob_end_flush(); ?> formulář se nachází na registrace.html (myslím si že není potřeba zobrazovet kód) tabulka v databázi: CREATE TABLE `uzivatele` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR( 32 ) NOT NULL , `password` VARCHAR( 32 ) NOT NULL , `mail` VARCHAR( 64 ) NOT NULL , `web` VARCHAR( 128 ) NOT NULL , UNIQUE (`jmeno` , `mail` ) ) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_czech_ci; |
||
jenikkozak Profil |
#9 · Zasláno: 23. 5. 2011, 16:23:54 · Upravil/a: jenikkozak
davidmyska:
Při registraci ukládáš heslo hashované pomocí md5(), při přihlašování ověřuješ jeho hash pomocí sha1(). Edit.: Navíc když uživatel při registraci vyplní heslo s mezerou na konci či na začátku, uloží se hash řetězce i s tou mezerou. Při přihlašování je mu tato mezera oříznuta pomocí funkce trim(), i kdyby na hashování byla použita totožná funkce, výsledné hashe se nebudou v tomto případě rovnat. Komentáře jsou hrozně fajn, ale na takovémto fóru tak trochu ztrácejí smysl. |
||
davidmyska Profil |
#10 · Zasláno: 23. 5. 2011, 16:56:36 · Upravil/a: davidmyska
ikdyž jsem to dal na stejný hash pořád mi to nejede
|
||
jenikkozak Profil |
#11 · Zasláno: 23. 5. 2011, 17:04:06
davidmyska:
Aha. A jak se ta nejízda projevuje? Jo, a prosím už sem další skripty snad ani nedávej. Leda jejich část. :-) |
||
davidmyska Profil |
#12 · Zasláno: 23. 5. 2011, 17:15:55
nemůžu se přihlásit heslo a jméno je bez mezer hash je taky stejný
|
||
davidmyska Profil |
#13 · Zasláno: 23. 5. 2011, 19:53:50
při venčení psa jsem si uvědomil že ten kód musí být nějak spojen s tabulkou v db, jak jsem se vrátil domů oběvil jsem že soubor index.php (řádek 54) ná zapsaný název tabulky jako "users" ale registrace.php má "uzivatele" a tabulka se jmenuje "uzivatele"
|
||
davidmyska Profil |
#14 · Zasláno: 24. 5. 2011, 06:57:52
ale pořád to nejede najděte mi prosím chybu
|
||
trs Profil * |
#15 · Zasláno: 24. 5. 2011, 07:02:13
A co (ne)dela? jakou chybu to vypisuje?
|
||
davidmyska Profil |
#16 · Zasláno: 24. 5. 2011, 07:09:29
nemůžu se přihlásit
a chybou jsem myslel chybu v kódu tam něco musí být špatně ale já nevím co |
||
jenikkozak Profil |
#17 · Zasláno: 24. 5. 2011, 08:38:08
davidmyska:
Používáš-li na hashování SHA1, tak hash se ti nevejde do 32znakové buňky. Pak si zkus chybu najít sám. Zakomentuj řádek 71 (uveď před něj dvě lomítka). Pokud nemáš na hostingu vypnuté zobrazování chybových hlášek, tak by ti to vypsalo chybu (třeba jak jsi měl špatně uvedený ten název tabulky). Pak si zkus třeba vypsat ty odeslané údaje a podívat se, jestli jsou v databázi stejně. |
||
davidmyska Profil |
#18 · Zasláno: 24. 5. 2011, 16:39:16 · Upravil/a: davidmyska
díky to by mě v životě nenapadlo že se to tam nevleze dal jsem to na 128 znaků a už to jede bez problémů
ještě bych se chtěl zeptat jestli by šlo nějak udělat aby se třeba účtu admin ukazovalo něco jiného než dalším účtům a ještě něco jiného nepřihlášeným uživatelům např: nepřihlášený uživatel uvidí pouze základ přihlášený uvidí něco navíc admin uvidí ještě něco navíc |
||
davidmyska Profil |
#19 · Zasláno: 24. 5. 2011, 18:11:22 · Upravil/a: davidmyska
jak rozlišit přihlášené a nepřihlšené na to jsem už přišel ono je to vlastně v kódu indexu ale jak rozlišit běžný účet a admina to nevím ale asi tomu pomůže že jsem přidal sloupec v tabulce "prava" běžný uživatel má hodnotu "0" a admin má "1" při registraci tam automaticky skáče "0"
|
||
Neas Profil |
#20 · Zasláno: 24. 5. 2011, 18:13:34 · Upravil/a: Neas
šlo. do tabulky si přidej sloupec "hodnost", "rank", nebo tak nějak, to je jedno. defaultně při registraci tam ukládej třeba 0 (stačí v phpmyadmin nastavit výchozí hodnotu, nemusíš to přidávat do scriptu při registraci). U admina totu buňku přepiš na 1 (další hodnosti můžou být 2, 3 etc.). Při přihlášení pak nastavuj session s hodnosti, která je uložená v db:
$_SESSION['hodnost'] = $fetch_array['hodnost']; a pak někde, kde se má kód stránky lišit, testuj podmínku: if($_SESSION['hodnost'] == 0) { //přihlášený uživatel } elseif($_SESSION['hodnost'] == 1) { //admin } else { //nepřihlášený uživatel } EDIT: naše poslední 2 komenty se minuly, vidím, že sám uvažuješ správně. |
||
davidmyska Profil |
#21 · Zasláno: 24. 5. 2011, 18:22:42
díky to bude ono
|
||
davidmyska Profil |
#22 · Zasláno: 24. 5. 2011, 18:41:12
poraděte mi jěště jak to mám zapsat nějak mi to nechce fungovat místo poznámek jsem tam dal echo a pořád se tam píše přihlášený uživatel ikdyž tam je admin nebo nikdo není přihlášen
|
||
Neas Profil |
#23 · Zasláno: 24. 5. 2011, 19:10:19
menuje se tvoje session $_SESSION['hodnost']?
je správně nastavena hodnota v databázi? při přihlášení, přiřazuješ session správnou hodnotu? -- jestli jsi na všechno odpověděl ano, pošli část zdrojáku, kde nastavuješ session. |
||
davidmyska Profil |
#24 · Zasláno: 24. 5. 2011, 19:56:27
1. $_SESSION['prava']
2. ano 3. nevím jak se to pozná jenom mi poraďte kam mám vložit: $_SESSION['prava'] = $fetch_array['prava']; |
||
Neas Profil |
#25 · Zasláno: 24. 5. 2011, 20:12:17 · Upravil/a: Neas
okopíroval jsem část tvého kódu, který jsi uvedl výše a zvýraznil změny.
Přiznám se, že já k připojení k mysql používám třídu mysqli, takže už jsem si odvykl neoběktové řešení, jako je tvoje, ale i tak by to mělo být dobře: $result = mysql_query("SELECT prava FROM users WHERE username = '$username' AND password = sha1('$password')"); if (mysql_num_rows($result) == 1) { $prava = mysql_result($result, 0); // uložíme potřebné SESSION proměnné $_SESSION['username'] = $username; $_SESSION['prava'] = $prava; $_SESSION['cas_prihlaseni'] = time(); // čas, kdy se uživatel přihlásil, pozor, nejedná se o čas poslední akce, nevím, jestli ho využijete, může být smazán // po přihlášení uživatele přesměrujeme na index.php header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303); exit; // aby bylo pravidlům učiněno zadost, zde stejně končí podmínka a jiná nemůže být splněna } EDIT: celé toto řešení přihlašování však bude fungovat pouze pokud nebude existovat více než 1 uživatel s totožným jménem a heslem (což by neměl, ale nijak to neošetřuješ) |
||
davidmyska Profil |
#26 · Zasláno: 25. 5. 2011, 07:21:46 · Upravil/a: davidmyska
Já bych rači aby se to dívalo pouze na ty práva protože může se stát že se tam oběví dva uživatelé se stejným heslem
|
||
Neas Profil |
#27 · Zasláno: 25. 5. 2011, 17:34:16
pokud mají stejné heslo a ne jméno, pak to script rozpozná. i pokud by měli stejné jméno a jiné heslo, script by fungoval. Ale jakmile se objeví 2 a více uživatelů se stejným jménem i heslem, nastane problém. s podmínkou
if (mysql_num_rows($result) == 1) to nepřihlásí ani jednoho, s podmínkou if (mysql_num_rows($result) > 1) to přihlásí vždy toho, který se registoval jako první (má nižší ID, tedy na něj query narazí dřív). toto je třeba pořešit již u registace. |
||
davidmyska Profil |
#28 · Zasláno: 25. 5. 2011, 18:16:45
takže jestli to chápu tak u obou podmínek tam můžou být 2 a více uživatelů s jiným jménem ale se stejným heslem např:
ucet1 heslo1 ucet2 heslo1 2 a více styjných jmen se tam nemůže vyskytnout to je ošetřeno již v registraci |
||
Neas Profil |
#29 · Zasláno: 25. 5. 2011, 18:38:18
to je ošetřeno již v registraci
moje chyba, nepřečetl jsem si celý script pro registraci. V tom případě máš hotovo, script je v pořádku. |
||
davidmyska Profil |
#30 · Zasláno: 25. 5. 2011, 18:48:35
a jak mám teda rozlišit ty uživatele, mám tam dát jen toto:
if($_SESSION['prava'] == 0) { //přihlášený uživatel } elseif($_SESSION['prava'] == 1) { //admin } else { //nepřihlášený uživatel } |
||
Téma pokračuje na další straně.
|
0