Autor | Zpráva | ||
---|---|---|---|
RICKY Profil * |
#1 · Zasláno: 30. 11. 2011, 15:42:38
Jak na ověření jména a hesla? Zkoušel jsem toot očividně nefunguje
<?php include 'db_conn.php'; $sql = mysql_query("SELECT id FROM admins WHERE nick='".$jmeno."'", $pripojeni_db); $sql1 = mysql_query("SELECT id FROM admins WHERE pass='".$heslo."'", $pripojeni_db); mysql_query("SET NAMES 'utf8'"); $login = $_POST['user']; //uživatelské jméno $pass = $_POST['passwd']; //heslo if ($_GET['action']=='validate'){ //a pokud odpovídají přihlašovací údaje if(($_POST['user']==$sql)&&($_POST['passwd']==$sql1)){ session_start(); header("Cache-control: private"); //zaregistruje proměnou user_is_logged a nastaví ji na 1 $_SESSION["user_is_logged"] = 1; //a pošlena úvodní soubor chráněné sekce header("Location: private/index.php"); exit; } } ?> ?> Chyby: Notice: Undefined variable: jmeno in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 3 Notice: Undefined variable: heslo in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 4 Notice: Undefined index: user in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 6 Notice: Undefined index: passwd in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 7 Notice: Undefined index: action in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 8 ?> |
||
Darker Profil |
#2 · Zasláno: 30. 11. 2011, 16:16:19 · Upravil/a: Darker
Máš v tom binec a pravděpodobně jsi to složil z více skriptů.
První věc co uděláme je že načteme POST do proměnných: $jmeno = mysql_real_escape_string($_POST["jmeno"]); $heslo = sha1($_POST["jmeno"]); //Vyhech sha1 (a pak escapuj jako jmeno) pokud hesla nehashujes, ale to bys mel. Potom stačí JEDEN dotaz do databáze. Hledáme účet, kde je heslo a jméno ZÁROVEŇ. $sql = mysql_query("SELECT * FROM admins WHERE nick='$jmeno' AND heslo='$heslo', $pripojeni_db) || die(mysql_error()); Nakonec zjistíme, zda bylo něco nalezeno. if(mysql_num_rows($sql)==0) //Spatne udaje else //login Chyby : „Notice: Undefined variable: jmeno in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 3“ Nikde jsi proměnnou $jmeno nedefinoval, tak jak ji můžeš vkládat do řetězce? „Notice: Undefined variable: heslo in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 4“ Totéž. „Notice: Undefined index: user in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 6 Notice: Undefined index: passwd in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 7“ Sjednoť si názvy políček přihlašovácího formuláře s těmi co načítáš ve skriptu. „Notice: Undefined index: action in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 8“ Mám trochu podezření že jsi skript od někud zkopíroval a ještě k tomu ne pořádně. |
||
RICKY Profil * |
#3 · Zasláno: 30. 11. 2011, 17:50:38
Jo děkuji jen poslední asi stupidní ...Učil jsem se php z jedné knihy a tam moc do podrobna v mysql nešly. Mohl bys mi vysvětlit mysql_num_rows? Ostatní funkce jsem si vygooglil ale tejto je akorát v php manuálu a ten je v angličtině.
|
||
jenikkozak Profil |
#4 · Zasláno: 30. 11. 2011, 18:05:00
RICKY:
Tato funkce vrátí počet řádků z MySQL dotazu (který obsahuje klíčová slova SELECT nebo SHOW), který se udává jako její parametr. Čili dotazem uvedeném v $sql získáváš všechny řádky, které mají konkrétní nick a heslo. Pomocí funkce mysql_num_rows() spočítáš, kolik těch řádků je. Není-li žádný, jsou přístupové údaje špatně. |
||
RICKY Profil * |
#5 · Zasláno: 30. 11. 2011, 18:23:58
Mockrát děkuji.
|
||
RICKY Profil * |
#6 · Zasláno: 30. 11. 2011, 18:41:24
Tak stále nemůžu opravit tyto dvě chyby neví někdo kde je problém?
overeni-admin.php <?php include 'db_conn.php'; mysql_query("SET NAMES 'utf8'"); $jmeno = mysql_real_escape_string($_POST["user"]); $heslo = ($_POST["passwd"]); //Vyhech sha1 (a pak escapuj jako jmeno) pokud hesla nehashujes, ale to bys mel. $sql = mysql_query("SELECT * FROM admins WHERE jmeno='$jmeno' AND pass='$heslo'", $pripojeni_db) || die(mysql_error()); if(mysql_num_rows($sql)==0) { echo 'Zadal jsi špatné údaje'; } else { if ($_GET['action']=='validate'){ //a pokud odpovídají přihlašovací údaje if(($_POST['user']==$login)&&($_POST['passwd']==$pass)){ session_start(); header("Cache-control: private"); //zaregistruje proměnou user_is_logged a nastaví ji na 1 $_SESSION["user_is_logged"] = 1; //a pošlena úvodní soubor chráněné sekce header("Location: private/index.php"); exit; } } } admin.php <html> <head> <title>Formulář</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <form action="./login.php?action=validate" method="post"> <table> <tr><td>Uživatel </td><td><input type="text" name="user" /></td></tr> <tr><td>Heslo </td><td><input type="password" name="passwd" /></td></tr> <tr><td colspan="2"><input type="submit" value="..:: Okej ::.." /> <input type="reset" value="..:: Storno ::.." /></td></tr> </table> </form> </body> </html> Chyby: Notice: Undefined index: user in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 4 Notice: Undefined index: passwd in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 5 Unknown column 'jmeno' in 'where clause' Nevím co znamenají a nevím jak je opravit. |
||
Tori Profil |
#7 · Zasláno: 30. 11. 2011, 20:11:01 · Upravil/a: Tori
RICKY:
"overeni-admin.php": 1. session_start patří na začátek skriptu 2. podmínka na ř.15 je zbytečná, login a heslo ověřujete už v SQL dotazu 3. V databázi není sloupec "jmeno", ale "nick", opravte si SQL 4. První dvě chyby (Notice) se objeví, když spustíte tenhle skript, aniž byste mu poslal formulářem data. Pomůže dát celý obsah skriptu do podmínky: <?php session_start(); if ($POST) { // sem puvodni obsah skriptu } else { // formular nebyl odeslan -> přesměrovat např. na úvodní stránku } |
||
RICKY Profil * |
#8 · Zasláno: 1. 12. 2011, 16:52:41
session_start přesunuto
podmínka tam snad být může ne? nick opraven Jak bych to mohl dát do podmínky? Tak trochu to nechápu.. |
||
jenikkozak Profil |
#9 · Zasláno: 1. 12. 2011, 21:25:32
RICKY:
„podmínka tam snad být může ne?“ Jo. A také můžete opsat všechny knihy středověku a přidat je do komentáře. :-) Ale bude to úplně zbytečně. Stejně jako ta podmínka. Na sedmém řádku ověřujete, jak jsem výše vysvětlil, zda v databázi existuje kombinace zadaného jména a hesla. Není proto potřeba tuto kontrolu provádět znovu. „Jak bych to mohl dát do podmínky? Tak trochu to nechápu..“ Hádám, že tam je překlep. Tori to patrně místo $POST chtěla napsat $_POST. |
||
RICKY Profil * |
#10 · Zasláno: 2. 12. 2011, 14:42:04
<?php session_start(); if ($_POST) { // sem puvodni obsah skriptu include 'db_conn.php'; mysql_query("SET NAMES 'utf8'"); $jmeno = mysql_real_escape_string($_POST["user"]); $heslo = ($_POST["passwd"]); //Vyhech sha1 (a pak escapuj jako jmeno) pokud hesla nehashujes, ale to bys mel. $sql = mysql_query("SELECT * FROM admins WHERE nick='$jmeno' AND pass='$heslo'", $pripojeni_db) || die(mysql_error()); if(mysql_num_rows($sql)==0) { echo 'Zadal jsi špatné údaje'; } else { if ($_GET['action']=='validate'){ //a pokud odpovídají přihlašovací údaje if(($_POST['user']==$login)&&($_POST['passwd']==$pass)){ header("Cache-control: private"); //zaregistruje proměnou user_is_logged a nastaví ji na 1 $_SESSION["user_is_logged"] = 1; //a pošlena úvodní soubor chráněné sekce header("Location: private/index.php"); exit; } } } } else { header ("Location: admin.php"); } ?> Tak takto vypadá skript i když jsem nepochopil proč tam dávat $_POST ale to je jedno Píše to zas tyto chyby ty samé co předtím Notice: Undefined index: user in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 8 Notice: Undefined index: passwd in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 9 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 11 Zadal jsi špatné údaje |
||
panther Profil |
#11 · Zasláno: 2. 12. 2011, 14:56:15
RICKY:
přečti si znovu bod 4. v příspěvku [#7] od Tori, už ti to bylo jednou napsáno. Jsou to nejzákladnější základy jazyka, píše se o nich na mnoha místech. Řešení chybových hlášek ohledně nedefinovaných proměnných/indexů není dotazem pro diskusi. |
||
Tori Profil |
#12 · Zasláno: 2. 12. 2011, 16:36:35
jenikkozak:
Díky za opravu, překlepla jsem se. RICKY: Ten formulář nahoře v [#6] odesílal data na login.php, ale všude je zpracováváte ve skriptu overeni-admin.php - jak to teda je? Není chyba ve formuláři, např.odesílání metodou GET? Jinak ty chyby mi teď už připadají trochu nelogické. Podmínka na ř.4 by měla zabránit pokusu o zpracování, když nejsou data z formuláře. Ve formuláři jsou jen pole pro login a heslo, indexy se shodují. Když odešlu prázdný formulář, if ($_POST) bude TRUE, a pod oběma indexy bude v $_POST prázdný řetězec -> chyby "undefined index" jsou divné. Varování by se taky nemělo objevit, protože znamená, že mysql_query vrátila FALSE. Jenže kdyby se tak stalo, tak skript se na stejném řádku ukončí a vypíše chybu v dotazu. Nerozumím tomu chování, asi to bude jen nějaká pitomost, ale prostě ji nevidím. |
||
RICKY Profil * |
#13 · Zasláno: 2. 12. 2011, 16:49:18
Ve formuláři chyba není jen tamta s login...ale ta by již měla být v pořádku
Já už jsem naprosto mimo nechápu jaký je problém.. |
||
RICKY Profil * |
#14 · Zasláno: 2. 12. 2011, 17:40:18
Tak sem to poupravil... zde je kód ale stále mi to píše že to mám špatně..
<?php session_start(); mysql_connect("localhost", "root", "lokomotiva"); mysql_select_db ("really", mysql_connect("localhost", "root", "lokomotiva")); if ($_POST) { // sem puvodni obsah skriptu mysql_query("SET NAMES 'utf8'"); $jmeno = mysql_real_escape_string($_POST["user"]); $heslo = ($_POST["passwd"]); //Vyhech sha1 (a pak escapuj jako jmeno) pokud hesla nehashujes, ale to bys mel. $sql = mysql_query("SELECT * FROM admins WHERE nick='$jmeno' AND pass='$heslo'", mysql_connect("localhost", "root", "lokomotiva")) or die(mysql_error()); if(mysql_num_rows($sql)==0) { echo 'Zadal jsi špatné údaje'; } else { if ($_GET['action']=='validate'){ //a pokud odpovídají přihlašovací údaje if(($_POST['user']==$jmeno)&&($_POST['passwd']==$heslo)){ header("Cache-control: private"); //zaregistruje proměnou user_is_logged a nastaví ji na 1 $_SESSION["user_is_logged"] = 1; //a pošlena úvodní soubor chráněné sekce header("Location: private/index.php"); exit; } } } } else { header ("Location: admin.php"); } ?> to je overeni-admin.php Notice: Undefined index: user in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 9 Notice: Undefined index: passwd in C:\ComplexWebServer\http_docs\really\overeni-admin.php on line 10 Zadal jsi špatné údaje Toto jsou chyby |
||
Hmkar Profil * |
#15 · Zasláno: 2. 12. 2011, 22:19:36
Píše ti to pred zadaním údajov do adresára čo?
if (isset($_POST['odoslat'])) {// odosielaciemu tlačítku daj name "odoslat" // Zvysok kodu od 9.riadku } Toto vlastne spraví to, že sa ti údaje začnú spracovávať až PO odoslaní formuláru. |
||
Hmkar Profil * |
#16 · Zasláno: 2. 12. 2011, 22:20:16
Hmkar:
Oprava, pred zadaním do Formulára ;) |
||
jenikkozak Profil |
#17 · Zasláno: 2. 12. 2011, 22:31:40
Hmkar:
Ne tak docela. Ta podmínka na této stránce není až tak důležitá. Na danou adresu se člověk dostane až zacílením formuláře. Pokud tam nějakým způsobem vleze bez toho, aby poslal formulář, je to jeho problém. Ta Vaše podmínka způsobí, že se data z formuláře nezpracují v prohlížečích IE v případě, že uživatel neklikne na odesílací políčko, ale odešle formulář Enterem. (Pak se chudák může divit, proč to nejde.) RICKY: Rad jsi dostal ažaž. Je jen na tobě, zda je dokážeš dát dohromady a něco z toho vznikne. |
||
Tori Profil |
#18 · Zasláno: 2. 12. 2011, 22:33:55
RICKY:
Když na začátek overeni-admin.php (ještě před tu první podmínku) přidáte var_dump($_POST); |
||
RICKY Profil * |
#19 · Zasláno: 3. 12. 2011, 00:01:26
Tori:
> var_dump($_POST); > > vypíše to správně údaje z formuláře? Ano vypíše.. |
||
RICKY Profil * |
#20 · Zasláno: 3. 12. 2011, 00:28:47
Takže jsem to začal psát znovu....
<?php session_start(); $pripojeni_db = mysql_connect("localhost", "root", "lokomotiva"); $vyber_db = mysql_select_db ("really", $pripojeni_db); $jmeno = mysql_real_escape_string($_POST["jmeno"]); $heslo = sha1($_POST["heslo"]); $sql = mysql_query("SELECT * FROM admins WHERE nick='$jmeno' AND heslo='$heslo' $pripojeni_db") or die(mysql_error()); if(mysql_num_rows($sql)==0){ header ("Location: admin.php"); } else { $_SESSION["user_is_logged"] = 1; header ("Location: administrace.php"); } ?> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Resource id #2' at line 1 |
||
pcmanik Profil |
#21 · Zasláno: 3. 12. 2011, 00:56:07
RICKY:
Pozri si dokumentaciu k mysql_query. Namiesto num rows, pouzi COUNT priamo v dotaze, takto zbytocne tahas data. |
||
jenikkozak Profil |
#22 · Zasláno: 3. 12. 2011, 08:00:10
pcmanik:
„takto zbytocne tahas data.“ Jediný řádek, jehož délka bude zřejmě zanedbatelná. RICKY: Máš chybu na 7. řádku v tom dotaze. Funkce mysql_query má dva parametry, z nichž jen jeden je povinný. Pokud chceš použít oba (ten dotaz a identifikaci spojení), musíš je oddělit čárkou. |
||
RICKY Profil * |
#23 · Zasláno: 3. 12. 2011, 10:13:49
jenikkozak:
Jakou čárkou a kam ji mám umístit? |
||
Lamerko Profil * |
#24 · Zasláno: 3. 12. 2011, 12:40:58
$sql = mysql_query("SELECT * FROM admins WHERE nick='$jmeno' AND heslo='$heslo'", $pripojeni_db) or die(mysql_error());
|
||
RICKY Profil * |
#25 · Zasláno: 3. 12. 2011, 13:09:30
Stále ten samý problém....
|
||
pcmanik Profil |
#26 · Zasláno: 5. 12. 2011, 15:22:25
jenikkozak:
„Jediný řádek, jehož délka bude zřejmě zanedbatelná.“ Pre teba hlupost, ale ja rad optimalizujem. RICKY: Aj nam ten svoj problem viac popises? Kde to pise tu chybu? Mimochodom tu premennu pripojeni_db v tom mysql_query vobec nepotrebujes, pouzije sa posledne vytvorene spojenie. |
||
Časová prodleva: 14 let
|
0