login  Naam:   Wachtwoord: 
Registreer je!
 Forum

else lus altijd te zien

Offline theancients - 19/10/2013 18:55 (laatste wijziging 24/10/2013 15:41)
Avatar van theancientsLid Hallo iedereen,

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.

Het principe ziet er ongeveer zo uit:

  1. <?php
  2.  
  3. if(blabla blabla)
  4. {
  5. //script hier
  6. }
  7. else
  8. {
  9. echo 'Oeps, er is iets niet gelukt';
  10. //in mijn geval een formulier
  11. }
  12.  
  13. ?>

Ik heb het formulier zowel binnen als buiten php geprobeerd maar helaas zonder resultaat.

Mocht je het script nodig hebben dan ziet het er zo uit:
Plaatscode: 142279

Ik probeer te begrijpen waarom dit gebeurt en ik geen foutmelding krijg om dit op te lossen. Zou iemand mij uit kunnen leggen wat hier aan de hand is?

Vriendelijk dank,

The ancients

13 antwoorden

Gesponsorde links
Offline Thomas - 19/10/2013 19:40
Avatar van Thomas Moderator 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)?
Offline theancients - 19/10/2013 19:48 (laatste wijziging 19/10/2013 19:53)
Avatar van theancients Lid 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.

Overigens kreeg ik met:

ini_set("display_errors","on");

Geen resultaten.
Offline Thomas - 19/10/2013 19:56
Avatar van Thomas Moderator 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 .
Offline theancients - 19/10/2013 23:18
Avatar van theancients Lid Dat is wat ik al begrepen had, echter heb ik eerst het (html)form en daarna word pas bekeken of het verzonden is.

if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST))
{

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.

Offline Thomas - 20/10/2013 00:37
Avatar van Thomas Moderator 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.
Offline theancients - 20/10/2013 21:07 (laatste wijziging 20/10/2013 21:08)
Avatar van theancients Lid Hoe krijg ik dit dan wel voor elkaar? Moet ik dit oplossen door te kijken of er een variable geset is?

Dus zoiets als if(isset('verzonden'){ of met if(exists('verzonden'){ en de rest van het script hier?

Offline WouterJ - 20/10/2013 22:06
Avatar van WouterJ HTML gevorderde exists bestaat niet en zijn PHP versie is isset. Maar 1) wat wil je oplossen en 2) wat bedoel je met isset('verzonden') ?
Offline theancients - 21/10/2013 15:56 (laatste wijziging 21/10/2013 16:49)
Avatar van theancients Lid Hallo WouterJ,

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...
Offline Thomas - 21/10/2013 23:34
Avatar van Thomas Moderator 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:
  1. <?php
  2. if ($condition) {
  3. echo 'een<br />';
  4. echo 'twee<br />';
  5. echo 'drie<br />';
  6. }
  7. ?>


Kun je ook dit doen:
  1. <?php
  2. if ($condition) {
  3. ?>een<br />
  4. twee<br />
  5. drie<br /><?php
  6. }
  7. ?>


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 ;).
Offline WouterJ - 22/10/2013 09:25
Avatar van WouterJ HTML gevorderde Dan zal ik ook meteen de alternatieve statement versie tonen, aangezien dat nog overzichtelijker is.

  1. <?php if ($condition) : ?>
  2. een<br />
  3. twee<br />
  4. drie<br />
  5. <?php endif ?>
Offline Thomas - 22/10/2013 14:28
Avatar van Thomas Moderator 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):

  1. <?php
  2. // initialisatie formulier variabelen
  3. $formVars = array(
  4. 'title' => '',
  5. 'date' => date('Y-m-d'), // initialiseer op datum van vandaag
  6. 'news' => '',
  7. );
  8.  
  9. // foutmeldingen
  10. $formErrors = array();
  11.  
  12. // is er een formulier gesubmit?
  13. $posting = $_SERVER['REQUEST_METHOD'] == 'POST';
  14.  
  15. // was er een formulier gesubmit?
  16. if ($posting) {
  17. // sla huidige verstuurde waarden op in $formVars
  18. foreach ($formVars as $k => $v) {
  19. $formVars[$k] = $_POST[$k];
  20. }
  21.  
  22. // verplichte velden
  23. $requiredVars = array(
  24. 'title',
  25. 'date',
  26. 'news',
  27. );
  28.  
  29. // formulier controle
  30. foreach ($requiredVars as $v) {
  31. if (trim($_POST[$v]) == '') {
  32. $formErrors[$v] = 'Dit veld is verplicht';
  33. }
  34. }
  35.  
  36. // mogelijk andere controles (bijvoorbeeld formaat datum)
  37. // ...
  38.  
  39. // alles ok?
  40. if (empty($formErrors)) {
  41. // verwerk formulier
  42. // ...
  43. // debug
  44. echo '<pre>'.print_r(array_map('htmlentities', $_POST), true).'</pre>';
  45. // terugkoppeling
  46. ?>Nieuwsbericht opgeslagen.<?php
  47. }
  48. }
  49.  
  50. // waren er foutmelding of waren we niet bezig met het versturen van een formulier, dan toon formulier
  51. if (count($formErrors) || !$posting) {
  52. // waren er fouten?
  53. if (count($formErrors)) {
  54. ?><blockquote>Een of meer velden zijn niet (goed) ingevuld. Controleer je invoer.</blockquote><?php
  55. }
  56. ?>
  57. <style type="text/css">
  58. <!--
  59. .form-error { background-color: #ffcccc; }
  60. //-->
  61. </style>
  62. <form name="add-news" action="<?php echo htmlentities($_SERVER['PHP_SELF']) ?>" method="post">
  63. <table border="0" cellspacing="0" cellpadding="2">
  64. <tr<?php echo (isset($formErrors['title']) ? ' class="form-error"' : '') ?>>
  65. <td>Titel *</td>
  66. <td><input type="text" name="title" value="<?php echo htmlentities($formVars['title']) ?>" /></td>
  67. </tr>
  68.  
  69. <tr<?php echo (isset($formErrors['date']) ? ' class="form-error"' : '') ?>>
  70. <td>Datum *</td>
  71. <td><input type="text" name="date" value="<?php echo htmlentities($formVars['date']) ?>" /></td>
  72. </tr>
  73.  
  74. <tr<?php echo (isset($formErrors['news']) ? ' class="form-error"' : '') ?>>
  75. <td valign="top">Artikel *</td>
  76. <td><textarea name="news" rows="5" cols="40"><?php echo htmlentities($formVars['news']) ?></textarea></td>
  77. </tr>
  78.  
  79. <tr>
  80. <td colspan="2">Velden met een * zijn verplicht</td>
  81. </tr>
  82.  
  83. <tr>
  84. <td colspan="2"><button type="submit">Opslaan</button></td>
  85. </tr>
  86. </table>
  87. </form><?php
  88. }
  89. ?>


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)
Offline theancients - 22/10/2013 15:04 (laatste wijziging 22/10/2013 15:05)
Avatar van theancients Lid @FangorN:
Citaat:
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.
Offline Wijnand - 04/11/2013 08:54 (laatste wijziging 16/01/2014 16:36)
Avatar van Wijnand Moderator theancients, is de vraag goed beantwoord?

mod edit: laatste keer online: 28 oktober 2013 - 12:44
als het nodig is kan dit topic heropend worden
-FangorN
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.237s