Database update middels action="#" Hoe werkt dat?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<form method='post' action="#">
<div class="form-group">
<label for="title">Title</label>
<input type="text"
class="form-control"
id="title"
placeholder="Enter a title"
name="title">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
<div class="form-group">
<label for="title">Title</label>
<input type="text"
class="form-control"
id="title"
placeholder="Enter a title"
name="title">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
Iets ingekort zodat het leesbaar blijft.
Het action=“#” attribuut stuurt de inhoud van de input tags terug naar deze pagina. Dat is wat ik vind op internet. Maar ook wordt op een magische manier een method aangeroepen die de database update! Hoe gebeurt dat?
Op SO lees ik dit:
The # tag lets you send your data to the same file. I see it as a three step process:
Query a DB to populate a from
Allow the user to change data in the form
Resubmit the data to the DB via the php script
With the method='#' you can do all of this in the same file.
After the submit query is executed the page will reload with the updated data from the DB. Dat is precies wat er gebeurt: maar Hoe werkt dat, c.q. hoe kan het werken?
In punt 3: wat is the php script? Hoe kan het “systeem” weten welk php script te gebruiken?
Er zit ongetwijfeld een JavaScript achter die getriggerd wordt aan de hand van een element.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<form method='post' action="#">
<div class="form-group">
<label for="title">Title</label>
<input type="text"
class="form-control"
id="title"
placeholder="Enter a title"
name="title">
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="text"
class="form-control"
id="description"
placeholder="Enter a description"
name="description">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
<div class="form-group">
<label for="title">Title</label>
<input type="text"
class="form-control"
id="title"
placeholder="Enter a title"
name="title">
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="text"
class="form-control"
id="description"
placeholder="Enter a description"
name="description">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
Voor zover ik zie: geen javascript te bekennen.
Met de hand op m'n hart garandeer ik je dat "iemand" het betreffende record in de database aanmaakt.
In de output is dat ook te zien.
Maar hoe het werkt; graag zou ik dat weten.
O ja,
Er zit helemaal geen javascript in het hele project.
Gewijzigd op 04/02/2020 23:08:29 door Jan Kila
Gewijzigd op 04/02/2020 23:08:50 door - Ariën -
Behalve dat index.php wordt uitgevoerd, geeft dat geen bruikbare informatie
Dan moet het uitvoerende script in index.php zitten. Of je ziet iets over het hoofd.
De taskController bevat onder meer de volgende functie:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function create()
{
//echo '<p>tasksController function create()</p>';
if (isset($_POST["title"]))
{
require ROOT.'Models/Task.php';
$task= new Task();
if ($task->create($_POST["title"], $_POST["description"]))
{
//echo '<p>tasksController function create() in de if</p>';
header("Location: " . WEBROOT . "tasks/index");
}
}
$this->render("create");
}
{
//echo '<p>tasksController function create()</p>';
if (isset($_POST["title"]))
{
require ROOT.'Models/Task.php';
$task= new Task();
if ($task->create($_POST["title"], $_POST["description"]))
{
//echo '<p>tasksController function create() in de if</p>';
header("Location: " . WEBROOT . "tasks/index");
}
}
$this->render("create");
}
Het overzicht van taken bevat de knop: "Add new task". Een druk op deze knop stuurt me naar het form Create - zie voorgaande code van het form. Een nieuw leeg form heeft ook een lege $_POST[] dus de functie create() voert alleen de functie render() uit en toont het lege form.
Heb ik gegevens ingevuld en op de Submit knop gedrukt dan is $_POST[] gevuld. Nu voert de functie create() wel de code uit die de database update.
Het was even zoeken maar ook dit is weer helder.
Blijft nog een vraag - is dit nu een "normale" manier van werken?
In de MVC-wereld ziet het er logisch uit. Ik zou dan wel een exit(); na je header zetten.
Okay, wederom, dit werkt, maar al die haken en ogen :p.
Allereerst, het nagaan of iets wordt gePOST zou je idealiter moeten controleren met:
En niet met behulp van een controle die checkt op een specifieke veldnaam. Wat nu als het formulier inhoudelijk wordt aangepast en de veldnamen anders gaan heten of komen te vervallen? Dat kan dan potentieel het schakelen naar een "verwerkmodus" breken.
Dan de aloude header-val. Een header('Location: ...') redirect je pas aan het einde van alle PHP-code / de response naar de nieuwe locatie. Dus wat er achtereenvolgens gebeurt indien je een POST doet:
- het if-statement levert true op en de Task wordt gecreëerd
- de header wordt ingesteld
de pagina wordt gerenderd ($this->render('create') wordt gewoon uitgevoerd)
- je wordt geredirect naar de nieuwe locatie
Normaal gesproken zet je na een header('Location: ...') altijd een exit-statement zodat je ook direct dan en daar wordt geredirect, en er verder geen code meer wordt uitgevoerd. Het aanwezig zijn of ontbreken kan het verschil tussen een veilige en onveilige applicatie betekenen. Als het je doel is om te redirecten kun je hier beter een (helper) methode van maken waarin je ook een HTTP-code kunt instellen en die tevens een exit-statement toevoegt zodat je dit nooit meer vergeet.
Daarnaast, het produceren van output in combinatie met headers kan op zijn beurt weer oorzaak zijn van een compleet nieuw scala aan foutmeldingen :/.
Geen idee of dit de normale manier van werken is. Ik zou zeggen dat het bovenstaande twee acties zijn die zijn samengenomen. Een die een formulier toont, en een die het formulier verwerkt. Misschien is het dan ook logischer om dit te scheiden in een /new (of /add of wat dan ook) en een /process actie? Als je alles een beetje extrapoleert van hoe classes en methoden werken (deze (classes) hebben vaak een specifieke toepassing en (methoden) omvatten vaak één specifieke taak) dan zou mij dat logischer klinken.
Maar ja, dit project snijdt wel meer bochten af :).
Gewijzigd op 05/02/2020 00:21:31 door Thomas van den Heuvel
Bedank voor je bedenkingen, dat maakt dat ik me een beetje goed voel bij m'n kritische houding ten opzichte van 'zaken die van internet komen'.
Het is op zich geweldig dat we tegenwoordig zoveel zaken kunnen vinden, maar er zit ook veel 'vuil' tussen; en wanneer je zoals ik iets nieuws oppak dan is het niet altijd direct duidelijk wat het 'vuil' is. Maar met schade en schande...
Ik heb nog zo'n tut gevonden: https://www.youtube.com/watch?v=Aw28-krO7ZM&list=PL7A20112CF84B2229&index=1
Ook als opstapje best wel aardig, maar uit 2011 en dan begin ik al wat bedenkingen te krijgen.
Is er misschien een 'koninklijke weg' zodat ik niet door al dat 'vuil' behoef te ploegen?
Een boek, een youtube tut of een artikel serie; iets wat meer state of the art is.
O ja, ik bedoel 'vuil' niet eens negatief. In elke ontwikkeling zit een element van 'toegenomen inzicht' waardoor eerdere zaken, producten, meningen, overtuigingen, etc. ineens in een ander licht komen te staan.
Gewijzigd op 05/02/2020 15:05:48 door Jan Kila
Jan Kila op 05/02/2020 15:03:04:
Is er misschien een 'koninklijke weg' zodat ik niet door al dat 'vuil' behoef te ploegen?
De enige weg hierlangs is erdoor denk ik :p. En op een gegeven moment heb je voldoende bagage om dit soort dingen op waarde te schatten. Misschien is dit ook de enige manier, ik bedoel, iedereen kan zijn/haar mening geven over hoe iets zou moeten, maar het is beter om zelf bij conclusies te arriveren. Tegelijkertijd zijn er 1001 manieren om hetzelfe doel te bereiken, er is geen beste oplossing.
Het verraderlijke van al die zooi op internet is dat zulke tutorials vaak niet overduidelijk slecht zijn, wat dat betreft richt een baggertutorial met een professionele presentatie meer schade aan dan andersom :).
Het heeft ook geen zin om dat soort tutorials (youtube) in een comment structureel te ontmantelen want vaak voelen de auteurs zich dan beledigd wat meestal uitmondt in het verwijderen van een reactie. Je kunt enkel met lede ogen aanzien hoe mensen zulke tutorials de hemel inprijzen en die poep als zoete koek opvreten :p.
Edit:
Onnodige bericht verwijderd. Deze kan in een nieuw topic.