Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Nie przetwarza wprowadzonych danych
Forum PHP.pl > Forum > Przedszkole
abel1
Witam
W zasadzie tak jak wpisałem w temacie
Uczę się PHP i w ramach nauki pisze sobie system logowania
Mam problem ze zmianą hasła , mianowicie niby wszystko działa bo hasło zmienia i zapisuje go w bazie
Ale dodałem do rejestracji pytanie zabezpieczające i do skryptu przywracania próbuje tez to dodać . jednak nie działa on tak jak bym tego chciał
Pierwsza próba która zakończyła się sukcesem (zmieniło hasło) stała się moją zmora
Teraz nieważne do jakiego konta bym nie chciał zmienić hasło to nie przyjmuje pytania i odpowiedzi zabezpieczającej zapisanej w bazie
Zmienia hasło jedynie z pytaniem i odpowiedzią jakiej użyłem pierwszy raz
Proszę o pomoc w rozwiązaniu tego problemu , poniżej zamieszczam kod
  1. <?php
  2.  
  3. ini_set( 'display_errors', 'On' );
  4. error_reporting( E_ALL );
  5.  
  6. if(isset($_POST['wyslane'])){
  7.  
  8. $wszystko_OK=true;
  9. $user = $_POST['login'];
  10. $pytanie = $_POST['pytanie'];
  11. $odpowiedz = $_POST['odpowiedz'];
  12. $haslo1 = $_POST['haslo1'];
  13. $haslo2 = $_POST['haslo2'];
  14. if((mb_strlen($haslo1)<8) || (mb_strlen($haslo1)>20))
  15. {
  16. $wszystko_OK=false;
  17. $_SESSION['e_haslo']="Hasło musi posiadać od 8 do 20 znaków!";
  18. }
  19. if($haslo1!=$haslo2)
  20. {
  21. $wszystko_OK=false;
  22. $_SESSION['e_haslo']="Hasła nie zgadzają się!";
  23. }
  24.  
  25. $haslo_hash = password_hash($haslo1, PASSWORD_DEFAULT);
  26.  
  27.  
  28. require_once "connect.php";
  29. mysqli_report(MYSQLI_REPORT_STRICT);
  30.  
  31. try
  32. {
  33.  
  34. $polaczenie= new mysqli($host,$db_user,$db_password,$db_name);
  35. if ($polaczenie->connect_errno!=0)
  36. {
  37. throw new Exception(mysqli_connect_errno());
  38. }
  39. else
  40. {
  41. $zapytanie = $polaczenie->query("SELECT * FROM uzytkownicy WHERE pytanie='$pytanie' AND odpowiedz='$odpowiedz'");
  42.  
  43. if(!$zapytanie) throw new Exception($polaczenie->error);
  44. else{
  45. $ile_pytanie=$zapytanie->num_rows;
  46. if($ile_pytanie!=$pytanie)
  47. {
  48. $wszystko_OK=false;
  49. $_SESSION['e_pytanie']="Pytania nie zgadzają się!";
  50. }
  51. $ile_odpowiedz=$zapytanie->num_rows;
  52. if($ile_odpowiedz!=$odpowiedz)
  53. {
  54. $wszystko_OK=false;
  55. $_SESSION['e_odpowiedz']="Odpowiedzi nie zgadzają się!";
  56. }
  57. }
  58. $zapytanie->close();
  59. if ($wszystko_OK==true)
  60. {
  61.  
  62. $zmiana = "UPDATE uzytkownicy SET pass = '$haslo_hash' WHERE user='$user'";
  63. if ($polaczenie->query($zmiana) === true){
  64. echo '<h3> hasło zmienione , możesz się zalogować</h3> ';
  65. }
  66. else{
  67. throw new Exception($polaczenie->error);
  68. }
  69. }
  70.  
  71. $polaczenie->close();
  72. }
  73. }
  74. catch(Exception $e)
  75. {
  76. echo'<br />info deweloperskie: '.$e;
  77. }
  78. }
  79.  
  80.  
  81. ?>
  82.  
  83. <!DOCTYPE HTML>
  84. <html lang="pl">
  85. <head>
  86. <meta charset="utf-8" />
  87. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  88. <title>Reset hasła </title>
  89. </head>
  90. <body>
  91. <form method="post">
  92.  
  93. Nazwa użytkownika: <br /> <input type="text" name="login" /><br />
  94. Twoje hasło: <br /> <input type="text" name="haslo1" /><br />
  95. <?php
  96. if (isset($_SESSION['e_haslo']))
  97. {
  98. echo '<div class="error">'.$_SESSION['e_haslo'].'</div>';
  99. unset($_SESSION['e_haslo']);
  100. }
  101. ?>
  102. <input type="hidden" name="wyslane" value="TRUE" />
  103. Powtórz hasło: <br /> <input type="text" name="haslo2" /><br />
  104. Pytanie zabezpieczające: <br /> <input type="text" name="pytanie" /><br />
  105. <?php
  106. if (isset($_SESSION['e_pytanie']))
  107. {
  108. echo '<div class="error">'.$_SESSION['e_pytanie'].'</div>';
  109. unset($_SESSION['e_pytanie']);
  110. }
  111. ?>
  112. Odpowiedż: <br /> <input type="text" name="odpowiedz" /><br />
  113. <?php
  114. if (isset($_SESSION['e_odpowiedz']))
  115. {
  116. echo '<div class="error">'.$_SESSION['e_odpowiedz'].'</div>';
  117. unset($_SESSION['e_odpowiedz']);
  118. }
  119. ?>
  120. <br />
  121. <input type="submit" value="Zmień hasło" />
  122.  
  123.  
  124. </form>
  125.  
  126.  
  127. </body>
  128. </html>

Będę wdzięczny za wszelkie podpowiedzi , wskazanie błędu .Podpowiedź jak go rozwiązać
Szymas
Myślę, że problem pojawia się tutaj:
  1. $zapytanie = $polaczenie->query("SELECT * FROM uzytkownicy WHERE pytanie='$pytanie' AND odpowiedz='$odpowiedz'");


Czy nie powinieneś pobrać pytania danego użytkownika? W tym momencie pobierasz użytkowników, którzy mają ustawione takie pytanie i odpowiedź. Co w przypadku gdy kilka osób będzie miało takie same wartości? smile.gif
abel1
Miałeś na myśli żeby w zapytaniu wstawić użytkownika który prosi o zmianę hasła ?

w formularzu jest zmienne
  1. $user = $_POST['login'];

W zapytaniu jak zmieniam na
  1. $zapytanie = $polaczenie->query("SELECT user='$user' FROM uzytkownicy WHERE pytanie='$pytanie' AND odpowiedz='$odpowiedz'");

nie przynosi to efektu , nadal wyświetla że pytanie i odpowiedz są nieprawidłowe

Naprawdę nikt nie wie co powoduje ten problem ?
Gdzie w tym kodzie mam skopane ?
viking
Teraz masz skopane zapytanie. Sprawdzanie usera powinno być w WHERE.
Poczytaj o bindowaniu parametrów bo masz możliwe sql injection
abel1
Jak dam usera do WHERE to wywala się błędem w zapytaniu więc user musi pozostać gdzie jest
Bindowanie , no tak jak będe miał zamiar tego gdziesz urzywać to dodam ,ale to musi najpierw działac
Ja sie ucze PHP a to robie jako ćwiczenie
Kurcze i nie moge przebrnac przez ten problem już 3 dzień
viking
W jaki sposób dodajesz do where?
abel1
  1. $zapytanie = $polaczenie->query("SELECT pytanie='$pytanie' AND odpowiedz='$odpowiedz' FROM uzytkownicy WHERE user='$user'");


Niestety pisze mi że błedne pytanie i odpowiedź
A w bazie taki format zapytania działa
Pyton_000
var_dump("SELECT pytanie='$pytanie' AND odpowiedz='$odpowiedz' FROM uzytkownicy WHERE user='$user'");
viking
I naprawdę nie rzuca ci się w oczy że twoje zapytanie nijak ma się do składni select?
http://dev.mysql.com/doc/refman/5.7/en/select.html
Pyton_000
Viking jakbyś odpalił to byś zobaczył że zadziała biggrin.gif
Ale co fakt to fakt że jest bezsensowne smile.gif
viking
Pewnie zwróci 1 ale takie błądzenie nie ma sensu.
abel1
var_dump jest błedne
Fatal error: Call to undefined method mysqli::var_dump()

Ja sie dopiero ucze , prosze o wyrozumiałość
Pyton_000
Ty masz to odpalić przed zapytaniem a nie wywoływać z mysqli...

Poza tym to że się uczysz nie zwalnia Cię z używania manuala...
abel1
var_dump jak zapewne było do przewidzenia wyświetlił to co wpisuje w formularzu

string(85) "SELECT pytanie='*******' AND odpowiedz='*********' FROM uzytkownicy WHERE user='*******'"
Więc z formularza jest to przesyłane
Rysh
To teraz porównaj sobie Twoje zapytanie z np tym:
  1. SELECT col_name FROM tbl_name WHERE col_name > 0;

I koniecznie do przeczytania:
http://dev.mysql.com/doc/refman/5.7/en/select.html
abel1
Próbowałem na różne sposoby zadawać pytanie do MySQL ale coś mi to nie wychodzi
Ciekawe jet natomiast to że jak podam pytanie i odpowiedź które użyłem na samym początku (kilka dni temu) jak wydawało mi sie że to działa hasło zmienia i nie wywala się błędem
Trochę zagmatwałem chyba wyjaśnię.
Kilka dni temu ja zaczęło mi to działać użyłem pytania dajmy na to "pytaniezabezpieczajace" odpowiedż " odpowiedznatopytanie"
To pytanie i odpowiedź była przypisana do użytkownika którego ręcznie skasowałem z bazy danych
Teraz tylko i wyłącznie z tą kombinacja ( pytanie - odpowiedź ) działa
Wpisywanie innych (zapisanych w bazie MySQL ) pytań i odpowiedzi nie działa ,zawsze pisze że są blednę
viking
W pierwszym poście miałeś chociaż poprawne zapytanie do bazy. Sensu co prawda to rozwiązanie nie ma ale za to składnia była prawidłowa. Moja rada. Na początek, jeśli jeszcze nie masz, zainstaluj lokalnie mysql, jakiś program do zarządzania typu heidisql, stwórz sobie strukturę testową i popróbuj napisać różne zapytania. Zobacz jakie są efekty w edytorze i dopiero je przenieś do PHP. I CZYTAJ dokumentację bo widać wyraźnie że tego nie robisz.
Dopiero jak to ogarniesz poczytaj o zasadach normalizacji, kluczach obcych, złączeniach JOIN. Potem wybierz użytkownika po loginie i dopiero sprawdzaj jego pytanie. Pewnie masz jakieś dane zapisane w sesji stąd za drugim razem działa inaczej.
Z innych uwag. Nie zapisuj komunikatów w sesji tylko np. jakiejś tablicy. Nie podstawiaj danych z formularza bezpośrednio do zapytania - binduj parametry. MYSQLI_REPORT_STRICT ustawia rzucanie wyjątków więc bez sensu jest if -> Exception, warunek $ile_pytanie!=$pytanie: jaki sens ma porównanie pytania z ilością zwróconych wierszy?
abel1
Tak jak napisałeś tak tez zrobie . Wezmę się jeszcze raz od początku za naukę .
Ale nie daje mi to spokoju , jak się to dzieje że nie przyjmuje tego co wpisuje w formularzu ?
Rozumiem że sesja może trwać i dlatego to co wpisze może nie brać pod uwagę.Ale na innej przeglądarce nie ma tej sesji więc nie powinno to mieć wpływu
viking
Już pisałem ze ten if nie ma żadnego sensu. Porównujesz 2 różne dane.
abel1
Dziękuje takiej podpowiedzi właśnie oczekiwałem.
Teraz wszystko działa jak powinno
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.