Packy
Packy

Reputation: 3573

post to form to same page

Basically I am trying to re work a plugin so what I need to do is post the form data on the Cart.php form on the same page. Below is the set up I have but the $_POST info is not returning anything when email is sent:

Cart.php

    <form id='SimpleEcommCartCartForm' action="" method="post">

      <div id="emailForm">
        <p>Please fill out the form below and one of our associates will contact you with more information.</p>
        <div class="col-xs-4">
           Name: <input type="text" name="name" id="name">
        </div>
        <div class="col-xs-4">
          E-mail: <input type="email" name="email" id="email">
        </div>
        <div class="col-xs-4">
           Phone: <input type="tel" name="phone" id="phone">
        </div>


      </div>


    </form>

<?php
//Send the email
 $to = "[email protected]";
 $name = $_POST['name'] ; 
 $from = $_POST['email'] ; 
 $phone = $_POST['phone'] ; 
 $headers = "MIME-Version: 1.0\n";
 $headers .= "Content-type: text/html; charset=iso-8859-1\n";
 $headers .= "From: $from"; 
 $subject = "Pump Part Inquiry"; 


 $emailBody = "
  <html>
      <head>
        <style>
        </style>
      </head>
      <body>
        <h1> Pump Inquiry</h1>
        <h3>From:".$name."<h3>
        <h3>Phone:".$phone."<h3>
        <p>Minetuff Parts".$mine."</p>
        <p>Flygt Parts".$flygt."</p>
      </body>
  </html>";



 $send = mail($to, $subject, $emailBody, $headers); 

 ?>

Upvotes: 0

Views: 147

Answers (3)

Alex Yorke
Alex Yorke

Reputation: 48

Once the email is sent, you haven't told PHP to output anything to the page.

You could add something like echo 'Mail sent'; to the end of the PHP so if the script is being executed correctly then you'll know about it.

If the problem lies within the email not being sent at all, this may be a problem with your server and you should look for a tutorial on how to set up mail correctly. If you're using shared hosting, there are some companies that do not allow the use of the PHP mail() function so I would check with them first.

Amongst this I would recommend that you use something like PHPMailer, a full email library for PHP. Then you could configure for your emails to be sent from anywhere that supports SMTP (not sure if others are supported but there most likely is). PHPMailer will work with shared hosting.


Updated - Code that you can try

Try this out in replacement of $emailBody:

$emailBody = <<<EOT
<html>
  <head>
    <style type="text/css">
    </style>
  </head>
  <body>
    <h1>Pump Inquiry</h1>
    <h3>From: $name<h3>
    <h3>Phone: $phone<h3>
    <p>Minetuff Parts $mine</p>
    <p>Flygt Parts $flygt</p>
  </body>
</html>
EOT;

NB: Some email clients only allow the use of inline CSS, so if you did decide to add anything to your <style> tag in the <head>, don't expect it to work very well or at all in some cases.

As someone has mentioned before, you'll also need to protect against cross-site scripting.

Upvotes: 0

Funk Forty Niner
Funk Forty Niner

Reputation: 74217

It sends the mail with nothing in it (or missing information) if you load it right away, and it's because of a specific reason.

As it stands, your code will send you an Email as soon as you load the page, so it's best to wrap your (PHP) code inside an isset() to work in conjunction with a (named) submit button, which seems to be missing in your originally posted question/code.

Plus, you have two undefined variables:

$mine and $flygt, so you'll need to define those to fit your needs.

I.e.: if(isset($_POST['submit'])) and <input type="submit" name="submit" value="Send">

Sidenote: It's best to check for empty fields, but that's another topic; see my footnotes.

Tested and working, and receiving all info and I've replaced your present mail function with if(mail($to, $subject, $emailBody, $headers)){...}

<form id='SimpleEcommCartCartForm' action="" method="post">

      <div id="emailForm">
        <p>Please fill out the form below and one of our associates will contact you with more information.</p>
        <div class="col-xs-4">
           Name: <input type="text" name="name" id="name">
        </div>
        <div class="col-xs-4">
          E-mail: <input type="email" name="email" id="email">
        </div>
        <div class="col-xs-4">
           Phone: <input type="tel" name="phone" id="phone">

<input type="submit" name="submit" value="Send">
        </div>


      </div>

    </form>

<?php
//Send the email

if(isset($_POST['submit'])){
 $to = "[email protected]";
 $name = $_POST['name'] ; 
 $from = $_POST['email'] ; 
 $phone = $_POST['phone'] ; 
 $headers = "MIME-Version: 1.0\n";
 $headers .= "Content-type: text/html; charset=iso-8859-1\n";
 $headers .= "From: $from"; 
 $subject = "Pump Part Inquiry";

 // $mine = " Mine variable"; // replace this
 // $flygt = " Flygt variable"; // replace this


 $emailBody = "
  <html>
      <head>
        <style>
        </style>
      </head>
      <body>
        <h1> Pump Inquiry</h1>
        <h3>From:".$name."<h3>
        <h3>Phone:".$phone."<h3>
        <p>Minetuff Parts".$mine."</p>
        <p>Flygt Parts".$flygt."</p>
      </body>
  </html>";



// $send = mail($to, $subject, $emailBody, $headers);

if(mail($to, $subject, $emailBody, $headers)){
  echo "Mail sent.";
}

else{
  echo "Sorry, something went wrong.";
}

} // brace for if(isset($_POST['submit']))

?>

If you're still having problems:

Add error reporting to the top of your file(s) right after your opening <?php tag, which will help during production testing.

error_reporting(E_ALL);
ini_set('display_errors', 1);

Footnotes:

You are open to XSS attacks (Cross-site scripting).

Use the following (PHP) filter function: FILTER_SANITIZE_FULL_SPECIAL_CHARS

$name = filter_var($_POST['name'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);

Equivalent to calling htmlspecialchars() with ENT_QUOTES set. Encoding quotes can be disabled by setting.


To check for empty fields, you can add this below if(isset($_POST['submit'])){

if(empty($_POST['name']) || empty($_POST['email']) || empty($_POST['phone'])){
  echo "Fill out all the fields";
exit;
}

|| means "OR", which could very well be replaced by OR if you want, however || has precedence over OR.

This is a very basic method; there are other ways of accomplishing this, but you get the gist of it.

Upvotes: 2

SpencerX
SpencerX

Reputation: 5723

The issue here is that the mail is sent before the submit since you didn't test of the existence of $_POST variables, try something like this:

 <form id='SimpleEcommCartCartForm'  action="" method="post">
        <input type="hidden" name="action" value="mailing"/>
      <div id="emailForm">
        <p>Please fill out the form below and one of our associates will contact you with more information.</p>
        <div class="col-xs-4">
           Name: <input type="text" name="name" id="name">
        </div>
        <div class="col-xs-4">
          E-mail: <input type="email" name="email" id="email">
        </div>
        <div class="col-xs-4">
           Phone: <input type="tel" name="phone" id="phone">
        </div>
        <input name="submit" type="submit"/>

      </div>


    </form>

<?php
if(isset($_POST['mailing'])){
// Send the email
 $to = "[email protected]";
 $name = $_POST['name'] ; 
 $from = $_POST['email'] ; 
 $phone = $_POST['phone'] ; 
 $headers = "MIME-Version: 1.0\n";
 $headers .= "Content-type: text/html; charset=iso-8859-1\n";
 $headers .= "From: $from"; 
 $subject = "Pump Part Inquiry"; 


 $emailBody = "
  <html>
      <head>
        <style>
        </style>
      </head>
      <body>
        <h1> Pump Inquiry</h1>
        <h3>From:".$name."<h3>
        <h3>Phone:".$phone."<h3>
        <p>Minetuff Parts".$mine."</p>
        <p>Flygt Parts".$flygt."</p>
      </body>
  </html>";



 $send = mail($to, $subject, $emailBody, $headers); 

}

 ?>

Upvotes: 0

Related Questions