Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: > skrypt logowania PHP polaczony z baza danych MySQL
Forum PHP.pl > Forum > PHP
major697
Cześć zrobiłem krótki skrypt logowania się do bazy danych, wygląda następująco:

  1. <?php
  2. //ustawienie sesji
  3. session_save_path("session/");
  4.  
  5. include 'db.php';
  6. //return print_r ($_POST);
  7. if (isset($_POST['log_in'])) {
  8. $login = $_POST['login'];
  9. $haslo = $_POST['pass'];
  10. $hasloMd5 = md5($haslo);
  11.  
  12. if ($zapytanie = "SELECT * FROM `uzytkownicy` WHERE `haslo` = ? AND `login` = ?") {
  13. $result = $db_mysqli->prepare($zapytanie);
  14. $result->bind_param('ss', $hasloMd5, $login);
  15. $result->execute();
  16. $result->close();
  17. } elseif ($db_mysqli->error) {
  18. echo "Could not prepare SQL: " . $db_mysqli->error;
  19. }
  20.  
  21. $result2 = mysqli_num_rows($result);
  22. $result3 = mysqli_fetch_array($result);
  23. $result4 = mysqli_fetch_array($result);
  24.  
  25. //$result4 = mysqli_fetch_all($result);
  26. print_r($result2);
  27. echo ($result3);
  28. //echo ($result4);
  29.  
  30.  
  31. //echo($result2);
  32. echo printf ($result2);
  33. echo "<br />";
  34. echo printf ($result3);
  35. echo "<br />";
  36. echo printf ($result4);
  37. /*
  38. if ($result3['kod'] != "aktywowano") {
  39. return header("Location: index.php?error=7");
  40. }
  41.  
  42. if (empty($login) || empty($hasloMd5)) {
  43.  
  44. return header("Location: index.php?error=5");
  45.  
  46. }
  47.  
  48. if ($hasloMd5 != $result3['haslo']) {
  49. return header("Location: index.php?error=6");
  50.  
  51. }
  52.  
  53. if ($ileUzyt = $result3 > 0) {
  54. echo "jest wiecej niz 1";
  55.  
  56. } else {
  57. return header("Location: index.php?error=4");
  58.  
  59. }
  60. */
  61. }
  62. ?>


Problem jest prawdopodobnie w sekcji zapytania (linie: 13-20) Ponieważ gdy zrobię zwrócenie wyników to wyrzuca mi wartość 0 (Linia 35). Nie wiem dlaczego zapytanie jest błędne i nie wyrzuca mi nic z bazy danych.

Podam także działający skrypt logowania (ale ten jest bez zabezpieczeń przed SQL Infection):

  1. <?php
  2.  
  3. if (isset($_POST['log_in'])) {
  4. $login = $_POST['login'];
  5. $haslo = $_POST['pass'];
  6. $hasloMd5 = md5($haslo);
  7.  
  8. $zapytanie = "SELECT * FROM `uzytkownicy` WHERE `login` = '$login' AND `haslo` = '$hasloMd5'";
  9. $result = $db_mysqli->query($zapytanie);
  10. $result2 = mysqli_num_rows($result);
  11. $result3 = mysqli_fetch_assoc($result);
  12.  
  13.  
  14. if ($ileUzyt = $result3 > 0) {
  15. echo "jest wiecej niz 1";
  16.  
  17. } else {
  18. header("Location: index.php?error=4");
  19. exit();
  20. }
  21.  
  22. }
  23.  
  24. ?>


Oraz formularz logowania:

  1. <!DOCTYPE html>
  2. <title>Magazyn na PHP</title>
  3. <meta name="name" content="content" charset="utf-8">
  4. </head>
  5.  
  6. <?php
  7.  
  8. if (isset($_GET['error'])) {
  9. echo "<pre>";
  10. switch ($_GET['error']) {
  11. case 0:
  12. echo "Wypelnij wszystkie pola";
  13. break;
  14. case 1:
  15. echo "Hasla nie sa identyczne";
  16. break;
  17. case 2:
  18. echo "Taki ziomek juz istnieje";
  19. break;
  20. case 3:
  21. echo "Takie konto nie zostało założone!";
  22. break;
  23. case 4:
  24. echo "Nie ma takiego uzytkownika w bazie danych";
  25. break;
  26. case 5:
  27. echo "Nie wpsiałeś loginu i/lub hasła";
  28. break;
  29. case 6:
  30. echo "Wpisałeś błędne hasło!";
  31. break;
  32. case 7:
  33. echo "Konto nie zostało jeszcze aktywowane!";
  34. break;
  35. default:
  36. echo "Nieznany blad";
  37. break;
  38. }
  39. echo "</pre>";
  40. }
  41.  
  42. if (isset($_GET['success'])) {
  43. echo "<h3>";
  44. switch ($_GET['success']) {
  45. case 0:
  46. echo "rejestracja OK";
  47. break;
  48. case '1':
  49. echo "Pomyslnie zamieniono na aktywowano";
  50. break;
  51. default:
  52. echo "Inny błąd";
  53. break;
  54. }
  55. echo "</h3>";
  56. }
  57.  
  58. ?>
  59.  
  60. <legend>Logowanie do magazynu</legend>
  61. <form action="login.php" method="post" accept-charset="utf-8">
  62. <label><input type="text" name="login" placeholder="wpisz swoj login"></label>
  63. <label><input type="password" name="pass" placeholder="podaj haslo"></label>
  64. <input type="submit" name="log_in" value="Zaloguj"></input>
  65.  
  66. </form>
  67. <br /><br />
  68. <legend>rejestracja do magazynu</legend>
  69. <form action="login.php" method="post" accept-charset="utf-8">
  70. <label><input type="email" name="login" placeholder="wpisz swoj E-mail"></label>
  71. <label><input type="password" name="pass" placeholder="podaj haslo"></label>
  72. <label><input type="password" name="pass2" placeholder="powtorz haslo"></label>
  73. <input type="submit" name="register" value="Zarejestruj"></input>
  74.  
  75. </form>
  76.  
  77. </body>
  78. </html>
com
po pierwsze włącz błedy po drugie:
  1. if ($zapytanie = "SELECT * FROM `uzytkownicy` WHERE `haslo` = ? AND `login` = ?") {

Tu coś Ci nie wyszło, zrób try catch
major697
A co w tym zapytaniu jest źle questionmark.gif
com
chodzi o ten warunek w if, zamiast if zrób blok try catch
viking
Jest bez sensu bo porównujesz string. Co zwraca if ('string')? Odpytaj bazę a if zrób na wynikach np ile wierszy zostało zwróconych. Nie stosuj md5 do haseł.
major697
Ok dzieki za odp. Zaraz zmienię to zapytanie.
A do hashowania powinienem uzyc którejś z tych metod??:

  1. <?php
  2. $string = 'Przykładowy tekst do hashowania.';
  3. $hash['sha1'] = hash('sha1', $string);
  4. $hash['sha256'] = hash('sha256', $string);
  5. $hash['md5'] = hash('md5', $string);
  6. $hash['ripemd128'] = hash('ripemd128', $string);
  7. $hash['snefru'] = hash('snefru', $string);
  8. ?>

;

EDIT:

Zrobilem cos takiego ale zwraca mi: "cos nie tak!!!"

  1. <?php
  2. if (isset($_POST['log_in'])) {
  3. $login = $_POST['login'];
  4. $haslo = $_POST['pass'];
  5. $hasloMd5 = md5($haslo);
  6.  
  7. $zapytanie = "SELECT * FROM `uzytkownicy` WHERE `login` = ? AND `haslo` = ?";
  8. $result = $db_mysqli->prepare($zapytanie);
  9. $result->bind_param('ss', $login, $hasloMd5);
  10. $result->execute();
  11. $result->close();
  12.  
  13. $res3 = mysqli_num_rows($result);
  14. printf ($res3);
  15.  
  16. if ($row = $res3 >= 1) {
  17. echo "Jest wiecej niż jeden";
  18. } else {
  19. echo "cos nie tak!!!";
  20. }
  21. }
  22. ?>


Co takiego zrobiłem źle, że ten skrypt poniżej działa poprawnie a ten wyżej nie questionmark.gif

  1. <?php
  2.  
  3. if (isset($_POST['log_in'])) {
  4. $login = $_POST['login'];
  5. $haslo = $_POST['pass'];
  6. $hasloMd5 = md5($haslo);
  7.  
  8. $zapytanie = "SELECT * FROM `uzytkownicy` WHERE `login` = '$login' AND `haslo` = '$hasloMd5'";
  9. $result = $db_mysqli->query($zapytanie);
  10. $result2 = mysqli_num_rows($result);
  11. $result3 = mysqli_fetch_assoc($result);
  12.  
  13.  
  14. if ($ileUzyt = $result3 > 0) {
  15. echo "jest wiecej niz 1";
  16.  
  17. } else {
  18. header("Location: index.php?error=4");
  19. exit();
  20. }
  21.  
  22. }
  23.  
  24. ?>
com
viking On tam nawet nie porównywał do stringa, a do niego przypisywał, wiec warunek zawsze spełniony.
major697
nie mieszaj obiektowego mysqli z strukturalnym, nie działa bo zamykasz połączenie przed czyli $result->close();
major697
Wiem z tym zamknięciem. Przeniosłem je na koniec skryptu ale to nic nie daje bo dalej zwraca mi "cos nie tak!!!"
Posługiwałem sie podobnym skryptem który wygląda tak (Formularz kliknij):
  1. <?php
  2. //Sprawdzamy czy użytkownik o podanych danych istnieje
  3. $stmt = $db->prepare("SELECT * FROM users WHERE login=:login AND password=:password");
  4. $stmt->bindValue(":login", $login, PDO::PARAM_STR);
  5. $stmt->bindValue(":password", $password, PDO::PARAM_STR);
  6. $stmt->execute();
  7. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  8. if($stmt->rowCount()!=0){
  9. echo "Zalogowałeś się!";
  10. /*
  11.   * Tworzymy sesję dla zalogowanego użytkownika z:
  12.   * - informacją, że użytkownik jest zalogowany
  13.   * - jego id
  14.   */
  15. $_SESSION['logged'] = true;
  16. $_SESSION['user_id'] = $row['id'];
  17.  
  18. }
  19. else{
  20. echo '<div style="color:red">Login i/lub hasło są nieprawidłowe</div>';
  21. form();
  22. }
  23.  
  24. ?>


Ale nawet gdy zmienie zapytanie na coś takiego:

  1. <?php
  2. if (isset($_POST['log_in'])) {
  3. $login = $_POST['login'];
  4. $haslo = $_POST['pass'];
  5. $hasloMd5 = md5($haslo);
  6.  
  7. $result = "SELECT * FROM `uzytkownicy` WHERE `login` = :login AND `haslo` = :hasloMd5";
  8. $result = $db_mysqli->prepare($result);
  9. //$result->bind_param('ss', $login, $hasloMd5);
  10. //$result->execute();
  11.  
  12. $result->bindValue(":login", $login, PDO::PARAM_STR);
  13. $result->bindValue(":hasloMd5", $hasloMd5, PDO::PARAM_STR);
  14. $result->execute();
  15.  
  16.  
  17. $res3 = mysqli_num_rows($result);
  18.  
  19. if ($row = $res3 !=0) {
  20. echo "Jest wiecej niż jeden";
  21. } else {
  22. echo "cos nie tak!!!";
  23. }
  24. $result->close();
  25. ?>


To wyrzuca mi błąd: "Fatal error: Call to a member function bindValue() on a non-object in... ADRES"
com
bo tam jest pdo, a ty masz mysqli, one sa podobne ale to nie to samo smile.gif

$result->num_rows; tak powinno u ciebie wygladać
major697
Dalej tego nie ogarniam mam teraz taki skrypt:

  1. <?php
  2. if (isset($_POST['log_in'])) {
  3. $login = $_POST['login'];
  4. $haslo = $_POST['pass'];
  5. $hasloMd5 = md5($haslo);
  6.  
  7.  
  8. $result = $db_mysqli->prepare("SELECT * FROM `uzytkownicy` WHERE `login` = ? AND `haslo` = ?");
  9. $result->bind_param('ss', $loggin, $hasloMd5);
  10. $result->execute();
  11. $result->num_rows;
  12.  
  13.  
  14.  
  15. if ($result == 0) {
  16. echo "Jest wiecej niż jeden";
  17. } else {
  18. echo "Nie ma takiego rekordu w bazie";
  19. }
  20. $result->close();
  21. }
  22. ?>


Ale tym razem zwraca mi "Jest wiecej niż jeden" tyle,że zwraca taki wynik nawet gdy wpisze w formularzu dane których napewno nie ma w bazie ... błąd muszę mieć więc w zapytaniu
com
bez tych ` przy `login` i `haslo`
viking
var_dump($result) i będziesz wiedział wszystko. Poza tym if ($result->num_rows > 0)
major697
OK z var_dump() zwraca mi że nie ma wpisywanego rekordu w bazie danych, tyle, że według mnie zapytanie jest poprawne bo kiedy je wpisze w phpmyadmin w zapytanie SQl i znak ? zamienię na maila podanego przy rejestracji to normalnie wyrzuci poprawny wynik a w skrypcie jest coś źle. Skrypt wygląda tak

  1. <?php
  2. if (isset($_POST['log_in'])) {
  3. $login = $_POST['login'];
  4. $haslo = $_POST['pass'];
  5. $hasloSha1 = sha1($haslo);
  6.  
  7. $result = $db_mysqli->prepare("SELECT * FROM uzytkownicy WHERE login = ? AND haslo = ?");
  8. $result->bind_param('ss', $login, $hasloSha1);
  9. $result->execute();
  10. //$result->num_rows;
  11.  
  12. //var_dump($result);
  13.  
  14. if ($result->num_rows > 0) {
  15. echo "Jest wiecej niż jeden";
  16. } else {
  17. echo "Nie ma takiego rekordu w bazie";
  18. }
  19. $result->close();
  20. }
  21. ?>


Wynik z var_dump:

C:\wamp64\www\projekty\login.php:25:
object(mysqli_stmt)[2]
public 'affected_rows' => int -1
public 'insert_id' => int 0
public 'num_rows' => int 0
public 'param_count' => int 1
public 'field_count' => int 4
public 'errno' => int 0
public 'error' => string '' (length=0)
public 'error_list' =>
array (size=0)
empty
public 'sqlstate' => string '00000' (length=5)
public 'id' => int 1

wykonałem bindowanie (linia 8) według tej instrukcji: LINK Nie wiem dalej gdzie jest błąd bo po wpisaniu loginu (takiego jaki jest w bazie) wyrzuca: Nie ma takiego rekordu w bazie
viking
Według public 'param_count' => int 1 bindowany jest tylko 1. Z kodu który tu wrzucasz wynika że podajesz 2.
major697
Nawet jeśli usunę parametr hasło z zapytania i skrypt bedzie wyglądał tak:

  1. <?php
  2. if (isset($_POST['log_in'])) {
  3. $login = $_POST['login'];
  4. $haslo = $_POST['pass'];
  5. $hasloSha1 = sha1($haslo);
  6.  
  7. $quer = "SELECT * FROM uzytkownicy WHERE login = ?";
  8. $result = $db_mysqli->prepare($quer);
  9.  
  10. $result->bind_param('ss', $login);
  11. $result->execute();
  12.  
  13. $result->num_rows;
  14. var_dump($result);
  15. //
  16.  
  17. if ($result->num_rows > 0) {
  18. echo "Jest wiecej niż jeden";
  19. } else {
  20. echo "Nie ma takiego rekordu w bazie";
  21. }
  22.  
  23. $result->close();
  24. }
  25. ?>


i jesli wpiszę tylko parametr login to i tak wyrzuci Nie ma takiego rekordu w bazie.
A wynik z var_dump bedzie wyglądał tak:

C:\wamp64\www\projekty\login.php:17:
object(mysqli_stmt)[2]
public 'affected_rows' => int 0
public 'insert_id' => int 0
public 'num_rows' => int 0
public 'param_count' => int 1
public 'field_count' => int 4
public 'errno' => int 0
public 'error' => string '' (length=0)
public 'error_list' =>
array (size=0)
empty
public 'sqlstate' => string '00000' (length=5)
public 'id' => int 1
viking
A sprawdzałeś co masz w $_POST?
major697
Tak sprawdzalem:
printf($_POST['login']);

i to co wpisze w formularzu w login to jest poprawnie zwracane
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.