Hallo allemaal,

Momenteel heb ik een form waarmee je info kunt toevoegen aan de DB.
Tot zover werkt dit zonder problemen.
Nu wil ik graag een stap verder gaan en dat is form validatie toepassen.

Via de website http://www.tutorialspoint.com/php/php_validation_example.htm heb ik een voorbeeld gevonden waarmee form validatie kan toegepast worden.
Het form validatie werkt als volgt:

Op de insert.php pagina voer ik wat gegevens in. Wanneer de input van de gebruiker door de form validatie komt, dan vang ik alle input van de gebruiker op de pagina insert_proces.php. Via dit pagina heb ik een insert sql commando, die de input in de DB opslaat.


En wanneer ik een validatie toepas, dan krijg ik allemaal Notice: Undefined variable foutmeldingen op de insert_proces.php pagina. Vervolgens wordt er een leeg record toegevoegd aan de DB.

foutmelding:

Notice: Undefined variable: first in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 26

Notice: Undefined variable: lastname in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 27

Notice: Undefined variable: department in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 28

Notice: Undefined variable: position in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 29

Notice: Undefined variable: salary in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 30

Notice: Undefined variable: startdate in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 31

Notice: Undefined variable: first in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 35
successfully loaded to the database
Go back to main page


code van insert.php pagina:

<?php

function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
// define variables and set to empty values
$firstnameErr = $lastnameErr = $positionErr = $salaryErr = $startdateErr ="";
$firstnamename = $lastname = $position = $salary = $startdate = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["firstname"])) {
$firstnameErr = "Name is required";
}else {
$firstname = test_input($_POST["firstname"]);
}

if (empty($_POST["lastname"])) {
$lastnameErr = "Lastname is required";
}else {
$lastname = test_input($_POST["email"]);

}

if (empty($_POST["position"])) {
$positionErr = "Position must be filled in";
}
else {
$position = test_input($_POST["position"]);
}

if (empty($_POST["salary"])) {
$salaryErr = "salary must be filled in";
}else {
$salary = test_input($_POST["salary"]);
}

if (empty($_POST["startdate"])) {
$startdateErr = "startdate is required";
}else {
$startdate = test_input($_POST["startdate"]);
}
if(count ($firstnameErr, $lastnameErr, $positionErr, $salaryErr, $startdateErr) == 0) {
header ("Location: insert_process.php");
exit();
}
}


?>

code van insert_proces.php pagina

<?php
require_once("inc/db-config.php");

if(isset($_POST['firstname'])) {
$first = $_POST['firstname'];
}

if(isset($_POST['lastname'])) {
$lastname = $_POST['lastname'];
}
if(isset($_POST['department'])) {
$department = $_POST['department'];
}
if(isset($_POST['position'])) {
$position = $_POST['position'];
}
if(isset($_POST['salary'])) {
$salary = $_POST['salary'];
}
if(isset($_POST['startdate'])) {
$startdate = $_POST['startdate'];
}

$sql = "INSERT INTO employees VALUES (
'',
'" . $first . "',
'" . $lastname . "',
'" . $department . "',
'" . $position . "',
'" . $salary . "',
'" . $startdate . "',
NOW()
)";
mysql_query($sql);
echo $first . " successfully loaded to the database";
echo "<br /> Go back to <a href='inventory.php'>main page</a>";
mysql_close($connection);
?>

Wat is jullie feedback hierop?

Alvast bedankt!

Helaas krijg ik allemaal
Blijkbaar is er niks gepost naar insert_proces.php.
Controleer hierop met deze structuur:

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
// er is ge-POST, voer hier de actie uit.
}
?>
Tevens zijn al die issets() niet nodig. Je kan prima je $_POST['...'] variabelen gebruiken in je query. Let er wel op dat je deze met mysql(i)_real_escape_string() / $mysqli->real_escape_string beveiligt tegen SQL-injection.

En foutafhandeling op je query is ook iets wat je niet moet vergeten.

Verder is gebruik van de mysql-functies afgeraden, en raad ik iedereen MySQLi of PDO aan.
- Ariën - op 22/06/2016 23:14:26

Blijkbaar is er niks gepost naar insert_proces.php.
Controleer hierop met deze structuur:

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
// er is ge-POST, voer hier de actie uit.
}
?>
Tevens zijn al die issets() niet nodig. Je kan prima je $_POST['...'] variabelen gebruiken in je query. Let er wel op dat je deze met mysql(i)_real_escape_string() / $mysqli->real_escape_string beveiligt tegen SQL-injection.

En foutafhandeling op je query is ook iets wat je niet moet vergeten.

Verder is gebruik van de mysql-functies afgeraden, en raad ik iedereen MySQLi of PDO aan.


Hoi Ariën,

Bedankt voor je reactie!
Ik heb je verbetering aangebracht, helaas werkt het nog steeds niet.
Ik dacht er zelf aan om :
if(count ($firstnameErr, $lastnameErr, $positionErr, $salaryErr, $startdateErr) == 0) {
header ("Location: insert_process.php");
exit();
}
te verplaatsen na de laatste } van(if ($_SERVER['REQUEST_METHOD'] == "POST") of heeft dit niets mee te maken?
Ook zit alle validatie tussen de { van if ($_SERVER['request_method'] == "post"), en in dreamweaver krijg ik ook geen syntax's foutmeldingen...
Verder heb je gelijk in over al de beveiliging van queries, maar zover ben ik nog niet helaas...
count() ondersteunt geen oneindig aantal parameters voor diverse velden.

Als je wilt bijhouden welke velden niet zijn ingevuld, dan kan je dit gebruiken":

<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
$errors = array();
if(trim($_POST['firstname'])=="") {
$errors[] = "Firstname is not filled in";
}

if(trim($_POST['lastname'])=="") {
$errors[] = "Lastname is not filled in";
}

if(trim($_POST['department'])=="") {
$errors[] = "Department is not filled in";
}

if(count($errors)==0) {
// er zijn geen error gevonden, alles voldoet aan de validatie, en je kan de boel in de database plaatsen
} else {
// er zijn errors gevonden. Deze staan in $errors, en kan je met foreach() doorlopen.
}

}
?>
Hallo Ariën,
Bedankt voor je feedback.

Het insert pagina heb ik aangepast naar je feedback en ziet als volgt uit:


<?php

function test_input($data) {
            $data = trim($data);
            $data = stripslashes($data);
            $data = htmlspecialchars($data);
            return $data;
         }
         
         
         if ($_SERVER['REQUEST_METHOD'] == "POST") {
					  
					  $errors = array();
					  if(trim($_POST['firstname'])=="") {
					  $errors[] = "Firstname should be filled in";										
																		  
					}
					  if(count($errors)==0) {
						header("Location: insert_process.php");
						exit; 
					 } else {
							   
					foreach($errors as $foutmelding) {
					echo $foutmelding; }
						   
						   }
				}
         
         
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<style>
.error {
	color:#FF0000;
	
}
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Inserting Data into Database</title>
</head>
<body>
<p><span class = "error">* required field.</span></p>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" >
<fieldset>
<legend>Inserting data into database</legend>
<p><label for="firstname">Firstname:</label><br /><input type="text" name="firstname" id="firstname" placeholder="Your firstname..." value="<?php if(isset($_POST['firstname'])) echo $_POST['firstname']; ?>"/>
<span class = "error">* <?php echo $foutmelding; ?></span>
</p>

En zodra ik naar dit pagina ga, dan verschijnt de volgende foutmelding:
Notice: Undefined variable: foutmelding in C:\xampp\htdocs\employees_CRUD\insert.php on line 49

Deze foutmelding vind ik vreemd, want eerder heb ik $foutmelding veriable gedefineerd...
En voor mijn gevoel lijkt het of de validatie code helemaal niet controleert of iemand op submit knop heeft gedrukt of niet...
En wanneer ik nu een naam invul in het vakje firstname, dan word ik doorverwezen, zoals het hoort, naar insert_process.php met een foutmelding als gevolg en een lege record in db.

De foutmelding op insert_process.php is hetzelfde als voorheen.

Graag je/jullie feedback
tnx!

$foutmelding bestaat alleen binnen je foreach. Dus je kan je foreach beter tussen je HTML-code plaatsen.
Update 1
Zodra ik naar insert.php pagina ga, dan verschijnt automatisch deze:
Foutmelding: Notice: Undefined variable: foutmelding in C:\xampp\htdocs\employees_CRUD\insert.php on line 49

Deze foutmelding heb ik nu opgelost door :
<?php echo $foutmelding; ?>
te veranderen in
<?php if(isset($errors['firstname'])) echo $errors['firstname']; ?>


Helaas krijg ik nog steeds foutmelding op insert_process.php pagina.
Deze foutmeldingen zijn:
Notice: Undefined variable: first in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 26

Notice: Undefined variable: lastname in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 27

Notice: Undefined variable: department in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 28

Notice: Undefined variable: position in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 29

Notice: Undefined variable: salary in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 30

Notice: Undefined variable: startdate in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 31

Notice: Undefined variable: first in C:\xampp\htdocs\employees_CRUD\insert_process.php on line 35
successfully loaded to the database
Go back to main page


Insert_process.php ziet als volgt uit:

<?php
require_once("inc/db-config.php");

if(isset($_POST['firstname'])) {
	$first = $_POST['firstname'];	
}

if(isset($_POST['lastname'])) {
	$lastname = $_POST['lastname'];	
}
if(isset($_POST['department'])) {
	$department = $_POST['department'];	
}
if(isset($_POST['position'])) {
	$position = $_POST['position'];	
}
if(isset($_POST['salary'])) {
	$salary = $_POST['salary'];	
}
if(isset($_POST['startdate'])) {
	$startdate = $_POST['startdate'];	
}

$sql = "INSERT INTO employees VALUES (
    '',
    '" . $first . "',
    '" . $lastname . "',
    '" . $department . "',
    '" . $position . "',
    '" . $salary . "',
    '" . $startdate . "',
    NOW()
)"; 									
mysql_query($sql);
echo $first . " successfully loaded to the database";
echo "<br /> Go back to <a href='inventory.php'>main page</a>";
mysql_close($connection);
?>

Iemand een idee?
Een aantal dingen lopen nog niet helemaal lekker.

Als eerste snap ik de behoefte niet om die formulieren te verspreiden over twee verschillende .php bestanden. Het maakt het allemaal zo ingewikkeld. Hou het lekker op één pagina met de volgende structuur:


<?php
// deze functie kijkt of er een $_POST variabele bestaat met de opgegeven naam. Zo niet dan wordt een standaard waarde teruggegeven.
function getPostVar($name, $default = '') {
	if(isset($_POST[$name]))
		return trim($_POST[$name]);

	return $default;
}

function validate() {
	// valideer de input en geef een array met foutmeldingen terug. Is de array leeg dan is alles okiedokie
	$errors = array();

	// i hate empty() because empty('0') returns true :-( so don't use it!
	if(strlen(trim($_POST['firstname'])) < 2) {
		$errors['firstname'] = 'Vul uw voornaam in';
	}

	// hebben we enkel karakters?
	if(!ctype_alpha(trim($_POST['firstname']))) {
		$errors['firstname'] = 'Voornaam mag enkel alfabetische letters bevatten';
	}

	// position moet een positief getal zien
	if(intval($_POST['position']) < 1) {
		$errors['position'] = 'Geef een positief getal op';
	}

	return $errors;
}


// initialisatie
$errors = array(); // een lege array voor de foutmeldingen
$firstname = getPostVar('firstname'); // zo de variabele $firstname bestaat nu ALTIJD en dat scheelt undefined variabele warnings 
$position = getPostVar('position', '1'); // Geef $position standaard de waarde '1'.


// IS DEZE PAGINA AANGEROEPEN IN DE POST METHODE? START DAN MET DE VERWERKING VAN HET FORMULIER
if($_SERVER['REQUEST_METHOD'] == 'POST') {
	// valideer het formulier
	$errors = validate();
	
	// als er geen errors zijn dan de gegevens opslaan in de database
	if(!count($errors)) {
		// HIER ALLES WAT JE MOET DOEN ZOALS OPSLAAN IN DE DATABASE OF HET VERZENDEN VAN EEN EMAIL
		mail('[email protected]', 'gegevens aangepast', 'bla bla');
		
		// stuur de gebruiker door naar een bevestigings- of bedank pagina. 
		// Doe altijd een redirect zodat $_SERVER['REQUEST_METHOD'] geen 'POST' blijft!
		header('Location: bedankt.php');
		exit; // redirect en kap dit script af.
	}
}
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Formulier voorbeeld</title>
</head>
<body>
    <form action method="post">
		<?php if(isset($errors['firstname'])) echo $errors['firstname']; ?>
        <input type="text" name="firstname" value="<?php echo $firstname; ?>">
        
        <?php if(isset($errors['position'])) echo $errors['position']; ?>
        <input type="number" name="position" value="<?php echo $position; ?>">
        
        <button>Opslaan</button>
        
    </form>
</body>
</html>


Ten tweede: Hou op met empty()! Een voornaam bijvoorbeeld moet meer dan één karakter bevatten en geen cijfers bevatten. gebruik functies als strlen() en ctype_alpha()
En verder werkt de code-tag hier met blokhaken, i.p.v. vissenhaken. Dus: [code] en [/code]
Je stuurt vanaf insert.php door met een location naar insert_process.php
Daarbij gaan, vermoed ik, de $_POST gegevens verloren.
Je controleert wel met isset of $_POST waarden bestaan en maakt nieuwe variabelen aan (waarom eigenlijk?), maar je laat het script doorlopen en dus proberen om de query uit te voeren.

Ik zie mysql_query en mysql_close staan.
Je weet dat dat verouderd is?! Stap over op mysqli (of OOP).
Hallo Obelix en Idefix,

Ik vermoed ook dat data verloren gaat na de form validatie, want zonder validatie werkt de form prima.
Jah ik weet dat mysql_query verouderd is, maar dat geeft nu niet. Wanneer de test applicatie werkt, dan wil ik pas overstappen.

@Frank Nietbelangrijk, Je hebt gelijk dat het praktisch is wanneer het formulier, validatie en het inserten van data in DB gaat. Ik vraag me af of deze structuur mijn probleem gaat oplossen.

Ondertussen zoek ik even verder op en hopelijk zal ik hier snel een update plaatsen.

Toevoeging op 25/06/2016 23:33:45:

Update 2

Undefined variable: en Undefined index: foutmeldingen heb ik nu opgelost door de veriable's vooraf te declareren op insert_process.php


<?php
require_once("inc/db-config.php");
$first ="";
$lastname ="";
$department = "";
$position = "";
$salary = "";
$startdate ="";



if (isset($_POST['firstname'])) {
$first = $_POST['firstname']; }
if (isset($_POST['lastname'])) {
$lastname = $_POST['lastname']; }

if (isset ($_POST['department'])) {
	$department = $_POST['department']; }


if(isset($_POST['position'])) {
	$position = $_POST['position']; }

if (isset($_POST['salary'])) {
$salary = $_POST['salary']; }

if (isset($_POST['startdate'])) {
$startdate = $_POST['startdate']; }

$sql = "INSERT INTO employees VALUES (
    '',
    '" . $first . "',
    '" . $lastname . "',
    '" . $department . "',
    '" . $position . "',
    '" . $salary . "',
    '" . $startdate . "',
    NOW()
)"; 									
mysql_query($sql);
echo $first . " successfully loaded to the database";
echo "<br /> Go back to <a href='inventory.php'>main page</a>";
mysql_close($connection);
?>

Ik krijg dus nu geen foutmeldingen meer, maar er wordt ook geen data opgeslagen in DB...

Iemand nog een idee...

Reageren