compliance
compliance

Reputation: 434

Simple PHP form submitting - what's wrong with this conditional if and logical &&?

The problem:

if i submit the html form and a textbox is left blank
then i don't want it to proceed to the echo segment,
but the problem is it does proceed.

<?php
        if(!isset($_POST['submit']) && empty($_POST['moon']) && empty($_POST['planet']))
        { 
?>

        <form name="form2" method="post" action="<?php echo($_SERVER["PHP_SELF"]);?>">
            <div>
                Write a planet name: <input name="planet" type="text"><br>
                Its moon: <input name="moon" type="text">
            </div>
            <div>
                <input type="submit" name="submit" value="submit">
            </div>
        </form>


 <?php
       }else{

            echo("Planet: ".$_POST['planet']. "<br>");
            echo("Moon: ". $_POST['moon'] . "<br>");
            echo "Successful.";

            }
?>

As you know isset() determines if a variable is set and not null but doesn't check if it's empty.

While logic seems my if statement, I modified it from:
if(!isset($_POST['submit']) && empty($_POST['moon']) && empty($_POST['planet']))

To:

and none of them worked.


So am I doing something wrong with my if statement? how can I not let it proceed to the Else segment while a textbox is empty? without more if and no nested statements please.

Upvotes: 1

Views: 5539

Answers (3)

Jeremy Harris
Jeremy Harris

Reputation: 24579

When you submit a form, the submit button will be set, so isset($_POST['submit']) will be true, therefore !isset($_POST['submit']) will be false.

When doing an if statement with the && comparison, all conditions must be true in order to execute that block of code, otherwise it goes to the else statement.

What you need to do is actually have 2 comparison checks. Once to see if the form was never submitted and one to see if it was, and the text boxes are empty:

<?php

   // Check if form was submitted
   if(!isset($_POST['submit'])
   {
      // Display the form
   }
   else
   {
      // Form was submitted, check if values are empty
      if(trim($_POST['planet'])=="" || trim($_POST['moon'])=="")
      {
         // One or more value is empty, do something
      }
      else
      {
         // Process form
      }
   }

?>

I realize you are trying to avoid nesting, but in order for the logic to flow smoothly, and the code to remain readable, this is a necessary evil.

Upvotes: 2

ArendE
ArendE

Reputation: 997

Your problem is that if(!isset($_POST['submit'])) is always set when the form is submitted - so that is true. You also might want to change the && to ||. By using || you say OR, so say if anyone is empty, then do this, else do that.

Upvotes: 0

Mekswoll
Mekswoll

Reputation: 1433

Change

if(!isset($_POST['submit']) && empty($_POST['moon']) && empty($_POST['planet']))

To

if(!isset($_POST['submit']) || (empty($_POST['moon']) || empty($_POST['planet'])))

Then if you submit with either textbox being empty, it will redisplay the form. If both textboxes have been filled in, you will see the else part.

Upvotes: 1

Related Questions