Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Walidacja formularzy
Forum PHP.pl > Forum > Przedszkole
nait
Witam!

Od dłuższego czasu piszę panel admin. pod jedną ze stronek i chciałbym zrobić to jak najlepiej tongue.gif Mam pytanie odnośnie walidacji. Tak sprawdzam kod tego co już zrobiłem i w sumie wychodzi na to, że czasami sprawdzam to samo w 2 miejscach.

Mam stronę X.php, w niej pokazuję co jest już ew. w bazie i na żądanie daje linki do 'przełącznika' formularzy dodawania/edycji/usuwania danej rzeczy. Poniżej akurat form usunięcia opisu. I tu sprawdzam już czy użytkownik nie manipuluje linkiem, czy wprowadzone dane są poprawne itd. i przesyłam do strony transakcji transact.php gdzie w sumie sprawdzam często ponownie to samo i tu własnie moje pytanie - jest sens w sumie sprawdzać 2x te same rzeczy? issety, empty, is_numeric? Czy w zasadzie sprawdzać to wszystko dopiero w transact.php?

x.php
  1. (...)
  2. elseif (!empty($_GET['description']) || isset($_GET['description']) && array_key_exists('description', $_GET)) {
  3.  
  4. if(!empty($_GET['id']))
  5. $id = $_GET['id'];
  6.  
  7. switch ($_GET['description']) {
  8.  
  9. (...)
  10.  
  11. case 'd':
  12. if(!is_numeric($id) && !isset($id) && empty($id)) {
  13. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  14. header('Location: ?p=about');
  15. break;
  16. }
  17. $d_query = "SELECT * FROM about WHERE id = $id";
  18. $d_result = mysqli_query($connect, $d_query);
  19. if(!$d_result) {
  20. AddReport('error', '<b>Błąd</b> - Bład podczas połączenia z bazą danych, spróbój ponownie później');
  21. header('Location: ?p=about');
  22. break;
  23. }
  24. if (1 == mysqli_affected_rows($connect)) {
  25. $description_d = <<< DeleteDescription
  26. <legend>Czy napewno chcesz usunąć opis?</legend>\n
  27. <input type="hidden" name="id" value="$id" />\n
  28. <input type="hidden" name="action" value="description_d" />\n
  29. <input type="submit" value="Usuń" />\n
  30.   <input type="button" value="Powrót" onClick="history.go(-1)" />\n
  31. DeleteDescription;
  32. } else {
  33. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  34. header('Location: ?p=about');
  35. }
  36. break;
  37.  
  38. (...)


transact.php
  1.  
  2. foreach ($_POST as $key => $value) {
  3. $$key = $value;
  4. }
  5. $stack = array('about, products, contact, slider');
  6. if (isset($_GET['p']) && !empty($_GET['p']) && in_array($_GET['p'], $stack)
  7. && isset($_POST['action']) && !empty($_POST['action']) ) {
  8.  
  9. $directory = $_GET['p'];
  10.  
  11. switch ($_GET['p']) {
  12.  
  13. // ---------------
  14. // ====== ABOUT ========================================================================= //
  15. // ---------------
  16.  
  17. case 'about':
  18. $redirect = '../admin.php?p=about';
  19. switch ($_POST['action']) {
  20.  
  21. (...)
  22.  
  23. case 'description_d':
  24. $query = "SELECT id FROM about WHERE id = $id";
  25. $result = mysqli_query($connect, $query);
  26. if (!isset($id) || empty($id) || !is_numeric($id) || 0 === mysqli_affected_rows($connect)) {
  27. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  28. }
  29. mysqli_free_result($result);
  30. if (empty($_SESSION['reports'])) {
  31. $query = "DELETE FROM about WHERE id = $id LIMIT 1";
  32. $result = mysqli_query($connect, $query);
  33. if (!$result)
  34. AddReport('error', '<b>Błąd</b> - Bład podczas połączenia z bazą danych, spróbój ponownie później');
  35. }
  36. if (empty($_SESSION['reports']))
  37. AddReport('successs', "<b>Opis usunięty pomyślnie</b>");
  38. else
  39. $redirect .= "&link=d&id=$id";
  40. break;
  41.  
  42. (...)
  43.  
nospor
  1. if(!empty($_GET['id']))
  2. $id = (int)$_GET['id'];
  3. else
  4. $id = null;
  5. //......
  6. //......
  7. if(empty($id)) {
  8.  
  9. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  10.  
  11. header('Location: ?p=about');
  12.  
  13. break;
  14.  
  15. }

I już

elseif (!empty($_GET['description']) || isset($_GET['description']) && array_key_exists('description', $_GET)) {
Ty masz normalnie lekką paranoję...

elseif (!empty($_GET['description'])) {
I już.
nait
Fajna wskazówka, pozmieniam.

@up
haha biggrin.gif tyle się naczytałem postów na forum, że niby to i później jeszcze to radzili, a później coś jeszcze i tak jakoś wyszło tongue.gif

No ok, ale w sumie nie o to tez chodzi tongue.gif
Podczas generowania formularza w x.php sprawdzam isset, empty bla bla i czy jest w bazie owy opis, i później w transact.php w zasadzie to samo. Pytanie czy to ma sens? Czy dopiero to wszystko w transact.php sprawdzać, a w x.php .. no właśnie co tongue.gif Trochę się to rozrosło i przyznam się że się trochę już pogubiłem biggrin.gif
nospor
Przestań jęzorować.... czy w czasie normalnej rozmowy z drugim człowiekiem twarzą w twarz, też co drugie zdanie pokazujesz temu komuś język?

Sprawdzać należy na każdym etapie, gdy odbierasz jakieś dane od użytkownika. Jak będziesz coś sprawdzał dopiero w ostatnim etapie, to pierwszy lepszy haker zrobi ci kuku na etapach, na których nie sprawdzasz.
nait
Tak testowałem to co wyżej pisałeś i nie wystarczy samo if($id) w sumie? Jak będzie to coś poza liczbą daje 0 czyli w if warunek i tak nie będzie spełniony?
nospor
if(empty($id)) {
załatwia wszystko. Co ci nie pasuje? Czy dasz 0, czy nie dasz nic, czy dasz tekst to wszystko to ci wejdzie w ten IF.
nait
Mój błąd źle sprawdziłem.
Mam jeszcze jedno pytanie. Która wersja? Sry za trucie ale wolę nabierać dobrych nawyków.
1 v ciut dłuższa ale po co wykonywać zapytanie do bazy jeśli id i tak będzie fake.

  1. if(empty($id)) {
  2. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  3. break;
  4. }
  5. $query = "SELECT id FROM about WHERE id = $id";
  6. $result = mysqli_query($connect, $query);
  7. if (0 === mysqli_affected_rows($connect)) {
  8. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  9. }

czy
  1. $query = "SELECT id FROM about WHERE id = $id";
  2. $result = mysqli_query($connect, $query);
  3. if (empty($id) || 0 === mysqli_affected_rows($connect)) {
  4. AddReport('error', '<b>Błąd</b> - Opis nie istnieje');
  5. }


Jest trochę późno i mogę już nie myśleć już trzeźwo więc wybacz wink.gif
  1. if (!is_numeric($x) && !empty($x) ||
  2. !is_numeric($y) && !empty($y) ||
  3. !is_numeric($h) && !empty($h) ||
  4. !is_numeric($w) && !empty($w)) {
  5. AddReport('error', '<b>Błąd</b> - Błąd podczas pobierania wymiarów obrazka ');
  6. break;
  7. }

Da się to jakoś uprościć? Tricku z (int) nie mogę zastosować bo pola mogą być puste, gdy obrazek nie jest przycinany, bądź może wystąpić zero gdy jest.
nospor
No skoro $id jest błędne to nie ma sesnu jeszcze lecieć do bazy i go sprawdzać - logiczne wink.gif
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.