« 1 2 »
Autor Zpráva
fodsqa
Profil
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
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
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
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.";
}
vypíše nám užívateľské meno.
fodsqa
Profil
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
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
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
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
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
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();
?>
viem chýbaju mi tam podmmienky ale to mi je nepodstatne teraz....
lionel messi
Profil
fodsqa:
Žiadnu zásadnú chybu nevidím, predpokladám, že pri pokuse o registráciu vypíše úspešne zaregistrovaný,
fodsqa
Profil
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
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
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
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
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
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
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
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
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"
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0