Mám problém s MySQL. Dělam si stránky sám (teda kromě čtyr minifór (cca 2-5dotazů na stránku - jede OK)). Zbytek jsem si a dělám sám a potřeboval jsem kontrolovat přihlašovacích údajů centrálně, tak jsem si udělal novou tabulku "accounts" o 10-ti sloupcích a momentálně 6-ti záznamech. Script na logování odskoušel (dosud bylo vše OK). Potom jsem dal stranou původní logovací stránku (logování pomocí case přepínače (login) a if podmínky(heslo)-dost nemotorné) a ejhle DB mi zázrakem vrací hodnotu "Resource id #4" a nebo mi PHP mnou vysněnou stránku prostě nevygeneruje a dál mě ani nikoho jiného prostě nepustí. A to nejlepší nakonec: Jakmile se zaloguju do MyPHPAdmina a ten samý dotaz s patříčnýma změnama oproti PHP zadam, tak je vše OK. Ba dokonce při vygenerování mi vygeneruje dotaz, který až na rozdíl " x ' a limitu je stejný s mím:
...
$sql = MySQL_Query("SELECT `password` FROM `accounts` WHERE `login` LIKE ''$login''");
if ($sql == $password)
{
...
Jen podotýkám, že v SQL nejsem přeborníkem a tak bych chtěl poprosim zkušenější, nebo admini, jestli by mi někdo neporadil. Stránku na novém logovacím systému naleznete na adrese: http://www.darkgate.mysteria.cz/login.php , nebo jako textový dokument http://www.darkgate.mysteria.cz/login.txt a overovaci na: http://www.darkgate.mysteria.cz/overeni.txt . Prikazem require, který připojuje DB to není, protože to by mi nefungovali ani fóra (taky MySQL).
Předem děkuju za jakoukoliv pomoc.
No jo, ty si z tabulky accounts vytáhneš pouze sloupec password a pak se překvapivě ptáš na sloupec login.
Budeš si muset nastudovat základy SQL. Takto to nepůjde. S proměnnou $sql musíš pracovat jako s resourcem, tedy vytáhnout data třeba přes mysql_fetch_array().
Celé bych to udělal jinak. Dotazem bych se zeptal na login i heslo a pak si zjistil, zda-li takový záznam existuje. Něco jako:
$sql = MySQL_Query("SELECT * FROM `accounts` WHERE `login` = '$login' AND `password` = $password");
if (mysql_num_rows($sql) == 1) {uspesne prihlaseni}
else {neuspesne prohlaseni}
PS: Heslo se v databázi většinou ukládá zašifrované. Doporučuji prostudovat funkce md5().
nejde o SQL, to je dobře, jde o PHP. mysql_query() nevrátí výsledky jako takové ale právě číslo zdroje (resource #4), z toho se pak dá číst pomocí mysql_fetch_něco např mysql_fetch_array() jehož výsledek je pole odpovídající řádku tabulky. Příklad napoví:
$res = MySQL_Query("SELECT `password` FROM `accounts` WHERE `login` LIKE ''$login''");
$row = mysql_fetch_array($res);
$passw = $row['password'];
....
ještě se dá kontrolovat počet řádků, kolik se přečetlo, další řádek z tabulky se přečte dalším mysql_fetch.. atd. Viz manuál a fce mysql_xxxxx
tak bohužel taky nejde. V $passw neni nic. Bohužel to samý mi to těd dělá s tim mim původnim dotazem. Jakmile ten dotaz napíšu přímo to DB, tak mi to vrátí heslo, ale přes PHP nic.
SERU NA TO!
Zas mi to smazalo cely 10 minutovy prispevek, pekne odladeny na chyby jakoze odlogovani.
Takze to zkratim
1. v puvodnim dotazu jsou 2x uvozovky u login
2. dej si echo $login, $dotaz
3. pouzil bych kontrolu jmeno+heslo viz zbi
4. pouzil bych fetch viz marek
5. pouzil bych v dotazu LIMIT 1
6. jako prvni radek jednoznacne error_reporting(E_ALL);
a jestli jsem tam mel neco dalsiho, uz nevim, to si vyridte z adminy. Hlavne jsem tam mel cely script pohromade, ktery by mel fungovat i s vypisovanim viz [2]
no jasně, $password a $login jsou proměnné, které je třeba naplnit. (Teda v případě register_globals = on se v určitém případě naplní samy, ale tím bych se teď nezatěžoval).
Tzn. před ověřením v db získám proměnné $password a $login. Předpokládám, že někde dříve byl formulář, kde se tyhle dvě položky vyskytovaly. Pokud byl formulář nastavený tak, že metoda odesílání informací je tzv post (get je nevhodný, protože je vidět heslo), tak před dotazem do SQL zjistíš obsah takto:
$password = $_POST['password'];
$login = $_POST['login'];
tedy pokud jsou html inputy nazvané jako password a login.
no a pak už je to tím kousekm kódu, co je nahoře.
jj, ano, to jsem tam mel tez, vytahovani z GET/POST, protoze neni genister global = on a tim padem se samo nic neudela :)
<HTML>2peta:
>>neni genister global = on
Na wz je. Viz phpinfo().
Pro příště si odpusť neslušné výrazy. Pokud vím, už se ti stalo, že se ti příspěvek neodeslal, takže nechápu, že si ho před odesláním neoznačíš a nezkopíruješ...</HTML>
Thalia (moderátor)
jj, ale tak proc to neni resene jako jakpsatweb? Tam mne to neodloguje. Jednou si navykla, pak dojdes sem napsat 1-2 prispevky a mezitim je clovek odlogovanej. Dobre, reknu si. Dam ZPET a prispevek se mi vrati. Si jej zkopiruji, naloguji se a poslu. A houby houby :)
A protoze s tim evidentne nikdo nic nedela, tak se musim ozvat.
Nicmene proti minibb se mi tu libi, ze serazuje zpravy od nejnovejsich prispevku. V minibb je to vazane na datum zalozeni tematu.
peta: driv to tady tak nebylo, zavedlo se to jako bezpecnostni opatreni. moderator Richard se k tomu vyjadroval
Tonik (tonik.webz.cz) Oki, zkusim to udelat trosku jinak, ale urco s tim budu prudit pokazde, kdy se mi to stane :)
Pánové děkuji, DB již funguje, ikdyž je dost ukrutná doba, než se do mysql zapíše 5 hodnot do jediný tabulky. Ale to je jiný téma.