Autor | Zpráva | ||
---|---|---|---|
fodsqa Profil |
#1 · Zasláno: 13. 12. 2014, 21:10:46
Dobrý večer , mám takíto problem učím sa PHP a momentalne skúšam login form. Problém mám takí , že mi nevyhodnotuje odoslane udaje z tími z databaze. Isto tam mam chybu , vy ste skušenejší porosím poradťe mi poprípade ma zaučte prečo mam toto takto a toto takto (Myslím tím chybu)
ďakujem a prikladám aj PHP a Form Form <form action="login.php" method="POST"><strong> Username: <input type="text" name="username"/><br /> Password: <input type="password" name="password"/><br /><br /> <input type="submit" name="login" value="Login"/></strong> </form> login.php <?php $servername = "wm75.wedos.net"; $usernamedb = "***"; $passworddb = "***"; $dbname = "***"; $conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $result = mysql_query("SELECT FROM users WHERE meno = '$nick' AND heslo = md5('$hesloo')"); $uname=$_POST['username']; $pswd=$_POST['password']; $pswd=md5($pswd); $nick="meno"; $hesloo="hesloo"; if (isset ($uname) && isset($pswd)&&($uname==$nick)&&($pswd==$hesloo)) { header('location:http://www.fodsqa.eu'); } else {echo 'Zlé heslo<br />';} ?> a toto mi vipíše Warning: mysql_query() [function.mysql-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /data/web/virtuals/86021/virtual/www/subdom/roa/login.php on line 16 Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /data/web/virtuals/86021/virtual/www/subdom/roa/login.php on line 16 Zlé heslo Ospravedlnujem sa že zakladám novú tému ale ja uź neviem kde to mám hladať :/ alebo ako to spraviť |
||
lionel messi Profil |
fodsqa:
Pripájaš sa k MySQLi, ale na r. 13 používaš mysql_query, čo je funkcia, kt. pracuje de facto s inou databázou (laicky povedané). Správne je to nejako takto: $conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } //vždy escapuj užívateľský vstup pri práci s db kvôli bezpečnosti! $uname= $conn->real_escape_string($_POST['username']); $pswd= $conn->real_escape_string($_POST['password']); $pswd=md5($pswd); $nick="meno"; $hesloo="hesloo"; //až sem príde query, v tvojom pôvodnom skripte si pracoval s nedefinovanými premennými $result = $conn->query("SELECT * FROM users WHERE meno = '$uname' AND heslo = md5('$psswd')"); //pracovať tu s premennými $nick a $hesloo tu nedáva veľký zmysel while($row = $result->fetch_assoc()) { echo $row['id']; //vypíšeme id každého používateľa alebo bársčo iné } if (isset ($uname, $pswd) && ($uname==$nick)&&($pswd==$hesloo)) { header('location:http://www.fodsqa.eu'); exit(); } else {echo 'Zlé heslo<br />';} Trochu nerozumiem záveru skriptu, čo chceš presne dosiahnuť? Ber tento príklad teda len ako ilustráciu práce s db MySQLi objektovo. |
||
fodsqa Profil |
lionel messi:
zaver nechápem čo odomna chceš , ma to byť prihlasenie kde to čo zadaš a sa ti vyhodnoti z registracie ktorá je uložena v databaze. a po úspešnom prihláseni ta presmeruje na stránku kde vlastne bude pustene session (neviem či si myslel toto ) |
||
lionel messi Profil |
#4 · Zasláno: 13. 12. 2014, 21:44:27
fodsqa:
„(neviem či si myslel toto )“ Áno, ďakujem za upresnenie. „po úspešnom prihláseni ta presmeruje na stránku kde vlastne bude pustene session“ Prečo nepustiť session hneď po spracovaní? Neviem, pýtam sa, nenavrhujem tvoju aplikáciu, možno na to máš dobrý dôvod, ale ja by som to urobil inak. session_start(); //vynechávam definíciu premenných potrebných na pripojenie $conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } //vždy escapuj užívateľský vstup pri práci s db kvôli bezpečnosti! $uname= $conn->real_escape_string($_POST['username']); $pswd= $conn->real_escape_string($_POST['password']); $pswd=md5($pswd); $nick="meno"; $hesloo="hesloo"; //až sem príde query, v tvojom pôvodnom skripte si pracoval s nedefinovanými premennými $result = $conn->query("SELECT * FROM users WHERE meno = '$uname' AND heslo = md5('$psswd')"); //pracovať tu s premennými $nick a $hesloo tu nedáva veľký zmysel $num_rows = $result->num_rows; if($num_rows) { //uložíme údaje do session $_SESSION["username"] = $uname; header("Location: index.php"); exit(); } else { echo "Nesprávne meno alebo heslo."; } |
||
fodsqa Profil |
#5 · Zasláno: 13. 12. 2014, 21:50:17
lionel messi:
Prepáč netuším čo si myslel , so session neviem ešte pracovať a tak (ževraj to je jednoduché)...chcel som najprv zpojazdniť login až potom do toho zakombinovať session(samozrejme kad sa to doučím). |
||
lionel messi Profil |
#6 · Zasláno: 13. 12. 2014, 22:00:29
fodsqa:
„so session neviem ešte pracovať a tak (ževraj to je jednoduché)“ Základy práce so session určite zložité nie sú. „chcel som najprv zpojazdniť login až potom do toho zakombinovať session“ Jedno s druhým dosť súvisí. Iste, ide login spraviť aj bez toho, ale nie tak, aby fungoval „naprieč celým webom“ (minimálne bez veľkých problémov). Princíp je jednoduchý, session umožňujú komunikáciu medzi viacerými stránkami (veľmi zjednodušujem). Na každej stránke si volaním session_start(); zapneš session a môžeš s týmto superglobálnym poľom pracovať podľa potreby. V mojom príklade si do poľa $_SESSION uložíš hodnotu užívateľského mena pod kľúčom username a na ktorejkoľvek stránke so zapnutým session bude užívateľské meno prístupné cez $_SESSION["username"] . Keď podmienku na r. 21 v príklade upravíme takto:
if($num_rows) { //uložíme údaje do session $_SESSION["username"] = $uname; echo $_SESSION["username"]; } else { echo "Nesprávne meno alebo heslo."; } |
||
fodsqa Profil |
#7 · Zasláno: 13. 12. 2014, 22:16:15
lionel messi:
viac menej chápem , vyzerá to tak že sa v tom vyznáš pozri si prosím ťa email ktorý som ti psolal na email čo máš uvedený v profile (kvoli tomu aby sme to tu zbytočne nespamovali+ možeš odpisovať aj tam :) ) |
||
lionel messi Profil |
#8 · Zasláno: 13. 12. 2014, 22:24:43
fodsqa:
„pozri si prosím ťa email ktorý som ti psolal na email čo máš uvedený v profile (kvoli tomu aby sme to tu zbytočne nespamovali“ Mail mi prišiel, ale nemyslím si, že je rušivé baviť sa priamo tu. Nebránim sa ani súkromným komunikačným kanálom, ale v tomto štádiu mi to príde zbytočné z viacerých dôvodov: 1. Riešime v tvojom vlákne tvoje konkrétne problémy súvisiace s loginom v PHP, žiadny nepatričný príspevok tu nevidím. 2. Zvyčajne platí viac hláv = viac rozumu. Keď sa budeme baviť verejne, môže ti odpovedať niekto iný, môže sa v tom vyznať ešte lepšie, odpovedať namiesto mňa, keď nebudem môcť, niekedy sa hodí poznať viacero názorov a podobne. 3. Keď sme sa už verejne baviť začali, mali by sme podľa tunajších pravidiel debatu aj verejne skončiť. Ak by si niečo potreboval, kľudne napíš sem. |
||
fodsqa Profil |
#9 · Zasláno: 13. 12. 2014, 22:35:16
lionel messi:
Veď dobre , myslel som to tak že keby mám dáky problem ešte, tak by som sa najprv skúsil opýtať teba , pohode šak to teda riešme tu.... Takže keď chcem login zo session tak to treba od začiatku robiť a nie tak ako som to chcel? vlaste session robí to že prihláseny uživatel bude niečo robiť (ukladat a načitavat z databazy) ale mam pocit že sme odbočili od hlavného problemu a to je že ma nechce prihlásiť a stále mi dáva zlé heslo mohol by som ta poprosiť keby mi napíšeš výsledny kód? aj z komentármi (skor tomu pochopím keď to bude po kope ako takto zvlášt) bol by som ti veľmi vďačný :) |
||
lionel messi Profil |
fodsqa:
„mohol by som ta poprosiť keby mi napíšeš výsledny kód? aj z komentármi (skor tomu pochopím keď to bude po kope ako takto zvlášt)“ Už som to tu naznačil, ale v poriadku, dám teda ešte raz a okomentujem: login.php (formulár meniť nemusíš): <?php session_start(); //zapneme session //pripravíme si prihlasovacie údaje do db $servername = "wm75.wedos.net"; $usernamedb = "***"; $passworddb = "***"; $dbname = "***"; $conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); //pripojíme sa k db //ak sa niečo nepodarilo, vypíšeme chybu if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } //vždy escapuj užívateľský vstup pri práci s db kvôli bezpečnosti! $uname= $conn->real_escape_string($_POST['username']); $pswd= $conn->real_escape_string($_POST['password']); $nick="meno"; $hesloo="hesloo"; //zostavíme dotaz $result = $conn->query("SELECT * FROM users WHERE meno = '$uname' AND heslo = md5('$psswd')"); //zistíme, či v tabuľke existuje užívateľ so zadaným menom a heslom $num_rows = $result->num_rows; //ak užívateľ existuje if($num_rows) { //uložíme údaje do session $_SESSION["username"] = $uname; //uložíme meno echo $_SESSION["username"]; //vypíšeme meno //a môžeme urobiť prakticky čokoľvek } //ak užívateľ so zadanými údajmi neexistuje, vypíšeme chybu else { echo "Nesprávne meno alebo heslo."; } |
||
fodsqa Profil |
#11 · Zasláno: 13. 12. 2014, 22:52:50
lionel messi:
Zkopíroval som to , uploadol a dáva mi "Nesprávne meno alebo heslo." :/ |
||
juriad Profil |
lionel messi:
Řádky 19 a 20 nedávají smysl. Rozhodně nechceš nějakou funkcí pozměnit zadané heslo a pak to zahashovat. Napřed hashovat a až jako poslední krok je potřeba escapovat. A teď koukám, že hashuješ dvakrát, jednou v PHP a podruhé v MySQL; hashuj jen jednou. Nepoužívej MD5, není bezpečná; použij k tomu určené hashovací funkce. fodsqa: Quick fix: zruš 20. řádek |
||
lionel messi Profil |
juriad:
Ďakujem za opravu, kód som už upravil aj v [#10], chyba vznikla použitím copy/paste, nevšimol som si, že fodsqa hashoval už v origináli 2 razy (popri iných chybách). „Nepoužívej MD5, není bezpečná; použij k tomu určené hashovací funkce.“ O tejto problematike viem, nechcel som ňou zaťažovať začiatočníka, password_hash je samozrejme ideál, ale napr. závislý od verzie PHP. |
||
fodsqa Profil |
#14 · Zasláno: 13. 12. 2014, 23:04:07
juriad:
Zmenil som to na sha1 lionel messi: Aj tak mi to nejde anetuším prečo , nebolo by dobre keby sem dám aj register.php možno bude tam chyba , alebo ja neviem :/ |
||
lionel messi Profil |
#15 · Zasláno: 13. 12. 2014, 23:06:55
fodsqa:
„nebolo by dobre keby sem dám aj register.php možno bude tam chyba“ Daj a pozrieme sa na to. |
||
fodsqa Profil |
form
<form action="register.php" method="POST"> <strong> Username: <input type="text" name="username"/><br /> Password: <input type="password" name="password"/><br /> E-mail: <input type="text" name="email"/><br /><br /> <input type="submit" name="register" value="Register"/><br></strong> </form> register.php <?php $servername = "wm75.wedos.net"; $usernamedb = "***"; $passworddb = "****"; $dbname = "***"; $conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "INSERT INTO users (meno, heslo, email) VALUES ('" . $conn->real_escape_string($_POST['username']) . "', '" . sha1($_POST['password']) . "', '" . $conn->real_escape_string($_POST['email']) . "')"; if ($conn->query($sql) === TRUE) { header("Location: index_start.php"); echo "Úspešne zaregistrovaný" ; } else { echo "Error: " . $sql . "<br>" . $conn->error; } $conn->close(); ?> |
||
lionel messi Profil |
#17 · Zasláno: 13. 12. 2014, 23:15:38
fodsqa:
Žiadnu zásadnú chybu nevidím, predpokladám, že pri pokuse o registráciu vypíše úspešne zaregistrovaný, |
||
fodsqa Profil |
#18 · Zasláno: 13. 12. 2014, 23:18:05
lionel messi:
NO viem , ale tak myslel som že možno bude no , ano je tam úspešne zaregistrovaný .... tušite niekto ako to má byť teda? :/ |
||
juriad Profil |
fodsqa:
Například v [#10] lionel messi je překlep: $pswd a $passwd . Bývalo tam dvojí hashování, ale to jsi snad už vyřešil.
Zkus si před zavoláním dotaz do databáze vypsat, velice často budeš překvapený tím, že nevypadá tak, jak očekáváš. $dotaz = "SELECT * FROM users WHERE meno = '$uname' AND heslo = sha1('$pswd')"; echo $dotaz; $conn->query($dotaz); Ozřejmen $dotaz |
||
fodsqa Profil |
#20 · Zasláno: 14. 12. 2014, 00:47:12
juriad:
čo ma ten $dotaz robiť? viem že mi má vpísať dačo |
||
juriad Profil |
fodsqa:
To je jen pro kontrolu, takto bys třeba zjistil, že se hasha počítá z prázdného řetězce. Ukaž, jak vypadá tvůj kód teď. |
||
fodsqa Profil |
takto? prepać ale ak tam je dačo zle tak ja nevime ja už ani asi nerozmýślam nad tím :/
$conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); //pripojíme sa k db //ak sa niečo nepodarilo, vypíšeme chybu if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } //vždy escapuj užívateľský vstup pri práci s db kvôli bezpečnosti! $uname= $conn->real_escape_string($_POST['username']); $pswd= $conn->real_escape_string($_POST['password']); $nick="meno"; $hesloo="hesloo"; $dotaz = "SELECT * FROM users WHERE meno = '$uname' AND heslo = sha1('$pswd')"; echo $dotaz; $conn->query($dotaz); //zostavíme dotaz $result = $conn->query("SELECT * FROM users WHERE meno = '$uname' AND heslo = sha1('$psswd')"); //zistíme, či v tabuľke existuje užívateľ so zadaným menom a heslom $num_rows = $result->num_rows; //ak užívateľ existuje if($num_rows) { //uložíme údaje do session $_SESSION["username"] = $uname; //uložíme meno echo $_SESSION["username"]; //vypíšeme meno //a môžeme urobiť prakticky čokoľvek } //ak užívateľ so zadanými údajmi neexistuje, vypíšeme chybu else { echo "Nesprávne meno alebo heslo."; } |
||
juriad Profil |
#23 · Zasláno: 14. 12. 2014, 02:20:14
OK, řádky 11 a 12 smaž. (Kontrolu provádíš v databázi).
Řádek 21 smaž. (Stále tam je ten překlep a navíc je zbytečné dotazovat se podruhé. Řádek 18 uprav na: $result = $conn->query($dotaz); |
||
fodsqa Profil |
#24 · Zasláno: 14. 12. 2014, 12:47:05
juriad:
NO mám čo dalej? $conn = new mysqli($servername, $usernamedb, $passworddb, $dbname); //pripojíme sa k db //ak sa niečo nepodarilo, vypíšeme chybu if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } //vždy escapuj užívateľský vstup pri práci s db kvôli bezpečnosti! $uname= $conn->real_escape_string($_POST['username']); $pswd= $conn->real_escape_string($_POST['password']); $dotaz = "SELECT * FROM users WHERE meno = '$uname' AND heslo = sha1('$pswd')"; echo $dotaz; $result = $conn->query($dotaz); //zostavíme dotaz $result = $conn->query("SELECT * FROM users WHERE meno = '$uname' AND heslo = sha1('$psswd')"); //zistíme, či v tabuľke existuje užívateľ so zadaným menom a heslom $num_rows = $result->num_rows; //ak užívateľ existuje if($num_rows) { //uložíme údaje do session $_SESSION["username"] = $uname; //uložíme meno echo $_SESSION["username"]; //vypíšeme meno //a môžeme urobiť prakticky čokoľvek } //ak užívateľ so zadanými údajmi neexistuje, vypíšeme chybu else { echo "Nesprávne meno alebo heslo."; } |
||
juriad Profil |
#25 · Zasláno: 14. 12. 2014, 13:03:52
fodsqa:
19. řádek smaž. Když to spustíš, mělo by to fungovat. Měl bys také vidět na stránce vypsaný databázový dotaz (zkontroluj, zda je vpořádku). |
||
fodsqa Profil |
#26 · Zasláno: 14. 12. 2014, 13:32:24
juriad:
vypíše "SELECT * FROM users WHERE meno = 'michal' AND heslo = sha1('bla')Nesprávne meno alebo heslo." Ved sa pozri http://roa.fodsqa.eu/index_start.php normalne sa zaregisruj a skus prihlásiť |
||
juriad Profil |
#27 · Zasláno: 14. 12. 2014, 13:39:59
A když se podíváš do databáze, tak tam ty hodnoty jsou správně?
Co když položíš ten dotaz manuálně? Vrátí něco? |
||
fodsqa Profil |
#28 · Zasláno: 14. 12. 2014, 13:42:37
juriad:
Nechápem ako manuálne? v databázi bolo toto "Meno: a (sha1)Heslo: e9d71f5ee7c92d6dc9e92ffdad17b8bd email c" |
||
juriad Profil |
Aha, konečně se někam dostáváme. To heslo má být:
e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98 .
Že ty máš VARCHAR(32)? Zvětši velikost sloupce na alespoň 40. Pak nové registrace začnou fungovat. |
||
fodsqa Profil |
#30 · Zasláno: 14. 12. 2014, 13:55:36
juriad:
no áno už som to zmenil na 40 nemám tam dat preistotu viac? momentálne vypísalo toto "SELECT * FROM users WHERE meno = 'skuska3' AND heslo = sha1('skuska3')skuska3" |
||
Téma pokračuje na další straně.
|
0