Ik ben net begonnen voor mijn hobby om PHP te leren en zou graag een enquête maken welke gelinkt is aan een database.
Wanneer ik echter een vraag oningevuld laat krijg ik steeds de melding 'Notice: Undefined index...'.

Ik begrijp dat dit betekent dat de vraag niet ingevuld is, maar dacht dit te laten melden door volgende code:

<?php
if (empty($Email) || empty($Voornaam) || empty($Achternaam) || empty($Geslacht) || empty($Postcode) || empty($A1) || empty($A2) || empty($A3) || empty($A4) || empty($A5) || empty($A6) || empty($A7) || empty($A8) || empty($A9) || empty($B1) || empty($B2) || empty($B3) || empty($B4) || empty($B5) || empty($B6) || empty($B7) || empty($B8) || empty($B9)) {
echo "Gelieve alle vragen in te vullen.";
?>

Het gevolg is nu dat de Notice meldingen nog steeds op de webpagina verschijnen mét daaronder mijn melding "Gelieve alle vragen in te vullen.'

Ik heb hieronder de code van mijn .php bestand geplaatst. Kan iemand me uitleggen wat ik verkeerd doe en hoe ik het beter kan doen? Alvast bedankt!!!

<?php

/* Onderstaande code maakt connectie met de database */

function Connect_DB () {
global $connection;
$connection = mysqli_connect ('localhost', 'root', '', 'DatabaseHobby'); /* 'Servernaam', 'gebruikersnaam', 'wachtwoord', 'databasenaam' */
if (!$connection) {
die ('connection failed' . mysqli_error());
}
}

/* Haalt alle gegevens uit het formulier en stockeert ze in database */

if (isset($_POST ['Submit'])){

$Email = $_POST['Email'];
$Voornaam = $_POST['Voornaam'];
$Achternaam = $_POST['Achternaam'];
$Geslacht = $_POST['Geslacht'];
$Postcode = $_POST['Postcode'];
$A1 = $_POST['A1'];
$A2 = $_POST['A2'];
$A3 = $_POST['A3'];
$A4 = $_POST['A4'];
$A5 = $_POST['A5'];
$A6 = $_POST['A6'];
$A7 = $_POST['A7'];
$A8 = $_POST['A8'];
$A9 = $_POST['A9'];
$B1 = $_POST['B1'];
$B2 = $_POST['B2'];
$B3 = $_POST['B3'];
$B4 = $_POST['B4'];
$B5 = $_POST['B5'];
$B6 = $_POST['B6'];
$B7 = $_POST['B7'];
$B8 = $_POST['B8'];
$B9 = $_POST['B9'];

if (empty($Email) || empty($Voornaam) || empty($Achternaam) || empty($Geslacht) || empty($Postcode) || empty($A1) || empty($A2) || empty($A3) || empty($A4) || empty($A5) || empty($A6) || empty($A7) || empty($A8) || empty($A9) || empty($B1) || empty($B2) || empty($B3) || empty($B4) || empty($B5) || empty($B6) || empty($B7) || empty($B8) || empty($B9)) {
echo "Gelieve alle vragen in te vullen.";
}

Connect_DB ();

$query = "INSERT INTO DatabaseTabel (Email, Voornaam, Achternaam, Geslacht, Postcode, A1, A2, A3, A4, A5, A6, A7, A8, A9, B1, B2, B3, B4, B5, B6, B7, B8, B9) "; /* Naam tabel (kolommen) */
$query .= "VALUES ('$Email','$Voornaam','$Achternaam','$Geslacht','$Postcode','$A1','$A2','$A3','$A4','$A5','$A6','$A7','$A8','$A9','$B1','$B2','$B3','$B4','$B5','$B6','$B7','$B8','$B9')"; /*ingevulde waarde */

$result = mysqli_query ($connection, $query);
if (!$result) {
die ('query failed' . mysqli_error());
}

}

?>
"maar krijg bovenaan de melding:"

Dat is de echo $query op regel 56. Die kan je dan weghalen.
- Ariën - op 08/10/2019 17:45:25

<?php
if (isset($_POST['Email'], $_POST['Voornaam'], $_POST['Achternaam'], $_POST['Geslacht'], $_POST['Postcode'], $_POST['A1'], $_POST['A2'], $_POST['A3'], $_POST['A4'], $_POST['A5'], $_POST['A6'], $_POST['A7'], $_POST['A8'], $_POST['A9'])) {
// Alle velden bestaan, start de validatie

// Simpele validatie
if(trim($_POST['Voornaam'])=="") {
echo "Voornaam is niet ingevuld<br>";
} elseif(trim($_POST['Email'])=="") {
echo "Email is niet ingevuld<br>";
} else {
// Er wordt aan alle validatie-controles voldaan. Voer hier je query uit, en toon een melding dat het gelukt is.
}

}
?>

Of nog beter: Sla ze op in een array, en lees de array uit en kijk of de error-array niet gevuld is (count($array)==0) en voer alles uit. Dan kan je in één klap alle foutmeldingen op een rij tonen, en eventueel in je formulier verwerken, door velden te laten oplichten.


Ik heb dit test bestand gemaakt als Test.php maar dit zorgt voor geen enkele reactie?

<?php
if (isset($_POST['Email'], $_POST['Voornaam'], $_POST['Achternaam'], $_POST['Geslacht'], $_POST['Postcode'], $_POST['A1'], $_POST['A2'], $_POST['A3'], $_POST['A4'], $_POST['A5'], $_POST['A6'], $_POST['A7'], $_POST['A8'], $_POST['A9'])) {
// Alle velden bestaan, start de validatie

// Simpele validatie
if(trim($_POST['Email'])=="") {
echo "Email is niet ingevuld<br>";

} elseif(trim($_POST['Voornaam'])=="") {
echo "Voornaam is niet ingevuld<br>";

} elseif(trim($_POST['Achternaam'])=="") {
echo "Achternaam is niet ingevuld<br>";

} elseif(trim($_POST['Geslacht'])=="") {
echo "Geslacht is niet ingevuld<br>";

} elseif(trim($_POST['Postcode'])=="") {
echo "Postcode is niet ingevuld<br>";

} elseif(trim($_POST['A1'])=="") {
echo "Vraag 1 is niet ingevuld<br>";

} elseif(trim($_POST['A2'])=="") {
echo "Vraag 2 is niet ingevuld<br>";

} elseif(trim($_POST['A3'])=="") {
echo "Vraag 3 is niet ingevuld<br>";

} elseif(trim($_POST['A4'])=="") {
echo "Vraag 4 is niet ingevuld<br>";

} elseif(trim($_POST['A5'])=="") {
echo "Vraag 5 is niet ingevuld<br>";

} elseif(trim($_POST['A6'])=="") {
echo "Vraag 6 is niet ingevuld<br>";

} elseif(trim($_POST['A7'])=="") {
echo "Vraag 7 is niet ingevuld<br>";

} elseif(trim($_POST['A8'])=="") {
echo "Vraag 8 is niet ingevuld<br>";

} else {
// Er wordt aan alle validatie-controles voldaan. Voer hier je query uit, en toon een melding dat het gelukt is.
Echo "alles is ingevuld";
}

}
?>



[size=xsmall]Toevoeging op 08/10/2019 18:21:18:[/size]

Michael - op 08/10/2019 18:09:18

"maar krijg bovenaan de melding:"

Dat is de echo $query op regel 56. Die kan je dan weghalen.


Je suggestie heeft geholpen. Het script werkt nu! :)

[size=xsmall]Toevoeging op 08/10/2019 18:26:02:[/size]

Onderstaand is de code die werkt :)

Iedereen heel erg bedankt voor de hulp! Zijn er verder nog tips of opmerkingen of verbeteringen in het algemeen of over dit script? (Kwestie voor mezelf om bij te leren)

<?php

include 'Connection_db.php';

if ($_SERVER['REQUEST_METHOD'] == "POST") {

//echo'<pre>';print_r($_POST);echo'</pre>';

if (!isset($_POST['Email'], $_POST['Voornaam'], $_POST['Achternaam'], $_POST['Geslacht'], $_POST['Postcode'], $_POST['A1'], $_POST['A2'], $_POST['A3'], $_POST['A4'], $_POST['A5'], $_POST['A6'], $_POST['A7'], $_POST['A8'], $_POST['A9'])) {
echo "Gelieve alle vragen te beantwoorden.";
} else {

$connection = mysqli_connect ('localhost', 'root', '', 'wolf'); /* 'Servernaam', 'gebruikersnaam', 'wachtwoord', 'databasenaam' */
if (!$connection) {
die ('connection failed');}

$query = "INSERT
INTO
klantentevredenheid_2019
(
Email,
Voornaam,
Achternaam,
Geslacht,
Postcode,
A1,
A2,
A3,
A4,
A5,
A6,
A7,
A8,
A9
)
VALUES
(
'".mysqli_real_escape_string($connection, $_POST['Email'])."',
'".mysqli_real_escape_string($connection, $_POST['Voornaam'])."',
'".mysqli_real_escape_string($connection, $_POST['Achternaam'])."',
'".mysqli_real_escape_string($connection, $_POST['Geslacht'])."',
'".mysqli_real_escape_string($connection, $_POST['Postcode'])."',
'".mysqli_real_escape_string($connection, $_POST['A1'])."',
'".mysqli_real_escape_string($connection, $_POST['A2'])."',
'".mysqli_real_escape_string($connection, $_POST['A3'])."',
'".mysqli_real_escape_string($connection, $_POST['A4'])."',
'".mysqli_real_escape_string($connection, $_POST['A5'])."',
'".mysqli_real_escape_string($connection, $_POST['A6'])."',
'".mysqli_real_escape_string($connection, $_POST['A7'])."',
'".mysqli_real_escape_string($connection, $_POST['A8'])."',
'".mysqli_real_escape_string($connection, $_POST['A9'])."'
)"; /*ingevulde waarde */

$result = mysqli_query ($connection, $query);
if (!$result) {
die ('query failed');
}


}
}

?>
"Zijn er verder nog tips of opmerkingen of verbeteringen in het algemeen of over dit script? (Kwestie voor mezelf om bij te leren)"

Je vraagt erom :-)
Ik zou de $connection sowieso bovenaan je script zetten. Nu kun je het formulier invullen, maar je bent niet eens zeker of de connectie lukt.
"die" is geen mooie oplossing. Hiermee "kill" je alles gelijk, terwijl je pagina prima kan functioneren zonder verbinding en netjes een foutmelding kan laten zien.
Nu geef je inderdaad niet aan welke vragen er niet zijn ingevuld dus dat zou mooier kunnen.
Type je alle input velden handmatig? Want zoals al was aangegeven kun je hier prima een array voor maken en steeds herhalen. Zeker als de antwoorden "tevreden, ontevreden" steeds het zelfde zijn.
Goede validatie zoals ik al had aangegeven. ;-)
Als iemand wat vergeten is, moet diegene zich nu gaan blindstaren op welke hij/zij vergeten is in te vullen.
Michael:

Ik typ idd alle input velden handmatig, bv.

            <label class="statement"><br/><!-- A1 --><br/>Vraag 1</label>
                <ul class='likert'>
                  <li>
                    <input type="checkbox" name="A1" value="Absoluut niet tevreden">
                    <label>Absoluut niet tevreden</label>
                  </li>
                  <li>
                    <input type="checkbox" name="A1" value="Niet tevreden">
                    <label>Niet tevreden</label>
                  </li>
                  <li>
                    <input type="checkbox" name="A1" value="Neutraal">
                    <label>Neutraal</label>
                  </li>
                  <li>
                    <input type="checkbox" name="A1" value="Tevreden">
                    <label>Tevreden</label>
                  </li>
                  <li>
                    <input type="checkbox" name="A1" value="Zeer tevreden">
                    <label>Zeer tevreden</label>
                  </li>
                </ul>

Hoe zou ik dat dan moeten aanpakken met een array?

Ariën:

Ik vermoed dat dit door de if-elsif-else constructie moet gebeuren? Zet ik die na de if (isset()) functie en voor de $query?

<?php
// Simpele validatie
if(trim($_POST['Email'])=="") {
echo "Email is niet ingevuld<br>";

} elseif(trim($_POST['Voornaam'])=="") {
echo "Voornaam is niet ingevuld<br>";

} elseif(trim($_POST['Achternaam'])=="") {
echo "Achternaam is niet ingevuld<br>";

} elseif(trim($_POST['Geslacht'])=="") {
echo "Geslacht is niet ingevuld<br>";

} elseif(trim($_POST['Postcode'])=="") {
echo "Postcode is niet ingevuld<br>";

} elseif(trim($_POST['A1'])=="") {
echo "Vraag 1 is niet ingevuld<br>";

} elseif(trim($_POST['A2'])=="") {
echo "Vraag 2 is niet ingevuld<br>";

} elseif(trim($_POST['A3'])=="") {
echo "Vraag 3 is niet ingevuld<br>";

} elseif(trim($_POST['A4'])=="") {
echo "Vraag 4 is niet ingevuld<br>";

} elseif(trim($_POST['A5'])=="") {
echo "Vraag 5 is niet ingevuld<br>";

} elseif(trim($_POST['A6'])=="") {
echo "Vraag 6 is niet ingevuld<br>";

} elseif(trim($_POST['A7'])=="") {
echo "Vraag 7 is niet ingevuld<br>";

} elseif(trim($_POST['A8'])=="") {
echo "Vraag 8 is niet ingevuld<br>";

} else {
// Er wordt aan alle validatie-controles voldaan. Voer hier je query uit, en toon een melding dat het gelukt is.
Echo "alles is ingevuld";
}
?>
"Hoe zou ik dat dan moeten aanpakken met een array?"

Bijvoorbeeld:
<?php
$enquete_array = array(
'vragen'=>array(
'A1'=>'Hoe tevreden bent u over de muziekkeuze van de dirigent?',
'A2'=>'Hoe tevreden bent u de duurtijd van de pauze?',
),
'antwoorden'=>array(
'Absoluut niet tevreden',
'Niet tevreden',
'Neutraal',
'Tevreden',
'Zeer tevreden',
),
);

foreach($enquete_array['vragen'] as $id=>$vraag) {
echo '<label class="statement"><br/><!-- '.$id.' --><br/>'.$vraag.'</label>';
foreach($enquete_array['antwoorden'] as $index=>$antwoord) {
echo '
<ul class="likert">
<li>
<input type="radio" id="'.$id.$index.'" name="'.$id.'" value="'.$antwoord.'">
<label for="'.$id.$index.'">'.$antwoord.'</label>
</li>
</ul>
';
}
}
?>

Dit geeft dan de zelfde HTML. Alleen heb ik de 'for' en 'id' toegevoegd zodat de 'label' ook werkt ;-)

<label class="statement"><br/><!-- A1 --><br/>Hoe tevreden bent u over de muziekkeuze van de dirigent?</label>
<ul class="likert">
	<li>
		<input type="radio" id="A10" name="A1" value="Absoluut niet tevreden">
		<label for="A10">Absoluut niet tevreden</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A11" name="A1" value="Niet tevreden">
		<label for="A11">Niet tevreden</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A12" name="A1" value="Neutraal">
		<label for="A12">Neutraal</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A13" name="A1" value="Tevreden">
		<label for="A13">Tevreden</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A14" name="A1" value="Zeer tevreden">
		<label for="A14">Zeer tevreden</label>
	</li>
</ul>
<label class="statement"><br/><!-- A2 --><br/>Hoe tevreden bent u de duurtijd van de pauze?</label>
<ul class="likert">
	<li>
		<input type="radio" id="A20" name="A2" value="Absoluut niet tevreden">
		<label for="A20">Absoluut niet tevreden</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A21" name="A2" value="Niet tevreden">
		<label for="A21">Niet tevreden</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A22" name="A2" value="Neutraal">
		<label for="A22">Neutraal</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A23" name="A2" value="Tevreden">
		<label for="A23">Tevreden</label>
	</li>
</ul>

<ul class="likert">
	<li>
		<input type="radio" id="A24" name="A2" value="Zeer tevreden">
		<label for="A24">Zeer tevreden</label>
	</li>
</ul>
Op deze manier kan je weer de errors in een array plaatsen :-)

<?php
$errors = array(); // maak de array aan

// Simpele validatie
if(trim($_POST['Email'])=="") {
$errors[] = "Email is niet ingevuld";
}

if(trim($_POST['Voornaam'])=="") {
$errors[] = "Voornaam is niet ingevuld";
}

if(trim($_POST['Achternaam'])=="") {
$errors[]= "Achternaam is niet ingevuld";

if(count($errors)== 0) {
// er zijn geen errors! Doe je ding!
} else {
// Tijdelijk voor debugging: print_r($errors);
// er zijn wel errors! Doorloop foreach over $errors en toon de errors
// Zie: www.php.net/foreach
}
?>
Bedankt voor de nuttige feedback!

En wat als ik wil dat sommige vragen niet persé ingevuld moeten worden? Bv. Naam en voornaam wel, maar vraag A1 hoeft niet ingevuld te worden als men niet wil.

Als ik die variabelen uit onderstaande code haal, krijg ik gewoon terug de Notice: Undefined index error te zien.
<?php
if (!isset($_POST['Email'], $_POST['Voornaam'], $_POST['Achternaam'], $_POST['Geslacht'], $_POST['Postcode'], $_POST['A1'], $_POST['A2'], $_POST['A3'], $_POST['A4'], $_POST['A5'], $_POST['A6'], $_POST['A7'], $_POST['A8'], $_POST['A9']))
?>
Dat is ook geen onderdeel van de validatie, maar de controle of een veld in je formulier bestaat (als die tenminste een name-attribute heeft)
Ok, maar nu heb ik een formulier dat niet wil verzenden als er één van alle vragen niet ingevuld is. Hoe kan ik ervoor zorgen dat de antwoorden toch doorgestuurd worden naar de database als er sommige vragen niet ingevuld zijn?

Door toevoeging van required in het input field in de html tags kan ik ervoor zorgen dat de deelnemer weet wanneer en welke vraag niet ingevuld is. Maar stel dat ik enkel zeker wil dat het emailadres, voornaam, achternaam, geslacht, en postcode ingevuld zijn voordat het formulier verzonden wordt naar de database ongeacht of de vragen A1 tem A9 ingevuld zijn of niet. Hoe kan ik dit voor elkaar krijgen?

<?php

include 'Connection_db.php';

if ($_SERVER['REQUEST_METHOD'] == "POST") {

//echo'<pre>';print_r($_POST);echo'</pre>';

$connection = mysqli_connect ('localhost', 'root', '', 'wolf');
if (!$connection) {
die ('connection failed');}

if (!isset($_POST['Email'], $_POST['Voornaam'], $_POST['Achternaam'], $_POST['Geslacht'], $_POST['Postcode'], $_POST['A1'], $_POST['A2'], $_POST['A3'], $_POST['A4'], $_POST['A5'], $_POST['A6'], $_POST['A7'], $_POST['A8'], $_POST['A9'])) {
echo "Gelieve alle vragen te beantwoorden.";
} else {

$query = "INSERT INTO vragenlijst (Email, Voornaam, Achternaam, Geslacht, Postcode, A1, A2, A3, A4, A5, A6, A7, A8, A9 )
VALUES
(
'".mysqli_real_escape_string($connection, $_POST['Email'])."',
'".mysqli_real_escape_string($connection, $_POST['Voornaam'])."',
'".mysqli_real_escape_string($connection, $_POST['Achternaam'])."',
'".mysqli_real_escape_string($connection, $_POST['Geslacht'])."',
'".mysqli_real_escape_string($connection, $_POST['Postcode'])."',
'".mysqli_real_escape_string($connection, $_POST['A1'])."',
'".mysqli_real_escape_string($connection, $_POST['A2'])."',
'".mysqli_real_escape_string($connection, $_POST['A3'])."',
'".mysqli_real_escape_string($connection, $_POST['A4'])."',
'".mysqli_real_escape_string($connection, $_POST['A5'])."',
'".mysqli_real_escape_string($connection, $_POST['A6'])."',
'".mysqli_real_escape_string($connection, $_POST['A7'])."',
'".mysqli_real_escape_string($connection, $_POST['A8'])."',
'".mysqli_real_escape_string($connection, $_POST['A9'])."'
)"; /*ingevulde waarde */

$result = mysqli_query ($connection, $query);
if (!$result) {
die ('query failed');
}


}
}

?>

Door toevoeging van deze code hoopte ik de niet ingevulde variabelen 'op te vullen' maar ook dit werkt niet om de data door te sturen naar de database:

<?php
if (empty($_POST['A1'])) {
$A1 = "";
}
?>

Reageren