Ik probeer een website op te zetten met daarin een nieuws gedeelte. Nu heb ik het toevoeg formulier klaar op basis van een tutorial die ik op deze website heb gevonden. Echter lijk ik iets over het hoofd te zien want dit is wat er gebeurt.
Het script lijkt te werken maar als ik het formulier invul dan krijg ik onder aan het formulier nog een formulier te zien. Dit zou eigenlijk pas gezien mogen worden als je iets vergeet in te vullen of niet geheel correct is. Toch zie ik dat formulier wel.
Ik heb inmiddels overal gekeken, google, error logs en ik heb foutmeldingen aangezet maar geen van allen kwam terug met een probleem.
Als je in het else-deel van het if-statement terecht komt, leverde de "blabla blabla" blijkbaar geen predikaat (expressie, ding) op wat na evaluatie (vereenvoudiging) "true" opleverde.
Als je dus hebt:
if (blabla) {
A
} else {
B
}
en je krijgt continu B als resultaat, dan levert "blabla" blijkbaar nooit iets op wat true is.
Heb je "blabla" al gedebugged (of $_SERVER of $_POST)?
Dank je voor de informatie! Ik ga hier naar kijken. Maar wat ik eigenlijk verwachtte is dat de if statement pas uitgevoerd zou worden als ik op verzenden klik en niet als de pagina laat. Daarom vind ik het dus raar.
Afhankelijk van welke condities gelden kunnen verschillende "blokken" code of HTML worden uitgevoerd of getoond. Dat is het idee van een if-(else-)blok: op grond van "de toestand" van de waarden van variabelen die je controleert (en waarmee je ze vergelijkt) beslist de code wat er moet gebeuren.
In jouw geval (codefragment) druk je altijd een HTML-formulier af, meteen daarna controleer je of er een formulier is verstuurd (wat wel of niet waar kan zijn). Vervolgens wordt of het formulier verwerkt (als er een verstuurd is) en anders wordt er wederom een formulier getoond .
Voorop gesteld dat het formulier al verzonden word tijdens het laden van de pagina dan zou het bovenstaande stukje een foutmelding terug moeten geven omdat hij leeg is. Er is tenslotte niets ingevuld. Ik heb geen foutmeldingen in dat opzicht, alleen twee formulieren.
Uhm, voor wat betreft het debuggen, ik heb geprobeerd de $_post uit te lezen met een print_r(); Maar die geeft niets terug. Ook niet als ik het formulier leeg verzend want dan krijg ik netjes de foutmeldingen die er in zitten.
Het klopt dat als je voor de eerste keer de pagina laadt geen foutmeldingen krijgt, immers $_SERVER['REQUEST_METHOD'] == 'POST' gaat niet op (deze is standaard GET), en $_POST bestaat dan niet / is dan leeg, dus als je normaal de pagina laadt is dat equivalent aan:
$_SERVER['REQUEST'] is 'GET', dus er staat 'GET' == 'POST', dit levert false
$_POST is leeg / bestaat niet, empty($_POST) is dus true en !empty($_POST) is dus false
er staat dus
if (false && false)
dit is equivalent aan false (zelfs false && <whatever> is equivalent aan false (lazy evaluation))
in een geval waarbij zoiets geldt:
if (false) {
A
} else {
B
}
zal A nooit uitgevoerd worden, dus er vindt ook geen formuliercontrole plaats.
Ik probeer te begrijpen waarom het "else" gedeelte word uitgevoerd in plaats van dat het script controleert of het ingevuld is.
Daarom vroeg ik of dat ik dit kon oplossen door middel van isset of exists. Met andere woorden, het script moet pas uitgevoerd worden als er op verzonden is geklikt.
Dit werkt overigens wel als ik het apart in een .php bestand zet...
Ik snap nog steeds niet helemaal wat er mis gaat, maar wellicht helpt het als je de action in het eerste formulier invult. Ook snap ik niet helemaal waarom je het formulier een tweede keer zou willen definiëren, dat is namelijk niet nodig, en nogal bewerkelijk als er iets in layout wijzigt, je moet het dan twee keer aanpassen.
Ook kun je onbeperkt in en uit PHP-blokken springen, dus in plaats van:
Dat is toch een stuk beter leesbaar niet? Ik zal aan de hand van jouw codefragment een werkend voorbeeld maken, met wat aantekeningen erbij, want ik denk niet dat we er op een andere manier uit gaan komen ;).
Onderstaande snippet is een herschreven variant. Er zijn legio manieren om dit te doen, dit is slechts één variant die zelf ook nog voor verbetering vatbaar is (zie tips na fragment):
TIPS:
- trek code en HTML zoveel mogelijk uit elkaar, dit maakt e.e.a. stukken leesbaarder
- verdeel je code/HTML onder in "acties" of "taken", en maak hier functies of methodes van, dit helpt de verdere onderverdeling in logische blokken; voorbeelden van "taken" voor het toevoegen/wijzigen/verwijderen van nieuwsberichten:
* toon formulier nieuw artikel (al dan niet met terugkoppeling van foute nieuwe invoer)
* verwerk formulier nieuw artikel
* toon formulier voor wijzigen bestaand artikel (al dan niet met terugkoppeling van foute gewijzigde invoer)
* verwerk formulier voor wijzigen bestaand artikel
* verwijder artikel (met vantevoren een bevestiging uiteraard)
- maak formulieren gebruiksvriendelijk, laat zien WELKE invoer verkeerd is en WAAROM, niets is zo irritant dat een formulier teruggeeft "er gaat iets fout" zonder toelichting wat; maak gebruik van labels en id's (zit niet in voorbeeld); laat zien wat verplicht is en eventueel wat voor formaat een invoerveld moet hebben
- identificeer waar informatie vandaan komt, geef bijvoorbeeld het formulier een hidden veld mee (bijvoorbeeld "formname" o.i.d.) zodat je in je controle voor afhandeling kunt zien dat je het goede formulier aan het verwerken bent , dit lijkt me des te belangrijker als je je code niet bloksgewijs hebt opgezet; houd alles in ieder geval uniform (zorg dat je alles omtrent formulieren altijd op dezelfde manier afhandelt)
Ik snap nog steeds niet helemaal wat er mis gaat, maar wellicht helpt het als je de action in het eerste formulier invult. Ook snap ik niet helemaal waarom je het formulier een tweede keer zou willen definiëren, dat is namelijk niet nodig, en nogal bewerkelijk als er iets in layout wijzigt, je moet het dan twee keer aanpassen.
Sorry, wellicht had ik iets duidelijker moeten zijn. Ik probeer te begrijpen hoe het in elkaar zit en het programmeren in elkaar steekt. In plaats van direct een oplossing te vragen kan ik het misschien beter begrijpen door te vragen wat er gebeurt en als ik ergers een fout gemaakt heb om deze zelf op te lossen. Maar omdat ik geen foutmelding kreeg wist ik ook niet wat er aan de hand was. Door controle van het logboek en nog meer van die zaken kwam ik er ook niet achter. Ik ging er min of meer van uit dat het script pas uitgevoerd zou worden als ik op verzenden had geklikt.
Voor wat betreft het tweede formulier, het idee er achter was dat wanneer er fouten zouden ontstaan dat ik weer een formulier gepresenteerd zou krijgen en het nog eens kon proberen. Maar nu blijkt inderdaad nu ik er zo over nadenk dat een tweede formulier niet nodig is omdat er al een stukje javascript in zit die mij in staat stelt terug te keren naar de vorige pagina waar het formulier aanwezig is.
@WouterJ:
Dank je wel voor het meedenken. Ik zal me eigen eens moeten verdiepen in alternatieven zoals jij ze aandraagt. Echter ben ik nog niet zolang begonnen en moet ik nog veel leren. Zoals ik al tegen FangorN zei, ik probeer het te begrijpen want alleen met leren kom je er niet. Het is net wiskunde wat dat betreft in mijn ogen.