Pusty formularz PHP

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();
	}

?>

0

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

0

najlepiej zamień to na

if( !empty($_POST))
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 :)

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();
	}

?>
0
<p><input type="submit" name="submit" value="Dodaj"/></p>

Dodaj :

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

Powinno wystarczyć.

0

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

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';
		}
	
?>

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 ;-)

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ę

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