Autor Zpráva
MilanJ
Profil
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
$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
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
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
$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 *
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
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 *
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
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
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
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 *
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 *
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 *
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
Oprava: "uživatel neexistuje" !!!
error414
Profil
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
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 *
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 *
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
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
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
MilanJ
a ten kod
MilanJ
Profil
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!
Toto téma je uzamčeno. Odpověď nelze zaslat.