Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zmienna z GET w innym pliku.
Forum PHP.pl > Forum > Przedszkole
kapsel2105
Witam wszystkich.
Proszę o wyrozumiałość gdyż to mój pierwszy post.
Dopiero zaczynam przygodę z PHP.

Mianowicie mam problem z jedną zmienną, które nie mogę wyłapać.
Próbuje na znane mi sposoby, ale widocznie jeszcze za mało umiem.

Sprawa wygląda następująco:
Mam zrobioną rejestrację która wysyła mail na wpisany adres mail z prośbą o aktywację.
Link wygląda następująco:
Kod
http://moja_domena/weryfikacja.php?weryfikacja=potwierdz&kod=2067450578508451e4155be.

Klikając w niego zmienna w bazie zmienia stan z 0 na 1.
Poniżej kod z pliku wykonującego zadanie
  1. <?php include('header.php'); ?>
  2. <h2>&raquo; Weryfikacja użytkownika</h2>
  3. <div class="content">
  4.  
  5. <?php
  6.  
  7.  
  8. if ($_GET['weryfikacja'] == 'potwierdz') {
  9.  
  10. include 'inc/db.php'; // połączenie się z bazą danych
  11. $tabela = 'rejestracja'; // zdefiniowanie tabeli MySQL
  12.  
  13. $kod = htmlspecialchars(stripslashes(strip_tags(trim($_REQUEST['kod']))), ENT_QUOTES); // filtrowanie $_GET['kod']
  14.  
  15. // jeżeli kod znajduje się w URL, skrypt najpierw patrzy czy użytkownik ma aktywne konto
  16. // jeżeli nie ma, wtedy zmienia się jego status, jeżeli nie upłynęło 48 godzin od rejestracji
  17.  
  18. $wynik = mysql_query("SELECT * FROM $tabela
  19. WHERE kod='$kod' and status=1");
  20.  
  21. if (mysql_num_rows($wynik) == 1) {
  22. echo '<span class="powodzenie">Aktywowałeś już swoje konto.</span>';
  23. exit;
  24. } else {
  25. $wynik = mysql_query("DELETE FROM $tabela
  26. WHERE data<=DATE_SUB(NOW(),INTERVAL 2 DAY) and status=0");
  27. $wynik = mysql_query("UPDATE $tabela
  28. SET status='1', data=NOW() WHERE kod='$kod' and status=0");
  29. $wynik = mysql_query("SELECT * FROM $tabela
  30. WHERE kod='$kod' and status=1");
  31. if (mysql_num_rows($wynik) == 1) {
  32. echo '<span class="powodzenie">Dziękujemy. Rejestracja została zakończona poprawnie. Możesz teraz ustanowić swoje hasło dostępu.</span>';
  33.  
  34. }
  35. }
  36.  
  37. // jeżeli został wprowadzony zły link, wyświetla się błąd
  38. if (!$kod or mysql_num_rows($wynik)<>1) {
  39. echo '<p>Aktywowanie konta nie powiodło się.</p>';
  40. }
  41.  
  42. mysql_close($polaczenie);
  43.  
  44. }
  45.  
  46. ?>
  47. </div>
  48. <?php include('footer.php'); ?>


Po kliknięciu w link pokazuje się informacja o tym że konto zostało pomyślnie aktywowane.

I teraz chciałbym aby umieścić tutaj możliwość ustawienia hasła gdzie będzie tylko taka możliwość tylko raz.

Mam napisany poniższy kod, dzięki któremu mogę zmienić hasło jak jestem już zalogowany, i trwa sesja.

  1. <head>
  2. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  3. <link rel="stylesheet" href="css/style.css" type="text/css"
  4. media="screen" />
  5. </head>
  6. <h2>&raquo; Ustawienie hasła</h2>
  7. <div class="content">
  8.  
  9. <?php
  10.  
  11. include 'inc/db.php'; // połączenie się z bazą danych
  12. $tabela = 'rejestracja'; // zdefiniowanie tabeli MySQL
  13.  
  14. //początek skryptu zmiany hasła
  15.  
  16. if ($_POST['wyslane']) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt
  17. // formularz ustawienia hasła
  18.  
  19. $haslo = $_POST['haslo'];
  20. $haslo2 = $_POST['haslo2'];
  21. //$kod = $_REQUEST['kod'];
  22.  
  23. // system sprawdza czy prawidłowo zostały wprowadzone dane
  24.  
  25. if ($haslo) {
  26. if (strlen($haslo) < 6 or strlen($haslo) > 30) {
  27. $blad++;
  28. echo '<span class="blad">Proszę poprawnie wpisać hasło (od 6 znaków do 30 znaków).</span>';
  29. }
  30. }
  31. if ($haslo !== $haslo2) {
  32. $blad++;
  33. echo '<span class="blad">Podane hasła nie są ze sobą zgodne.</span>';
  34. }
  35.  
  36. // jeżeli błąd nie wystąpił, to dane zostają prawidłowo zapisane z bazie MySQL
  37. if ($blad == 0) {
  38.  
  39. if ($haslo == false) {
  40. }
  41. else {
  42.  
  43.  
  44. $haslo = md5($haslo); // szyfrowanie hasla
  45. $wynik2 = mysql_query("UPDATE $tabela SET haslo='$haslo' WHERE kod='$kod1' ");
  46.  
  47.  
  48. }
  49.  
  50. if ($wynik2) {
  51. echo '<span class="powodzenie">Dane zostały zmienione.</span>';
  52. } else {
  53. echo '<span class="blad">Dane nie zostały zmienione.</span>';
  54. }
  55. }
  56. }
  57. //koniec skryptu zmiany hasła
  58.  
  59.  
  60. // mysql_close($polaczenie);
  61.  
  62.  
  63. // tworzenie formularza HTML z danymi użytkownika
  64. echo <<< KONIEC
  65. <br>
  66. <br>
  67.   <form class="form" action="weryfikacja2.php" method="post">
  68.   <input type="hidden" name="wyslane" value="TRUE" />
  69.  
  70.  
  71. <p>
  72. <div class="label"><label for="haslo">Hasło</label></div>
  73. <input type="password" name="haslo" id="haslo" />
  74. </p>
  75.  
  76. <p>
  77. <div class="label"><label for="haslo2">Powtórz hasło</label></div>
  78. <input type="password" name="haslo2" id="haslo2" />
  79. </p>
  80.  
  81.   <p class="submit2">
  82. <input type="submit" value="Aktualizuj moje dane" />
  83. </p>
  84.  
  85. KONIEC;
  86.  
  87. //koniec tworzenia formularza
  88.  
  89. //tu koniec formularza ustawienia hasła
  90.  
  91.  
  92. ?>
  93. </div>


W żaden znany mi sposób nie mogę odebrać zmiennej "$kod".

Z góry dziękuję za pomoc w rozwiązaniu problemu.
[php][/php]
b4rt3kk
Jeśli chcesz, żeby kod był przechowywany w zmiennej GET, to formularz musi ją wysyłać:

  1. <form class="form" action="weryfikacja2.php?kod=jakis_tam_kod" method="post">


Poza tym ten kod miał być chyba tylko do weryfikacji maila? Tak więc po co go trzymać dalej? Jeśli użytkownik jest już zalogowany to zwyczajnie zmień warunek WHERE id_user=$id_user. A to czy już zmieniał hasło przechowuj w kolumnie tabeli, np. 0 jeśli nie zmieniał, 1 jeśli zmieniał.

No i wyedytuj proszę post i wrzuć kod php między znaczniki php, a nie code, bo ciężko się to czyta kiedy trzeba przewijać.
kapsel2105
Cytat(b4rt3kk @ 22.10.2012, 16:59:23 ) *
Jeśli chcesz, żeby kod był przechowywany w zmiennej GET, to formularz musi ją wysyłać:

  1. <form class="form" action="weryfikacja2.php?kod=jakis_tam_kod" method="post">


Poza tym ten kod miał być chyba tylko do weryfikacji maila? Tak więc po co go trzymać dalej? Jeśli użytkownik jest już zalogowany to zwyczajnie zmień warunek WHERE id_user=$id_user. A to czy już zmieniał hasło przechowuj w kolumnie tabeli, np. 0 jeśli nie zmieniał, 1 jeśli zmieniał.

No i wyedytuj proszę post i wrzuć kod php między znaczniki php, a nie code, bo ciężko się to czyta kiedy trzeba przewijać.


Dzękuję za szybką odpowiedź.
Ogólnie wymyśliłem sobie tak że przychodzący mail z linkiem jednocześnie umożliwia ustanowienie hasła.
Czyli klikając w link z maila dostajemy info o tym że weryfikacja przebiegła poprawnie oraz poniżej zostaje wyświetlony formularz (osadzony w include) z dwoma polami oraz walidacją poprawności hasła.
Ma się to wyświetlać tylko raz (czyli w przypadku gdy poprawnie się zweryfikowaliśmy).
Dlatego wymyśliłem żeby odnieść się do zmiennej $kod, gdyż też jest ona zapisana w bazie, w tej samej tabeli. Tylko właśnie nie mogłem jej wyłapać i zmusić aby odniósł się do niej formularz.

Czy mógł byś mi bardziej przybliżyć jak należało by to zrobić?
jaslanin
  1. $kod = htmlspecialchars(stripslashes(strip_tags(trim($_REQUEST['kod']))), ENT_QUOTES); // filtrowanie $_GET['kod']


dobrze że próbujesz filtrować dane otrzymywane od użytkownika, jednak taki kod niestety nie zabezpiecza przed wszystkimi metodami ataku SQL injection.

tylko Twój silnik bazodanowy jest w stanie zagwarantować bezpieczeństwo przekazywania stringów do bazy danych (liczby można można rzutować na int co je zabezpiecza) np. przez funkcje mysql_real_escape_string. A jeszcze lepiej jest używać PDO i prepared statements. Co sugerują twórcy PHP: http://php.net/manual/en/function.mysql-re...cape-string.php
b4rt3kk
Cytat(kapsel2105 @ 22.10.2012, 18:10:54 ) *
Dzękuję za szybką odpowiedź.
Ogólnie wymyśliłem sobie tak że przychodzący mail z linkiem jednocześnie umożliwia ustanowienie hasła.
Czyli klikając w link z maila dostajemy info o tym że weryfikacja przebiegła poprawnie oraz poniżej zostaje wyświetlony formularz (osadzony w include) z dwoma polami oraz walidacją poprawności hasła.
Ma się to wyświetlać tylko raz (czyli w przypadku gdy poprawnie się zweryfikowaliśmy).
Dlatego wymyśliłem żeby odnieść się do zmiennej $kod, gdyż też jest ona zapisana w bazie, w tej samej tabeli. Tylko właśnie nie mogłem jej wyłapać i zmusić aby odniósł się do niej formularz.

Czy mógł byś mi bardziej przybliżyć jak należało by to zrobić?


W skrócie, zmienna GET jak wiesz jest dostępna z paska adresu strony, więc każdy adres po kolei, do którego przechodzisz od momentu kliknięcia w link aktywacyjny musi tą zmienną przekazywać dalej. Przykład. Klikamy link aktywacyjny: strona.pl?kod=123.

  1. $kod = $_GET['kod'];
  2. // jeśli chcemy by zmienna GET była przekazana dalej, każdy link, czy to formularz musi ją zawierać
  3. echo "<form action=\"link.php?kod=$kod\">";
  4. // czy też link do zmiany hasła
  5. echo "<a href=\"link.php?kod=$kod\">klik</a>";

kapsel2105
Więc tak, chciałbym to spakować do jednego pliku, ale nadal nie chce mi to działać.
Wstawiając include`m plik weryfikacja2.php też coś nie działało.

Jeśli można prosił bym o wytłumaczenie, lub choć przybliżenie jak to zrobić by działało poprawnie:

  1. <?php include('header.php'); ?>
  2. <h2>&raquo; Weryfikacja użytkownika</h2>
  3. <div class="content">
  4.  
  5. <?php
  6.  
  7.  
  8. if ($_GET['weryfikacja'] == 'potwierdz') {
  9.  
  10. include 'inc/db.php'; // połączenie się z bazą danych
  11. $tabela = 'rejestracja'; // zdefiniowanie tabeli MySQL
  12.  
  13. $kod = htmlspecialchars(stripslashes(strip_tags(trim($_REQUEST['kod']))), ENT_QUOTES); // filtrowanie $_GET['kod']
  14.  
  15. // jeżeli kod znajduje się w URL, skrypt najpierw patrzy czy użytkownik ma aktywne konto
  16. // jeżeli nie ma, wtedy zmienia się jego status, jeżeli nie upłynęło 48 godzin od rejestracji
  17.  
  18. $wynik = mysql_query("SELECT * FROM $tabela
  19. WHERE kod='$kod' and status=1");
  20.  
  21. if (mysql_num_rows($wynik) == 1) {
  22. echo '<span class="powodzenie">Aktywowałeś już swoje konto.</span>';
  23. exit;
  24. } else {
  25. $wynik = mysql_query("DELETE FROM $tabela
  26. WHERE data<=DATE_SUB(NOW(),INTERVAL 2 DAY) and status=0");
  27. $wynik = mysql_query("UPDATE $tabela
  28. SET status='1', data=NOW() WHERE kod='$kod' and status=0");
  29. $wynik = mysql_query("SELECT * FROM $tabela
  30. WHERE kod='$kod' and status=1");
  31. if (mysql_num_rows($wynik) == 1) {
  32. echo '<span class="powodzenie">Dziękujemy. Rejestracja została zakończona poprawnie. Możesz teraz ustanowić swoje hasło dostępu.</span>';
  33. echo ($kod);
  34.  
  35. //początek skryptu zmiany hasła
  36.  
  37. if ($_POST['wyslane']) { // jeżeli formularz został wysłany, to wykonuje się poniższy skrypt
  38. //od tąd formularz ustawienia hasła
  39.  
  40. $haslo = $_POST['haslo'];
  41. $haslo2 = $_POST['haslo2'];
  42.  
  43.  
  44. // system sprawdza czy prawidłowo zostały wprowadzone dane
  45.  
  46. if ($haslo) {
  47. if (strlen($haslo) < 6 or strlen($haslo) > 30) {
  48. $blad++;
  49. echo '<span class="blad">Proszę poprawnie wpisać hasło (od 6 znaków do 30 znaków).</span>';
  50. }
  51. }
  52. if ($haslo !== $haslo2) {
  53. $blad++;
  54. echo '<span class="blad">Podane hasła nie są ze sobą zgodne.</span>';
  55. }
  56.  
  57. // jeżeli błąd nie wystąpił, to dane zostają prawidłowo zapisane z bazie MySQL
  58. if ($blad == 0) {
  59.  
  60. if ($haslo == false) {
  61. }
  62. else {
  63.  
  64.  
  65.  
  66. $haslo = md5($haslo); // szyfrowanie hasla
  67. $wynik2 = mysql_query("UPDATE $tabela SET haslo='$haslo' WHERE kod='$kod' ");
  68.  
  69.  
  70. }
  71.  
  72. if ($wynik2) {
  73. echo '<span class="powodzenie">Dane zostały zmienione.</span>';
  74. } else {
  75. echo '<span class="blad">Dane nie zostały zmienione.</span>';
  76. }
  77. }
  78. }
  79. //koniec skryptu zmiany hasła
  80.  
  81.  
  82. // mysql_close($polaczenie);
  83.  
  84.  
  85.  
  86.  
  87.  
  88. }
  89. }
  90.  
  91. // jeżeli został wprowadzony zły link, wyświetla się błąd
  92. if (!$kod or mysql_num_rows($wynik)<>1) {
  93. echo '<p>Aktywowanie konta nie powiodło się.</p>';
  94. }
  95.  
  96. mysql_close($polaczenie);
  97.  
  98. }
  99.  
  100. // tworzenie formularza HTML z danymi użytkownika
  101. echo <<< KONIEC
  102. <br>
  103. <br>
  104.  
  105.   <form class="form" action="weryfikacja.php?kod=$kod" method="POST">
  106.   <input type="hidden" name="wyslane" value="TRUE" />
  107.  
  108.  
  109. <p>
  110. <div class="label"><label for="haslo">Hasło</label></div>
  111. <input type="password" name="haslo" id="haslo" />
  112. </p>
  113.  
  114. <p>
  115. <div class="label"><label for="haslo2">Powtórz hasło</label></div>
  116. <input type="password" name="haslo2" id="haslo2" />
  117. </p>
  118.  
  119.   <p class="submit2">
  120. <input type="submit" value="Aktualizuj moje dane" />
  121. </p>
  122.  
  123. KONIEC;
  124.  
  125. //koniec tworzenia formularza
  126.  
  127. //tu koniec formularza ustawienia hasła
  128.  
  129. ?>
  130. </div>
  131.  
  132. <?php include('footer.php'); ?>


Strona odpala się bez błędów, ale nie zmienia wartości w tabeli sad.gif
b4rt3kk
Sprawdź więc czy zapytanie jest poprawne:

  1. echo $query = "UPDATE $tabela SET haslo='$haslo' WHERE kod='$kod'";
  2. $wynik2 = mysql_query($query);
kapsel2105
Dziękuję za naprowadzenie i pomoc b4rt3kk.
Punkcik poleciał.

Temat do zamknięcia.
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.