Form post-back

PHP programming forum. Ask questions or help people concerning PHP code. Don't understand a function? Need help implementing a class? Don't understand a class? Here is where to ask. Remember to do your homework!

Moderator: General Moderators

Post Reply
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Form post-back

Post by rickytenzer »

Hi fellas,

I have a consultation form on my website that I've added a few verifications to. The problem is, now that I have these verifications, the client would lose the entire form if they submitted erroneous information into the three required fields.

I would like it so that if they happen to make a mistake that they do not lose all the information that they have already given.

Some people have given me some advice:

Code: Select all

<input name="name" type="text" value="<?=htmlspecialchars($_POST['name'])?>" size="27px">
However, this doesn't seem to be working. It seems as though the info stored in 'name' is gone by the time the browser gets to this point.

Here's a link to my zipped code: http://www.dermamode.com/appointment.zip

Any help would be appreciated!
alex.barylski
DevNet Evangelist
Posts: 6267
Joined: Tue Dec 21, 2004 5:00 pm
Location: Winnipeg

Re: Form post-back

Post by alex.barylski »

You need to use a self-posting form approach or use SESSION's

index.php

Code: Select all

<?php
  if($_GET['action'] == true){
    // TODO: Now when you access $_POST data it should work fine.
  }
?>
<html>
  <body>
    <form action="index.php?action=true">
     <input type="text" name="fname" value="<?php echo $_POST['fname']; ?>" />
     <button type="submit">Send Data</button>
    </form>
  </body>
</html>
Not the most elegant solution, but that is the simplest way to express the general idea behind postback.
User avatar
Luke
The Ninja Space Mod
Posts: 6424
Joined: Fri Aug 05, 2005 1:53 pm
Location: Paradise, CA

Re: Form post-back

Post by Luke »

Well this won't work if you don't have PHP short tags on (short tags are the devil). Try this instead:

Code: Select all

<form method="post" action="#"> <!-- make sure form is posting via post and its posting back to this page -->
<input name="name" type="text" value="<?php echo htmlspecialchars($_POST['name'], ENT_QUOTES); ?>" size="27">
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

The Ninja Space Goat wrote:Well this won't work if you don't have PHP short tags on (short tags are the devil). Try this instead:

Code: Select all

<form method="post" action="#"> <!-- make sure form is posting via post and its posting back to this page -->
<input name="name" type="text" value="<?php echo htmlspecialchars($_POST['name'], ENT_QUOTES); ?>" size="27">
Not working! What exactly are PHP short tags? All I can tell you is that within my HTML code (my main PHP code is outside of the HTML code) I have a small piece of PHP code that echos a confirmation message:

Code: Select all

<?php
if(isset($_GET['msg']))
{
$msg=$_GET['msg'];
echo $msg;
}
?>
This code works.

Did you take a look at my code?

Thanks
User avatar
Luke
The Ninja Space Mod
Posts: 6424
Joined: Fri Aug 05, 2005 1:53 pm
Location: Paradise, CA

Re: Form post-back

Post by Luke »

No I did not take a look at your code. I rarely download zip files that people post on forums. If you want me to look at your code, post it here. I can tell that you didn't try my code though because if $_GET is working, obviously you didn't ensure that you are posting via the POST method instead of GET. make sure your form tag opens like this:

Code: Select all

<form method="POST" action="#">
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

Code: Select all

<form action="appointment.php" method="post">
That's how it is right now. I'm going post bits of my code.

...

Code: Select all

<?php
    $name="";
            $email="";
            $phone="";
            $choice="";
            $treatment="";
            $address="";
            $message="";
            $latex="";
            $medication="";
            $medication1="";
            $accutane="";
            $accutane1="";
            $accutane2="";
            $pregnant="";
            $breast="";
            $tanning="";
            $tanning1="";
            $particular="";
            $herpes="";
            $color_area="";
            $hair_color="";
            $eye_color="";
            $shade="";
            $tanned="";
            $sun="";
            $methods="";
            $strerr ="";
    if(isset($_POST['name']))
        {
            $name=$_POST['name'];
            $email=$_POST['email'];
            $phone=$_POST['phone'];
            $choice=$_POST['choice'];
            foreach($_POST['treatment'] as $value) { 
$treatment .= "$value<br>"; 
}
            $address=$_POST['address'];
            $message = $_POST['message'];
            $latex=$_POST['latex'];
            $medication=$_POST['medication'];
            $medication1=$_POST['medication1'];
            $accutane=$_POST['accutane'];
            $accutane1=$_POST['accutane1'];
            $accutane2=$_POST['accutane2'];
            $pregnant=$_POST['pregnant'];
            $breast=$_POST['breast'];
            $tanning=$_POST['tanning'];
            $tanning1=$_POST['tanning1'];
            foreach($_POST['particular'] as $value) { 
$particular .= "$value<br>"; 
}
            $herpes=$_POST['herpes'];
            $color_area=$_POST['color_area'];
            $hair_color=$_POST['hair_color'];
            $eye_color=$_POST['eye_color'];
            $shade=$_POST['shade'];
            $tanned=$_POST['tanned'];
            $sun=$_POST['sun'];
            foreach($_POST['methods'] as $value) { 
$methods .= "$value<br>"; 
}
if(strlen($name) < 1)
{
$strerr= "You must fill in all the required fields!";
header('location:appointment.php?msg='.$strerr);
}
else if(strlen($email) < 1)
{
$strerr= "You must fill in all the required fields!";
header('location:appointment.php?msg='.$strerr);
}
else if(strlen($phone) < 1)
{
$strerr= "You must fill in all the required fields!";
header('location:appointment.php?msg='.$strerr);
}
else if(strlen(preg_replace("/\D/",'',$phone)) != 10)
{
$strerr= "Your phone number must be 10 digits.";
header('location:appointment.php?msg='.$strerr);
}
else if(checkEmail($email) == FALSE) 
{
$strerr= "Invalid e-mail address. Please try again!";
header('location:appointment.php?msg='.$strerr);
} 
else
{
$address = nl2br($address);
$message = nl2br($message);
$medication1 = nl2br($medication1);
$from = $email;
$to = "info@dermamode.com";
$subject = "Appointment Request";           
$strMsg = "<table cellspacing=20 width=100%>
...

Code: Select all

$html_en=1; 
                            
function sendMail($to,$subject,$strMsg,$from,$html_en)
        {
//echo $strMsg,$from,$html_en;
if($html_en==1)
{
$headers = "From: $from \nContent-type: text/html; charset=utf-8\n";
}
else
{
$headers = "From: $from \n";
}
if(mail($to,$subject,$strMsg,$headers))
{
//$strerr= "Mail sent to ". $adm;
$strerr= "Appointment request successful!";
header('location:appointment.php?msg='.$strerr);
}
else
{
$strerr= "Sorry, unable to deliver request.";
header('location:appointment.php?msg='.$strerr);
}
}
 
sendMail($to,$subject,$strMsg,$from,$html_en);
}
}
print_r($_POST);

Code: Select all

<form action="appointment.php" method="post">
<table width="20%" border="0" align="center">
                                                    <TR>
                                                      <TD width="139" align="left" valign="middle"bgColor="#ffffff"><div align="left"><br>
                                                              <img src="../images/Name.png" alt="Name" width="52" height="15"><br>
                                                              <br>
                                                      </div></TD>
                                                      <TD width="482" valign="middle" bgColor="#ffffff"><div align="left">
                                                          <input name="name" type="text" value="<?=htmlspecialchars($_POST['name'])?>" size="27px">
                                                      </div></TD>
                                                  </TR>
...

Code: Select all

<TR valign="middle" bgcolor="#FFFFFF" height="70">
                                                      <TD colspan="2" align="center"><div align="center" class="style53">
                                                          <input type="image" value="submit" src="appointment.jpg">
                                                      </div></TD>
                                                    </TR>
                                                </TABLE></form></TD>
User avatar
Luke
The Ninja Space Mod
Posts: 6424
Joined: Fri Aug 05, 2005 1:53 pm
Location: Paradise, CA

Re: Form post-back

Post by Luke »

Why are you redirecting to the page instead of simply posting to itself? Do you understand the code you are using? If you don't, then try something a little less complicated until you understand it.

Code: Select all

<?php
if ($_POST['action'] == "send") {
    // pseudo-code - do not copy and paste this - you'll have to ACTUALLY do what I'm emulating
    if (!empty($_POST['name'] && strlen($_POST['name']) > 3) {
        $msg = "You have successfully sent your email.";
    } else {
        $msg = "There were errors in your submission";
    }
}
 
if (isset($msg)) echo "<p>" . $msg . "</p>";
?>
 
<form method="post" action="#">
  <input type="hidden" name="action" value="send">
  <div>Name: <input type="text" name="name" value="<?php if (isset($_POST['name'])) echo htmlentities($_POST['name'], ENT_QUOTES); ?>">
</form>
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

To be completely honest, I'm a complete newbie here. I'm working on my dad's website that was created for us. I'm quite good at computers and I learn quickly, but I'm definitely not a pro so far.

Could you explain what you just showed me?
User avatar
Luke
The Ninja Space Mod
Posts: 6424
Joined: Fri Aug 05, 2005 1:53 pm
Location: Paradise, CA

Re: Form post-back

Post by Luke »

Sure can... you see, your script actually redirects back to the script you are rendering, and by doing so it loses all the $_POST variables on the way. My script posts directly back to itself, and so the $_POST variables are there. So take a look below I have added comments to describe what is happening...

Code: Select all

<?php
if ($_POST['action'] == "send") { // if there is an index called "action" in the POST array with a value of "send" this means the form has been posted. We know this because we put that in a hidden field in the form below(see the hidden field down there?)
    // this is where you'd perform your validation... if all of the $_POST variables didnt pass your tests, you'd assign an error message to $msg for display
    if (!empty($_POST['name'] && strlen($_POST['name']) > 3) {
        $msg = "You have successfully sent your email.";
    } else {
        // if the POST vars pass your validation, then assign a confirmation message to $msg
        $msg = "There were errors in your submission";
    }
}
// if we have a $msg to display, display it.
if (isset($msg)) echo "<p>" . $msg . "</p>";
?>
<!-- this uses # as the action because that will make it post back to THIS page -->
<form method="post" action="#">
  <!-- this is so we know whether or not the form has been submitted -->
  <input type="hidden" name="action" value="send">
  <!-- You will notice that I checked that $_POST['name'] was set before trying to output it. This is because PHP will issue a NOTICE (or is it a warning?) if you try to use a variable that hasnt been assigned. If this form has not been posted, than $_POST['name'] wont exist and PHP will issue the NOTICE. You have to use htmlentities to avoid XSS attacks -->
  <div>Name: <input type="text" name="name" value="<?php if (isset($_POST['name'])) echo htmlentities($_POST['name'], ENT_QUOTES); ?>">
</form>
 
Try copying and pasting this code into a file called test.php and play around with it a bit.
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

I got most of what you were saying. I replaced the "action="appointment.php"" with "appointment="#"" in my code to keep the values stored. I'm having difficulty seeing why it shouldn't work now?

Is there a way we could communicate via MSN?
User avatar
Luke
The Ninja Space Mod
Posts: 6424
Joined: Fri Aug 05, 2005 1:53 pm
Location: Paradise, CA

Re: Form post-back

Post by Luke »

Your problem is that you are redirecting. Don't redirect...

Code: Select all

if(strlen($name) < 1)
{
$strerr= "You must fill in all the required fields!";
header('location:appointment.php?msg='.$strerr); // this is redirecting... not necessary
}
else if(strlen($email) < 1)
{
$strerr= "You must fill in all the required fields!";
header('location:appointment.php?msg='.$strerr); // this is redirecting... not necessary
}
else if(strlen($phone) < 1)
{
$strerr= "You must fill in all the required fields!";
header('location:appointment.php?msg='.$strerr); // this is redirecting... not necessary
}
else if(strlen(preg_replace("/\D/",'',$phone)) != 10)
{
$strerr= "Your phone number must be 10 digits.";
header('location:appointment.php?msg='.$strerr); // this is redirecting... not necessary
}
else if(checkEmail($email) == FALSE)
{
$strerr= "Invalid e-mail address. Please try again!";
header('location:appointment.php?msg='.$strerr); // this is redirecting... not necessary
}
Remove those lines and see what happens
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

Wow! WORKS! I removed all the "headers" commands, and it works!

However, my problem now is that I need to allow it to send the email. For now it isn't working.

You can try it at http://www.dermamode.com/en/appointment.php

Thanks so much!
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

I FIXED IT! All I did was remove all the headers completely and just echoed "$strerr", and it's fine now! Thanks SO much man. Really appreciate it.

My latest problem is being able to store the textarea, checkbox, and radio information. Any help?
rickytenzer
Forum Newbie
Posts: 8
Joined: Mon Mar 10, 2008 5:30 pm

Re: Form post-back

Post by rickytenzer »

You REALLY helped a lot. I fixed everything. THANKS!
Post Reply