## Aan de slag 48

We gaan een pagina maken waar je film gegevens kan aanpassen. We werken hierbij met één php pagina met twee formulieren. Ons bestand gaat update_film.php heten.

Om een film aan te passen moeten een aantal stappen worden genomen. Je moet eerst een film selecteren die je wilt aanpassen. Daarna moet je de huidige gegevens van de film tonen. En als laatste moet je de gegevens in de database aanpassen.

In je PHP bestand is de volgorde van deze 3 stappen echter anders

- Gegevens aanpassen (indien verstuurd)
- Selectbox om de film te selecteren
- Huidige gegevens aanpassen met een formulier (als er een filmnr is verstuurd)

Om een selectbox te maken moet je een query doen op de film database die alle films ophaalt.
Daarna moeten alle films in een option veld binnen je selectbox komen te staan

<p>Selecteer een film om te wijzigen</p>
<form method="post">
<select name="filmnr">
<option value="1">Film 1</option>
<option value="2">Film 2</option>
</select>
</form>

Bovenstaande code maakt een selectbox. We geven als 'name' de primaire sleutel van de tabel mee, in dit geval filmnr. De option velden zijn nu hard gecodeerd. Deze moeten natuurlijk afkomstig zijn uit de database. Zodat als er een nieuwe film wordt toegevoegd deze ook meteen te selecteren is. Voeg boven aan de pagina include "connect_film.php"; toe om verbinding te maken met de database.

<p>Selecteer een film om te wijzigen</p>
<form method="post">
<select name="filmnr">
<?php
$result = mysqli_query($link,"SELECT * FROM films ORDER BY titel");
while($row = mysqli_fetch_assoc($result)){
echo "<option value=\"{$row['filmnr']}\">{$row['titel']}</option>";
}
?>
</select>
</form>

In bovenstaande code worden eerst alle films opgehaald. Daarna worden alle rijen doorlopen en voor elke rij wordt een echo gedaan die het <option> veld op het scherm schrijft.
Als je script error maakt binnen een selectbox dan komen de foutmeldingen vaak niet op je scherm. Je kan dan de fout wel opsproren om de bron van de HTML pagina op te vragen (gebruik Chrome met rechtermuis)

We hebben nu een selectbox met alle films erin voeg een button toe ' Selecteer' aan het formulier

<input type="submit" value="Selecteer" name="selecteer">

Zorg ervoor dat de button een naam heeft dat is later handig om onderscheidt te maken tussen de verschillende buttons op de pagina.

We gaan nu een formulier maken waar je de gegevens van de geselecteerde film te zien krijgt.
In het formulier willen we de huidige filmgegevens tonen. Deze moeten dus even opgehaald worden uit de database.

$filmnr = mysqli_real_escape_string($link,$_POST['filmnr']);
$result = mysqli_query($link,"SELECT * FROM films WHERE filmnr=$filmnr");
$row = mysqli_fetch_assoc($result);

Om SQL-injecties te voorkomen dien je het verstuurde filmnr te voorzien van escape characters. Daarvoor is een functie. GEBRUIK DIT ALTIJD ALS JE EEN VERSTUURDE PARAMETER IN EEN QUERY GAAT INVULLEN.
We voeren de query uit en het resultaat zetten we in $row
We kunnen nu $row['titel'] bijvoorbeeld gebruiken om de filmtitel te tonen.

### Update formulier

In het formulier willen we graag de gegevens van de geselecteerde film voordrukken, dat kan met

Titel <input type="text" name="titel" value="<?php echo $row['titel'];?>">

Op de plaats van 'value' gaan we naar PHP toe en doen we een echo van de titel. De titel van de film zal dan worden getoond in het tekstveld van het formulier.

<form method="post">
<input type="hidden" name="filmnr" value="<?php echo $row['filmnr'];?>">
Titel <input type="text" name="titel" value="<?php echo $row['titel'];?>"><br>
Tijdsduur <input type="number" name="tijdsduur" value="<?php echo $row['tijdsduur'];?>"><br>
<input type="submit" name="wijzig" value="Wijzigingen opslaan">
</form>

In het formulier hierboven zijn alleen titel en tijdsduur opgenomen. Hier kan je natuurlijk de overige velden van films aan toevoegen. Belangrijk is dat je ook de primaire sleutel in het formulier plaatst zodat deze ook mee wordt verstuurd. Hierboven is filmnr als 'hidden' veld opgenomen. De gebruiker krijgt het filmnr dan niet te zien, maar wordt wel meegstuurd.
Wanneer je het filmnr wel wilt tonen, maar niet wilt dat de gebruiker het kan aanpassen zou je ook onderstaande optie kunnen gebruiken:

Filmnr <input type="text" name="filmnr" value="<?php echo $row['filmnr'];?>" readonly>
Het 'readonly' attribute zal ervoor zorgen dat het veld wel leesbaar is, maar niet aanpasbaar.

### De update zelf

Boven aan de pagina kan nu de update van de film gedaan worden.
Voordat je de update gaat doen is het vaak handig om te kijken wat er allemaal wordt verstuurd.

var_dump($_POST);

Deze functie schrijft op het scherm wat er allemaal in $_POST zit. Mocht dit leeg zijn of onbreken er gegevens dan moet je nog even goed kijken naar je update formulier.

De update willen we alleen uitvoeren als er iets verstuurd is, dus we starten met

if($_POST!=null){
if(!empty($_POST['wijzig'])){
// hier de update code
}
}
De !empty($_POST['wijzig']) wordt gebruikt om te kijken of het wijzig formulier is verstuurd.
Als deze is verstuurd, dan wil je een update doen
Omdat de velden die we versturen weer in een query komen te staan moeten we deze door de mysqli_real_escape_string functie heen laten gaan
$filmnr = mysqli_real_escape_string($link,$_POST['filmnr']);
$titel = mysqli_real_escape_string($link,$_POST['titel']);
$tijdsduur = mysqli_real_escape_string($link,$_POST['tijdsduur']);
Nu kunnen we de update query maken
mysqli_query($link,
"UPDATE films SET titel='$titel',tijdsduur='$tijdsduur' WHERE filmnr=$filmnr")
or die (mysqli_error($link));
Soms is het wenselijk om de gebruiker feedback te geven of de update gelukt is.
Hiervoor kan gebruik gemaakt worden van de functie mysqli_affected_rows($link) het resultaat van de functie zijn het aantal gewijzigde rijen in de database. Deze functie kan je ook na een INSERT query gebruiken. Hieronder een voorbeeld:
if(mysqli_affected_rows($link)){
echo "Gegevens zijn aangepast";
}else{
echo "Er zijn geen gegevens aangepast";
}
Plak alle scriptjes in de juiste volgorde, om het geheel te laten werken.
Extra voeg de overige velden van de tabel films toe om deze ook aan te kunnen passen.