Database update middels action="#" Hoe werkt dat?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan Kila

Jan Kila

04/02/2020 20:12:50
Quote Anchor link
Het form in mijn code is als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>

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?
 
PHP hulp

PHP hulp

20/02/2020 15:08:01
 
- Ariën -
Beheerder

- Ariën -

04/02/2020 20:22:41
Quote Anchor link
Er zit ongetwijfeld een JavaScript achter die getriggerd wordt aan de hand van een element.
 
Jan Kila

Jan Kila

04/02/2020 23:02:55
Quote Anchor link
Dit is de volledige code voor de betreffende pagina.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>

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
 
- Ariën -
Beheerder

- Ariën -

04/02/2020 23:07:52
Quote Anchor link
Kijk eens in de netwerk-tab van je browser om te zien waar die request op plaatsvindt.
Gewijzigd op 04/02/2020 23:08:50 door - Ariën -
 
Jan Kila

Jan Kila

04/02/2020 23:27:04
Quote Anchor link
Behalve dat index.php wordt uitgevoerd, geeft dat geen bruikbare informatie
 
- Ariën -
Beheerder

- Ariën -

04/02/2020 23:36:35
Quote Anchor link
Dan moet het uitvoerende script in index.php zitten. Of je ziet iets over het hoofd.
 
Jan Kila

Jan Kila

04/02/2020 23:53:09
Quote Anchor link
Raadsel opgelost.
De taskController bevat onder meer de volgende functie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");
    }

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?
 
- Ariën -
Beheerder

- Ariën -

05/02/2020 00:00:26
Quote Anchor link
In de MVC-wereld ziet het er logisch uit. Ik zou dan wel een exit(); na je header zetten.
 
Thomas van den Heuvel

Thomas van den Heuvel

05/02/2020 00:19:18
Quote Anchor link
Oef.

Okay, wederom, dit werkt, maar al die haken en ogen :p.

Allereerst, het nagaan of iets wordt gePOST zou je idealiter moeten controleren met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    // do stuff
}
?>

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
 
Jan Kila

Jan Kila

05/02/2020 15:03:04
Quote Anchor link
@Thomas,
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
 
Thomas van den Heuvel

Thomas van den Heuvel

05/02/2020 17:44:20
Quote Anchor link
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.
 
- Ariën -
Beheerder

- Ariën -

14/02/2020 09:07:25
Quote Anchor link
Edit:
Onnodige bericht verwijderd. Deze kan in een nieuw topic.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.