Autor | Zpráva | ||
---|---|---|---|
MilanJ Profil |
#1 · Zasláno: 31. 1. 2006, 09:54:34
V MySQL mám založenou databázi admin a potřebuji ověřit uživ.jméno a heslo uživatele.
V políčku formuláře mám nastaveny proměnné $admin_jmeno a $admin_heslo a potřebuji porovnat hodnoty s databází. Po otevření spojení a nastavení databáze jsem použil k uložení výsledku porovnávání následující kód: $vysledek = MySQL_Query("SELECT * FROM admin WHERE login = '$admin_jmeno' AND heslo = '$admin_heslo'"); Proměnná $vysledek obsahuje výsledek hledání, bohužel je někde chyba, tabulka databáze obsahuje jen jeden řádek a $vysledek obsahuje stále jen Resource id #2 (když si vypíšu její obsah). Kde je chyba? |
||
error414 Profil |
#2 · Zasláno: 31. 1. 2006, 10:39:25
$vysledek = MySQL_Query("SELECT * FROM admin WHERE login = '$admin_jmeno' AND heslo = '$admin_heslo'");
$data = mysql_fetch_row($vysledek); echo $data['login ']; echo $data['heslo ']; musis pouzit nejakou funkci pro vydolovani vyslledku s dotazu, to Resource id #2 je jen identifikator dotazu. Doporucuji precist serial o mysql a php vice na http://php.ftp.cvut.cz/manual/cs/ref.mysql.php |
||
MilanJ Profil |
#3 · Zasláno: 31. 1. 2006, 10:44:14
Já vím, že Resource id #2 je jen identifikator dotazu, problém je v tom, že tenhle výsledek se zobrazí vždy, když použiju správný login i heslo stejně jako když ho napíšu špatně.
Proč? |
||
error414 Profil |
#4 · Zasláno: 31. 1. 2006, 10:50:45
protoze dotaz vzdy vrati identifikator, protoze se vzdy vykona
musis zjistit co vraci, a ty chces asi vedet pocet zaznamu a to zjistis mysql_num_rows() |
||
error414 Profil |
#5 · Zasláno: 31. 1. 2006, 10:51:25
$vysledek = MySQL_Query("SELECT * FROM admin WHERE login = '$admin_jmeno' AND heslo = '$admin_heslo'");
$data = mysql_fetch_row($vysledek); $pocet = mysql_num_rows($data); echo $pocet |
||
Finc Profil * |
#6 · Zasláno: 31. 1. 2006, 10:54:34
Problem je v tom, ze mysql_query nic jineho vratit ani nemuze. Musite skutecne pouzit nejakou fci pro ziskani vysledku z DB. Jinak ztraci smysl se do DB dotazovat.
Navic co se tyce hesla, je dobre ho ukladat rovnou hashovane, napr. sha1(); $query = "INSERT INTO admin (login, heslo) VALUES ('$login', '". sha1(sha1($heslo)) ."')"; pro kontrolu pote: $query = "SELECT login FROM admin WHERE login = '$login' AND heslo = '". sha1(sha1($heslo)) ."'"; |
||
MilanJ Profil |
#7 · Zasláno: 31. 1. 2006, 11:02:31 · Upravil/a: MilanJ
Já jen potřebuju vědět, jestli jméno a heslo existuje.
Pokud vyhledávání MySQL_Query("SELECT * FROM admin WHERE login = '$admin_jmeno' AND heslo = '$admin_heslo'"); nenajde záznam, vrátí co? |
||
Finc Profil * |
#8 · Zasláno: 31. 1. 2006, 11:07:06
Pokud tedy nechces vratit zadny dotaz:
$query = "SELECT COUNT(*) FROM admin WHERE login = '$login' AND heslo = '$heslo'"; if (mysql_result(mysql_query($query), 0, 0)) { echo "uzivatel existuje"; } else { echo "neexistuje"; } |
||
MilanJ Profil |
#9 · Zasláno: 31. 1. 2006, 11:14:42
OK, díky, funguje!
A ještě jedna otázečka... pokud heslo uložím pomocí PASSWORD(), existuje možnost zaslat pak zapomenuté heslo na email tak, aby bylo pro uživatele čitelné? Jak se takové věci řeší? |
||
error414 Profil |
#10 · Zasláno: 31. 1. 2006, 11:28:53
Finc
Ale ono vzdy vrati dotaz pokud probehl spravne, a ten tvuj dotaz by IMHO mel byt $query = "SELECT COUNT(*) AS `pocet` FROM admin WHERE login = '$login' AND heslo = '$heslo'"; potom bude pocet v promene pocet je to mzslim prehlednejsi reseni. |
||
MilanJ Profil |
#11 · Zasláno: 31. 1. 2006, 11:45:14
Tak jsem jásal předčasně.:-(
$query = "SELECT COUNT(*) FROM admin WHERE login = '$admin_login' AND heslo = '$admin_heslo'"; if (mysql_result(mysql_query($query), 0, 0)) { echo "uživatel existuje"; } else { echo "uživatel neexistuje"; } Stále to hlásí "uživatel existuje" |
||
Finc Profil * |
#12 · Zasláno: 31. 1. 2006, 11:50:19
error414: To je hloupost, kdyz si to otestujes, tak to zjistis. Nepotrebujes asociovat sloupec, protoye vysledek ziskas pomoci mysql_result(query, 0, 0) coz oznacuje COUNT(*) ci jakykoli jina data na prvnim miste. Nemusis pouzivat mysql_num_rows ci vracet vysledek do pole.
|
||
Finc Profil * |
#13 · Zasláno: 31. 1. 2006, 11:51:37
MilanJ: Ze stale existuje? Vsak vysledek ti kontroluje zda v DB existuje zaznam pro login AND heslo
zkus pouzit opacnou logiku a uvidis: $query = "SELECT COUNT(*) FROM admin WHERE login = '$admin_login' AND heslo = '$admin_heslo'"; if (!mysql_result(mysql_query($query), 0, 0)) { echo "uživatel neexistuje"; } else { echo "uživatel existuje"; } |
||
Finc Profil * |
#14 · Zasláno: 31. 1. 2006, 11:53:26
SQL fce PASSWORD() neni uplne idealni, doporucuji spise hash sha1, ale volba je na tobe. Co se tyce odeslani zapomenuteho hesla mailem, dela se to tak, ze se vygeneruje nove heslo a to se odesle uzivateli.
|
||
MilanJ Profil |
#15 · Zasláno: 31. 1. 2006, 11:56:55
Oprava: "uživatel neexistuje" !!!
|
||
error414 Profil |
#16 · Zasláno: 31. 1. 2006, 11:57:35
Finc
$query = "SELECT COUNT(*) AS `pocet` FROM admin WHERE login = '$login' AND heslo = '$heslo'"; $data = mysql_fetch_object($query); switch($data->pocet){ case 0: 'uzivatel neexistuje';break; case 1: 'uzivatel existuje';break; default: 'chyba duplicity';break; } tvoje i moje reseni je spravne jen IMHO to moje je prehlednejsi, je neproyirave rict ze moje reseni je hloupost ale kdyz myslis, nebudu ti oponovat |
||
MilanJ Profil |
#17 · Zasláno: 31. 1. 2006, 11:58:13
V databázi mám nastaveno jméno i heslo, tam chyba není.
Může být v datovém typu jména a hesla? ...mám nastaveno u obou TINYTEXT |
||
Finc Profil * |
#18 · Zasláno: 31. 1. 2006, 12:01:52
error414: Omlouvam se, doslo spise k nedorozumeni. Obcas lepe cist, nez hned resit. Domnival jsem se, ze rikate, ze to timto zpusobem nefunguje. Samozrejme funguje. O tom, jaky zpusob zde pouzit uz je jen na programatorovi. Zde bude tak malo zaznamu, ze mluvit o nejake optimalizaci je zbytecne. Mozna by bylo zajimave vyzkouset rychlost, ktere reseni je vhodnejsi :)
|
||
Finc Profil * |
#19 · Zasláno: 31. 1. 2006, 12:04:59
MilanJ: Urcite nastavte varchar(int).
int je cislo urcujici pocet znaku. Pouzivam tabulku s temito udaji. Samozrejme zalezi, co presne potrebujete u adminu uchovavat. CREATE TABLE admin ( id int(11) NOT NULL auto_increment, stav enum('aktivni','neaktivni') NOT NULL default 'aktivni', login varchar(20) NOT NULL default '', heslo varchar(40) NOT NULL default '', jmeno varchar(100) NOT NULL default '', prijmeni varchar(100) NOT NULL default '', email varchar(255) NOT NULL default '', zmenil int(11) NOT NULL default '0', zalozeno datetime NOT NULL, zmeneno timestamp(14) NOT NULL, PRIMARY KEY (id), UNIQUE KEY login (login), KEY stav (stav) ) TYPE=MyISAM; |
||
error414 Profil |
#20 · Zasláno: 31. 1. 2006, 12:05:20
Finc
OK v pohode. Ja myslel prehlednost kodu. Rychlost by se dala zkouset kdyby to vybiralo vice jak 10 000 zaznamu, jeden, dva, tri, to vubec nema smysl premyslet nad rychlosti, vtom svami souhlasim. |
||
MilanJ Profil |
#21 · Zasláno: 31. 1. 2006, 12:25:00
Tabulku jsem nastavil, stačí mi hodnoty login a heslo, ale výsledek stále nefunguje.
Nevím proč, ale stále "uživatel neexistuje" |
||
error414 Profil |
#22 · Zasláno: 31. 1. 2006, 12:28:01
MilanJ
a ten kod |
||
MilanJ Profil |
#23 · Zasláno: 31. 1. 2006, 12:31:11
Pánové, moc vám děkuji za HELP, chybu jsem našel, nebyla na vašich přijímačích, ale mezi mou klávesnicí a mou židlí....čistokrevný překlep.
Omlouvám se a ještě jednou díky! |
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0