Pusty formularz PHP

Odpowiedz Nowy wątek
2019-02-10 18:56
0

Dobry wieczór.
Czy może ktoś podpowiedzieć co w kodzie poniżej trzeba dodać, aby do bazy danych po odświeżaniu nie dodawał się pusty wierz. W jaki sposób sprawdzić pola przed wysłaniem?

<form method="post" action="">
            <p>Imię: <input type="text" name="name"/></p>
            <p>Nazwisko: <input type="text" name="surname"/></p>
            <p>Wiek: <input type="text" name="age"/></p>
            <p>Wzrost: <input type="text" name="growth"/></p>
            <p>Waga: <select name="weight" value="Waga">
            <option value="1">50</option>
            <option value="2">60</option>
            <option value="3">70</option>
            <option value="4">80</option>
            <option value="5">90</option>
            <option value="6">100</option>
            <p>Miasto: <input type="text" name="city"/></p>
            <p>Adres: <input type="text" name="address"/></p>
            <p>Nr domu: <input type="text" name="nrhouse"/></p>
            <p>kod pocztowy: <input type="text" name="postcode"/></p>
            </select></p>
            <p><input type="submit" value="Dodaj"/></p>
            </form>
<?php

    try
    {
         ($_SERVER['REQUEST_METHOD'] == 'POST')
        {   
            $pdo = new PDO('mysql:host=192.168.0.150;dbname=shop;port=3306', 'root', 'Administrator2112');
            $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $stmt = $pdo -> prepare('INSERT INTO `users` (`name`, `surname`, `age`, `growth`, `weight`, `city`, `address`, `nrhouse`, `postcode`)   VALUES(
                :name,
                :surname,
                :age,
                :growth,
                :weight,
                :city,
                :address,
                :nrhouse,
                :postcode)');   // 1

            $stmt -> bindValue(':name', ($_POST['name']), PDO::PARAM_STR); // 2
            $stmt -> bindValue(':surname', ($_POST['surname']), PDO::PARAM_STR);
            $stmt -> bindValue(':age', ($_POST['age']), PDO::PARAM_INT);
            $stmt -> bindValue(':growth', ($_POST['growth']) , PDO::PARAM_INT);
            $stmt -> bindValue(':weight', ($_POST['weight']), PDO::PARAM_INT);
            $stmt -> bindValue(':city', ($_POST['city']), PDO::PARAM_STR);
            $stmt -> bindValue(':address', ($_POST['address']), PDO::PARAM_STR);
            $stmt -> bindValue(':nrhouse', ($_POST['nrhouse']), PDO::PARAM_INT);
            $stmt -> bindValue(':postcode',($_POST['postcode']), PDO::PARAM_INT);

            $ilosc = $stmt -> execute(); // 3

             ($ilosc > 1)
            {
                echo 'Dodano: '.$ilosc.' rekordow';
            }
            else
            {
                echo 'Wystapil blad podczas dodawania rekordow!';
            }
        }

    }
    catch(PDOException $e)
    {
        echo 'Wystapil blad biblioteki PDO: ' . $e->getMessage();
    }

?>
edytowany 1x, ostatnio: Csysiu, 2019-02-10 18:57

Pozostało 580 znaków

2019-02-10 19:26
0

($_SERVER['REQUEST_METHOD'] == 'POST') co to - Twoim zdaniem - robi?


Moim zdaniem sprawdza jaką metodą zwracana jest wartość z formularza. - Csysiu 2019-02-10 19:29

Pozostało 580 znaków

2019-02-10 19:42
0

najlepiej zamień to na

if( !empty($_POST))

Pozostało 580 znaków

2019-02-10 19:45
0
itsme napisał(a):

najlepiej zamień to na

if( !empty($_POST))
$stmt -> bindValue(':name', if(!empty($_POST['name'])), PDO::PARAM_STR);

Wg mnie i wg parsera to błąd składni. Już wcześniej tak robiłem :)

Porównaj to co napisałem i co napisałeś. - itsme 2019-02-10 20:14

Pozostało 580 znaków

2019-02-10 20:22
0
Csysiu napisał(a):
itsme napisał(a):

najlepiej zamień to na

if( !empty($_POST))
$stmt -> bindValue(':name', if(!empty($_POST['name'])), PDO::PARAM_STR);

Wg mnie i wg parsera to błąd składni. Już wcześniej tak robiłem :)

Zrobiłem w ten sposób no i działa, ale czy można tak zrobić? :)

<form method="post" action="">
            <p>Imię: <input type="text" name="name"/></p>
            <p>Nazwisko: <input type="text" name="surname"/></p>
            <p>Wiek: <input type="text" name="age"/></p>
            <p>Wzrost: <input type="text" name="growth"/></p>
            <p>Waga: <select name="weight" value="Waga">
            <option value="1">0</option>
            <option value="1">50</option>
            <option value="2">60</option>
            <option value="3">70</option>
            <option value="4">80</option>
            <option value="5">90</option>
            <option value="6">100</option>
            </select></p>
            <p>Miasto: <input type="text" name="city"/></p>
            <p>Adres: <input type="text" name="address"/></p>
            <p>Nr domu: <input type="text" name="nrhouse"/></p>
            <p>kod pocztowy: <input type="text" name="postcode"/></p>
            <p><input type="submit" value="Dodaj"/></p>
            </form>
<?php

    try
    {
        if (!empty($_POST['name']) && isset($_POST['name']) && !empty($_POST['surname']) && isset($_POST['surname']) &&
           !empty($_POST['age']) && isset($_POST['age']) && !empty($_POST['growth']) && isset($_POST['growth']) &&
           !empty($_POST['weight']) && isset($_POST['weight']) && !empty($_POST['city']) && isset($_POST['city']) &&
           !empty($_POST['address']) && isset($_POST['address']) && !empty($_POST['nrhouse']) && isset($_POST['nrhouse']) &&
           !empty($_POST['postcode']) && isset($_POST['postcode']))
        {   
            $pdo = new PDO('mysql:host=192.168.0.150;dbname=shop;port=3306', 'root', 'Administrator2112');
            $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

            $stmt = $pdo -> prepare('INSERT INTO `users` (`name`, `surname`, `age`, `growth`, `weight`, `city`, `address`, `nrhouse`, `postcode`)   VALUES(
                :name,
                :surname,
                :age,
                :growth,
                :weight,
                :city,
                :address,
                :nrhouse,
                :postcode)');   // 1

            $stmt -> bindValue(':name', ($_POST['name']), PDO::PARAM_STR); // 2
            $stmt -> bindValue(':surname', ($_POST['surname']), PDO::PARAM_STR);
            $stmt -> bindValue(':age', ($_POST['age']), PDO::PARAM_INT);
            $stmt -> bindValue(':growth', ($_POST['growth']) , PDO::PARAM_INT);
            $stmt -> bindValue(':weight', ($_POST['weight']), PDO::PARAM_INT);
            $stmt -> bindValue(':city', ($_POST['city']), PDO::PARAM_STR);
            $stmt -> bindValue(':address', ($_POST['address']), PDO::PARAM_STR);
            $stmt -> bindValue(':nrhouse', ($_POST['nrhouse']), PDO::PARAM_INT);
            $stmt -> bindValue(':postcode',($_POST['postcode']), PDO::PARAM_INT);

            $ilosc = $stmt -> execute(); // 3

            if ($ilosc > 0)
            {
                echo 'Dodano: '.$ilosc.' rekordow';
            }
            else
            {
                echo 'Nie dodano żadengo rekordu do bazy!';
            }

        }else{
            echo "Nie wypełniłeś wszystkich pól!";
        }

    }
    catch(PDOException $e)
    {
        echo 'Wystapil blad biblioteki PDO: ' . $e->getMessage();
    }

?>
edytowany 1x, ostatnio: Csysiu, 2019-02-10 20:23

Pozostało 580 znaków

2019-02-10 20:30
0
<p><input type="submit" name="submit" value="Dodaj"/></p>

Dodaj :

if( isset($_POST['submit']) ) {
   ....
}

Powinno wystarczyć.

A nie jest lepiej sprawdzić wszystko co przyszło z postem? - Csysiu 2019-02-10 21:54

Pozostało 580 znaków

2019-02-10 22:59
0

Po co robisz: !empty($_POST['surname']) && isset($_POST['surname'])? Starczy samo !empty($_POST['surname'])

Pozostało 580 znaków

2019-02-11 10:40
0

Można i tak:


<form action="" method=post>
<input type="text" name="jeden" />
<input type="text" name="dwa" />
<input type="text" name="trzy" />
<input type="text" name="cztery" />
<input type="submit" value="ok" name="submit"/>
</form>

<?php

  $ile_pol_formularza = 3;  // liczymy od 0
  unset($_POST['submit']);
    $join = array();
    foreach ($_POST as $key => $value) {
      if(!empty($value)){
       $join[] = $value;
        }
    }

        if(count($join) <= ($ile_pol_formularza)) {
      exit('Wypelnij wszystkie pola formularza!');
      }else {
        print 'wypelniono wszystkie pola';
        }

?>
To sprawdza istnienie dowolnych pól formularza (dlatego musiałeś sam zrobić unset() jednej z wartości), więc jest jeszcze gorsze od isset($_POST['cośtam']) / empty($_POST['cośtam']), które chociaż sprawdzają pola o konkretnych nazwach. - Patryk27 2019-02-11 10:42
No ja nie przecze ze tak ne jest. Przyklad sprawdza wszelkie pola {wartosci tych pól} wyslane postem. - szybka_parowka 2019-02-11 10:44

Pozostało 580 znaków

2019-02-11 10:47
1

A nie jest lepiej sprawdzić wszystko co przyszło z postem?

Tak, najlepiej jest sprawdzać istnienie wszystkiego, czego oczekujemy; przy czym nie z wykorzystaniem funkcji empty, ponieważ ona zwraca true także dla zera (w tym zera będącego wewnątrz stringa: https://3v4l.org/Nj95K), co może nie być oczekiwanym zachowaniem.

W miarę sensownym podejściem byłoby coś takiego:

function checkFields(array $fields, array $expectedKeys): bool {
  foreach ($expectedKeys as $expectedKey) {
    if (strlen($fields[$expectedKey] ?? '') === 0) {
      return false;
    }
  }

  return true;
}

if (checkFields($_POST, ['foo', 'bar', 'zar'])) {
  echo 'Wszystkie pola wypełnione.';
} else {
  echo 'Niektóre z pól nie zostały wypełnione.';
}

Najlepszym rozwiązaniem byłoby niewynajdywanie koła na nowo i wykorzystanie jakiegoś frameworka - Symfony czy Laravel mają wbudowaną obsługę formularzy ;-)


edytowany 5x, ostatnio: Patryk27, 2019-02-13 13:33
Lepiej mb_strlen(). - TomRiddle 2019-02-20 17:03
W przypadku przyrównywania do zera nie robi to różnicy. - Patryk27 2019-02-20 19:58

Pozostało 580 znaków

2019-02-12 21:19
0
Patryk27 napisał(a):
function checkFields(array $fields, array $expectedKeys): bool {
  foreach ($expectedKeys as $expectedKey) {
    if (!isset($fields[$expectedKey]) || strlen($fields[$expectedKey]) < 0) {
      return false;
    }
  }

  return true;
}

if (checkFields($_POST, ['foo', 'bar', 'zar'])) {
  echo 'Wszystkie pola wypełnione.';
} else {
  echo 'Niektóre z pól nie zostały wypełnione.';
}
  1. 3s/</===/
  2. użytkownik może wysłać tablicę
Ad 1: huh? Ad 2: w przypadku formularza u autora żadnych tablic nie dostrzegam. - Patryk27 2019-02-13 07:53
1. strlen($x) < 0 zawsze będzie false 2. nie ufaj danym od użytkownika - Mózg 2019-02-13 13:17
Ad 1: fixed. Ad 2: możesz pokazać jakiś PoC psujący taki sposób sprawdzania formularza? - Patryk27 2019-02-13 13:33

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0