PHP Les 5: Gegevens opslaan in een database I
Doelstelling les:
- Veilig verwerken van gegevens via php middels prepared statements
Voorbereiding
- Huiswerk vorige les natuurlijk
- Bestudeer insert queries van het vak Databases
- Bekijk video's van CodeCourse op OnderwijsOnline:
- 17-CodeCourse-POST GET.mp4
- 18-CodeCourse-Forms.mp4
- 19-CodeCourse-Require Include.mp4
Lesprogramma
- Bespreken huiswerk
- Nieuwe pagina met filter
- Uitdaging:
selected
toevoegen aan <option>
- Uitleg over gegevens opslaan in een database
In deze les gaan we aan de slag met een aantal 'recepten' om data op te slaan in een database. We volgen elke keer dezelfde stappen om het makkelijk te maken wat je hier moet doen.
Code richtlijnen
-
input-velden krijgen als
id
enname
de kolomnaam waar het naartoe moet. -
alle input-velden (GET/POST) worden eerst overgezet naar variabelen waarbij de variabele de naam krijgt van de kolom.
-
alle bewerkingen vinden plaats op de variabelen, de GET/POST wordt nergens meer gebruikt dan op één plek om uit te lezen.
-
opbouw van elke pagina is:
-
'overhevelen' van input-inputvariabelen (GET/POST) naar lokale variabelen
-
Controles op de geldigheid van input-variabelen
-
bij fouten in controle, vul een
$melding
en druk die af -
bij geen fouten:
- maak prepared statement waarbij de placeholders de naam
van de kolom krijgen (
:componistid
) - laat db gegevens verwerken
- bij gelukt, wis alle lokale variabelen
- bij niet gelukt, geef melding
- maak prepared statement waarbij de placeholders de naam
van de kolom krijgen (
-
Stap 1: Eenvoudig versturen van gegevens naar een database
We gebruiken een los HTML-document met een formulier die:
- alle waarden kan versturen
- het verzonden formulier uitleest
- de data kan opslaan in de database
- weergeeft of het gelukt is
We gebruiken onderstaande documenten als beginpunt:
Nu maken we in SQL management studio een insert query om componisten
toe te voegen. Als je deze overneemt in PHP moet je er even opletten dat je de '
escaped met: \'
.
INSERT INTO componist (componistId, naam, geboortedatum, schoolId)
VALUES (11, 'Meneer Muzikant', '1992-09-08', 1);
❗️ Let op, componistid wordt automatisch gegenereerd door de database. Dit zelf doen is een security threat.
Alle variabelen vullen vanuit het formulier
We gaan nu eerst alle variabelen invullen door deze
uit te lezen uit het verzonden formulier met behulp van
$_POST
.
// 4 kolommen, dus ook 4 variabelen
$componistId = $_POST['componistId'];
$naam = $_POST['naam'];
$geboortedatum = $_POST['geboortedatum'];
$schoolId = $_POST['schoolId'];
Voeg de include statement voor de database connectie toe
require_once 'db_connectie.php';
Insert query overnemen en waardes vervangen
We nemen de insert query nu over zoals deze in SSMS zou kunnen werken:
// Insert query
$sql = 'INSERT INTO componist (componistId, naam, geboortedatum, schoolId)
VALUES (44, \'Meneer Muzikant\', \'1992-09-08\', 1);';
Maak hier nu eerst een prepared statement van zoals in de vorige les. Vul daarna de data in een array. En voer dan de query uit.
Als je de query uitvoert krijg je terug of de query geslaagd is.
$succes = $query->execute($data_array);
if ($succes) {
$melding = 'Gegevens zijn opgeslagen in de database.';
}
else {
$melding = 'Er ging iets fout bij het opslaan.';
}
Voeg nu een componist toe met het formulier en laat
met select * from componist
zien dat die er inderdaad in zit.
Stap 2: Formulier versturen waar niet alles ingevuld is
De velden geboortedatum
en schoolid
zijn niet verplicht, maar
als deze niet ingevuld zijn, krijg je nu een foutmelding.
Dat kun je zelf zien, of de docent laat het even zien:
Vul alles in, maar niet het schoolid. Nu krijg je een foutmelding.
Null in niet verplichte velden
Als geboortedatum of schoolid niet is ingevuld, dan zou je dus
null
moeten gebruiken.
Bijvoorbeeld:
INSERT INTO componist (componistId, naam, geboortedatum, schoolId)
VALUES (44, 'Meneer Muzikant', NULL, NULL);
Check dus of de variabele leeg is en zet deze dan op null. Bijvoorbeeld:
// Controleer niet verplichte velden
if (empty($geboortedatum)) {
$geboortedatum = null;
}
Los dit nu ook op voor `schoolid en voeg nu een componist toe met het formulier zonder deze (één van) deze velden in te vullen.
En laat zien met SELECT * FROM componist
dat deze ook opgeslagen is.
Stap 3: HTML en PHP samenvoegen
Het form en verwerken daarvan hebben we nu apart in een HTML- en PHP-bestand, dat gaan we samenvoegen.
- plak het
<form >
deel in de HTML van de PHP pagina. - maak het
action
attribuut van het form leeg - voeg controle op klikken toe aan de php
(
if(isset($_POST['opslaan']))
)
Stap 4: Controles op velden (verplichte velden)
Een HTML-form kan met required
velden verplicht maken, maar dat
kun je eenvoudig omzeilen. Dus verplichte velden moeten ook in de
php gecontroleerd worden. Daarnaast kun je extra controles
toevoegen:
// Controleer velden op geldigheid
// componist id (not null, numeric)
if (empty($componistId)) {
$fouten[] = 'componistId is verplicht om in te vullen.';
}
if (!is_numeric($componistId)) {
$fouten[] = 'componistId moet een numerieke waarde zijn.';
}
// Naam (not null, text)
if (empty($naam)) {
$fouten[] = 'naam is verplicht om in te vullen.';
}
if (count($fouten) > 0) {
// Fouten: maak een melding
$melding = '<ul class="error">';
foreach($fouten as $fout)
{
$melding .= '<li>'.$fout.'</li>';
}
$melding .= '</ul>';
} else
{
// ....... opslaan in db
}
Huiswerk
a. Stap 1-4 in les 1: huiswerk maak een php-bestand waarin je nieuwe scholen kunt toevoegen.
b. stap 5-6 (7) in les 2: huiswerk, maak formulier voor scholen volledig (dus veldcontrole, input opschonen etc.)