Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Dlaczego wykonuje się instrukcja if, lecz nie do końca?
Forum PHP.pl > Forum > PHP
arlid
Hej,

mam taki skrypt. Obsługuje formularz aktywacji konta gdzie użytkownik podaje następujące dane: adres mailowy, hasło, kod zabezpieczający z maila. I teraz tak. po aktywacji ma się wykonać ten fragment kodu i pokazać stosowna informacja.

  1. $_SESSION['success'] = '<span style="color:green">Twoje konto zostało aktywowane poprawnie. Potwierdzenie otrzymasz także na swój adres mailowy:'.$email.'</span>';
  2. header('Location: mn-site/aktywacja_konta.php');
  3. include('../mailing/mailing-aktywowanie-konta.php');


Aktywacja jedynie wtedy kiedy wszystkie podane dane się zgadzają. W przeciwnym razie:
  1. $_SESSION['blad'] = '<span style="color:red">podałeś błędne dane</span>';
  2. header('Location: /mn-site/aktywacja_konta.php');
  3. unset($_SESSION['success']);


Niestety nie dział to do końca. Sprawdzałem trzy warianty:
1. Zły mail, reszta ok
2. Złe hasło, reszta ok
3. Zły kod, reszta ok

O ile w pierwszych dwóch przypadkach jest dobrze - podaje błąd i nie ma aktywacji (kolumna kod nie zmienia się na "1" w bazie) o tyle w przypadku 3 dostaję komunikat, że weryfikacja się udała, a konto zostało aktywowane. Mail dochodzi, jednak w bazie nic się nie zmienia konto nadal jest nieaktywne. Jeżeli wprowadzę wszystkie dane poprawnie otrzymuję o co chcę, stosowny komunikat i zmianę "flagi" na 1.

Gdzie tkwi problem, ze kod wykonuje się jakby "częściowo"? Podejrzewam, ze chodzi o coś z tym:
  1. $zapytanie_aktywuj_konto = "UPDATE klient set aktywny = 1 where (email='$email' AND haslo = '$haslo' AND kod='$kod_zabezpieczajacy')";

Jakby nie wykonywało wszystkich ANDów. Poniżej pełny kod tego pliku - może ktoś wyłapie błąd.

  1. <?php
  2.  
  3.  
  4. if ((!isset($_POST['email'])) || (!isset($_POST['haslo'])) || (!isset($_POST['kod'])))
  5. {
  6. header('Location: /mn-site/aktywacja_konta.php');
  7. exit();
  8. }
  9.  
  10. require_once 'connect.php';
  11.  
  12. $polaczenie = @new mysqli($host, $db_user, $db_password, $db_name);
  13.  
  14. if ($polaczenie->connect_errno!=0)
  15. {
  16. echo "Error: ".$polaczenie->connect_errno;
  17. }
  18. else
  19. {
  20. $email = $_POST['email'];
  21. $haslo = md5($_POST['haslo']);
  22. $kod_zabezpieczajacy = $_POST['kod'];
  23.  
  24. $email = htmlentities($email, ENT_QUOTES, "UTF-8");
  25. $haslo = htmlentities($haslo, ENT_QUOTES, "UTF-8");
  26.  
  27. $zapytanie_sprawdzenie_danych = "SELECT email,haslo from klient where email='$email' AND haslo='$haslo'";
  28.  
  29.  
  30. if ($rezultat = @$polaczenie->query($zapytanie_sprawdzenie_danych))
  31. {
  32. if (($rezultat->num_rows)>0) {
  33.  
  34. $zapytanie_aktywuj_konto = "UPDATE klient set aktywny = 1 where (email='$email' AND haslo = '$haslo' AND kod='$kod_zabezpieczajacy')";
  35. if ($rezultat = @$polaczenie->query($zapytanie_aktywuj_konto)){
  36.  
  37. $_SESSION['success'] = '<span style="color:green">Twoje konto zostało aktywowane poprawnie. Potwierdzenie otrzymas ztakże na swój adres mailowy:'.$email.'</span>';
  38. header('Location: mn-site/aktywacja_konta.php');
  39. include('../mailing/mailing-aktywowanie-konta.php');
  40.  
  41.  
  42. unset($_SESSION['blad']);
  43.  
  44.  
  45. }
  46.  
  47. }else{
  48.  
  49.  
  50. $_SESSION['blad'] = '<span style="color:red">podałes błędne dane</span>';
  51. header('Location: mn-site/aktywacja_konta.php');
  52.  
  53. unset($_SESSION['success']);
  54.  
  55. }
  56. }
  57. else {
  58. echo "zapytanie się NIE wykonało";
  59.  
  60. }
  61.  
  62. }
  63.  
  64. $polaczenie->close();
  65.  
  66.  
  67. ?>



Wybaczcie jakoś samego kodu itd, nie jestem w tym aż tak biegły a samouczenie jest chyba najlepsza metodą . Mam nadzieję, że coś da się z tym zrobić smile.gif Pozdrawiam.
borabora
w ifie masz zapytanie bez sprawdzania zgodnosci kodu:
  1. $zapytanie_sprawdzenie_danych = "SELECT email,haslo from klient where email='$email' AND haslo='$haslo'";


dlatego wystarczy podac dobry email i hasło, aby wejść dalej.
Następnie masz:

  1. $zapytanie_aktywuj_konto = "UPDATE klient set aktywny = 1 where (email='$email' AND haslo = '$haslo' AND kod='$kod_zabezpieczajacy')";

updatujesz tylko ten wiersz, gdzie zadza się hasło email i kod. W tym momencie, pomimo, że mamy poprawny email i hasło to zapytanie się nie wykona, podając zły kod.

to zapytanie z ifa zmień na to:
  1. $zapytanie_sprawdzenie_danych = "SELECT email,haslo from klient where email='$email' AND haslo='$haslo' AND kod='$kod_zabezpieczajacy'";
wasyllinio
  1. $zapytanie_aktywuj_konto = "UPDATE klient set aktywny = 1 where (email='$email' AND haslo = '$haslo' AND kod='$kod_zabezpieczajacy')";
  2. if ($rezultat = @$polaczenie->query($zapytanie_aktywuj_konto))


ten IF zawsze Ci zwróci true, bo zapytanie wykonuje się bez błędów logicznych.
proponuję coś takiego

  1. $zapytanie_aktywuj_konto = "UPDATE klient set aktywny = 1 where (email='$email' AND haslo = '$haslo' AND kod='$kod_zabezpieczajacy')";
  2. $rezultat = @$polaczenie->query($zapytanie_aktywuj_konto);
  3. if ($rezultat->affected_rows)

to Ci sprawdzi ilość 'zaktualizowanych wierszy'

mysqli affected_rows
arlid
borabora, logicznie biorąc faktycznie i dlatego mam komunikat, iż się powiodło a mimo tego nie updateuje mi odpowiednio kolumny co już jest ok.
wasyllinio, jak dobrze myślę to chodzi o co, że w przypadku jak jak zrobiłem kod wykona się wtedy kiedy zapytanie zostanie wykonane, a w Twoim dodatkowo sprawdzi czy jakikolwiek wiersz się zaktualizował (co potwierdzi fakt, ze kolumna się zmieniła).

Dzięki za pomoc. Zaraz będę to poprawiał smile.gif
MESSIAH :)
Wywal kolego te małpy z kodu bo za chwilę wrócisz z płaczem że coś nie trybi. A struktura powinna być w ten deseń - jeśli dane z formularza przesłane to uruchom zapytanie do bd. A jeszcze lepiej jak przesiądziesz się na PDO.
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.