Skip to content
Advertisement

PHP Issue with isset function

I’m making a contact form for my website that uses php to send the inputted information to my email.

My issue is that the isset php function returns false. I’m not sure why this is.

Here is my php code (the outputted result is “not sent”)

<?php

if (isset($_POST['submit'])){
    $name = $_POST['name'];
    $subject = $_POST['subject'];
    $mailFrom = $_POST['mail'];
    $message = $_POST['message'];

    $mailTo = "btrorapps@gmail.com";
    $headers = "From: " .$mailFrom;
    $txt = "You have received an email from " .$name.".nn".$message;

    if (mail($mailTo, $subject, $txt, $headers)){
        echo "<h1>sent successfully</h1>";
    } else {
        echo "<h1>something went wrong</h1>";
    }
} else {
    echo "not sent";
}

?>

Here is my form code

<form action="contactform.php" method="post" enctype="text/plain">
     <label for="name">Name</label>
     <input type="text" name="name" placeholder="Full name.." maxlength="20" required>

     <label for="mail">Email</label>
     <input type="text" name="mail" placeholder="Your email.." 
      pattern="[a-z0-9._%+-]+@[a-z0-9.-]+.[a-z{2,}$" required>

     <label for="subject">Subject</label>
     <input type="text" name="subject" maxlength="25" placeholder="Subject..">

     <label for="message">Message</label>
     <input type="text" name="message" placeholder="Message.." style="height:170px" 
      maxlength="150" required>

     <input type="submit" value="submit" name="submit">
</form>

Advertisement

Answer

There is nothing wrong with isset function. It is not even a PHP-related issue.

It is all about form submission encoding. There are 3 valid encoding types for forms:

  1. application/x-www-form-urlencoded (default)
  2. multipart/form-data
  3. text/plain

You’re using the third one, which has documented like:

Payloads using the text/plain format are intended to be human readable. They are not reliably interpretable by computer, as the format is ambiguous (for example, there is no way to distinguish a literal newline in a value from the newline at the end of the value).

You’re not getting any POST variables since PHP doesn’t populate $_POST when using enctype="text/plain".

In the docs of $_POST superglobal:

An associative array of variables passed to the current script via the HTTP POST method when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request.


Being said that, you can still read raw data from the request body.

$data = file_get_contents('php://input');

But you’ll get the whole data as a string (plain text).

And last but not least, be careful, php://input is not available with enctype="multipart/form-data".

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement