Al een hele poos probeer ik erachter te komen wat er verkeerd is aan deze simpele code:

<html>
<body>
<form name="input" action="cz.php" method="post">
Titel: <input type="text" name="Titel">
<input type="submit" value="Submit">
</form>
</body>

</html>

Vervolgens wil ik het resultaat testen in "cz.php":
<?php
if (isset($_POST)) {
echo "er is post" . "<br>";
print_r($_POST);

} else {
echo "Er is helaas geen post" . "<br>";
print_r($_POST);
}
?>

Het vreemde is nu dat als ik niets invul dan komt toch de melding 'er is post'. M.a.w. het script denkt dus blijkbaar dat er wel iets is 'gepost', terwijl de array leeg blijft, zo blijkt uit print_r($_POST).

Welke fout maak ik hier?
Dit is een foute controle:
if (isset($_POST))

Gebruik de juiste:
if($_SERVER['REQUEST_METHOD'] == 'POST')
Ook dat werkt niet. Als ik niets invul verwacht ik dat het script retourneert wat er bij else staat. Nu blijft het script komen met 'Er is post' gevolgd door een lege array.
Laat je formulier eens zien.
Het doet vermoeden dat je daar iets met name bent vergeten.

Dan voor het posten:

<?php

if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
   echo 'Er is het volgende gepost:';
   echo '<pre>';
   print_r($_POST);
   echo '</pre>';
}
?>
Hier werkt ie gewoon.
Het simpele formuliertje heb ik in mijn eerst bericht al gegeven.
Een leeg invulveld geeft nog steeds niet terug wat er bij else staat.
Ah ik zie het.
Klopt, isset set je hem alleen maar dus je moet het anders aanpakken. Overigens is dat een ander probleem als wat jij omschrijft. :)


<?php

if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
   if( !isset($_POST['Titel'] ) OR trim( $_POST['Titel'] ) == '' )
   {
     echo 'Titel is niet ingevuld!';
   }
   else
   {
       echo 'Er is het volgende gepost:';
       echo '<pre>';
       print_r($_POST);
       echo '</pre>';
   }
}
?>

EDIT typos
Prachtig, dat werkt!
Maar je begrijpt dat dit slechts een test was.
Hat is de bedoeling dat, als er iets ingevuld is, je wordt doorgestuurd naar een andere pagina.
Daartoe heb ik het else statement vervangen door:
else
{
header("Location: process.php");
}

Maar dan krijg ik de beruchte waarschuwing: Warning: Cannot modify header information - headers already sent ....
Hoezo zijn er headers verzonden? Er is toch nog niets geprint op de pagina?

Dat komt waarschijnlijk omdat je eerst html output doet en dan je script starten.
Dus compleet:

<?php

if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
   $error = array();
   if( !isset($_POST['Titel'] ) OR trim( $_POST['Titel'] ) == '' )
   {
     $error['titel'] = 'Titel is niet ingevuld!';
   }
   else
   {
       header('Location: process.php');
       exit();
   }
}
?>

<html>
<body>
  <form name="input" action="cz.php" method="post">
<?php 
if( isset($error['titel'] ) {
    echo $error['titel'];
}
?>
Titel: <input type="text" name="Titel">
<input type="submit" value="Submit">
</form>
</body>

</html> 
Zeer bedankt voor het antwoord.
Inmiddels heb ik op het forum gezocht naar de beruchte melding. Zo kwam ik erachter dat er nog geen enkele output naar de browser mag zijn.
Wat bleek: mijn php script begon met een lege regel voor de php tag. Dat heb ik steeds over het hoofd gezien..... Toen ik die regel had weggehaald, was die vervelende melding ook verdwenen.

Toch nog een vraag:
Niet alleen het veld 'Titel' wil ik afvangen, meerdere velden velden staan er in die $_POST array. Wat is nu de beste manier om alle velden apart in verschillende variabelen te zetten?
Cees D op 17/03/2013 20:33:20

Niet alleen het veld 'Titel' wil ik afvangen, meerdere velden velden staan er in die $_POST array. Wat is nu de beste manier om alle velden apart in verschillende variabelen te zetten?

Begrijp je vraag niet goed. De variabelen uit je formulier staan al in verschillende variabelen: namelijk in de $_POST-waarden.

Reageren