Form $_POST is empty (sometimes) but raw post data is fine - php

Heres my form:
<form method="POST" enctype="multipart/form-data" action="/my-account/update">
<select name="userType" class="form-control" >
<option value="0">0</option>
<option value="1">1</option>
<option value="2" selected="selected">2</option>
</select>
<select name="userIsInSearch" class="form-control" >
<option value="1" selected="selected">1</option>
<option value="0">0</option>
</select>
<input type="text" class="form-control" id="fwn" name="signupfname">
<input type="text" class="form-control" id="sn" name="signupsname">
<input type="text" class="form-control" id="usrf" name="signupemail">
<input type="password" class="form-control" id="pwdf" name="signuppass">
<input type="password" class="form-control" id="pwdfc" name="signuppassconf">
<input type="submit" value="Update!" class="btn btn-green" />
</form>
I've noticed that 9/10 the form POSTs completely fine but sometimes it has a problem, I've noticed this on another form on the website too and I cant figure out what is causing it.
I have found a way to make the problem happen everytime, by simply typing "alert(" (without quotations) into any of the input fields causes the entire POST to be empty but php://input is fine.
The system is in codeigniter and I have tried dumping $_POST and php://input at the top of the index.php file and have the same results so I dont think it is codeigniter causing it.
Any help or ideas greatly appreciated!

Related

My html form automatically passing all field data in url

I have created a simple html form but I have encountered a weird problem which I have never seen before. When I click on submit then all of the data is directly passing to the URL bar. I don't know what is wrong with this can anyone help?
Form:
<form id="form-data">
Name<br><input type="text" name="name" id="name" value=""><br><br>
Age<br><input type="number" name="number" id="age" value=""><br><br>
Gender<br>
<input type="radio" name="gender" value="Male">Male
<input type="radio" name="gender" value="Female">Fe-male<br><br>
<select name="country">
<option value="Kashmir">Kashmir</option>
<option value="Egypt">Egypt</option>
<option value="Norway">Norway</option>
<option value="Iceland">Iceland</option>
</select><br>
<br><input type="submit" id="submit" value="Save">
</form>
the form uses get method therefore it displays the form values in the url. change the method to post to avoid this
method="post"
<!DOCTYPE html>
<html>
<head>
<title></title>
<body>
<form id="form-data" method="post">
Name<br><input type="text" name="name" id="name" value=""><br><br>
Age<br><input type="number" name="number" id="age" value=""><br><br>
Gender<br>
<input type="radio" name="gender" value="Male">Male
<input type="radio" name="gender" value="Female">Fe-male<br><br>
<select name="country">
<option value="Kashmir">Kashmir</option>
<option value="Egypt">Egypt</option>
<option value="Norway">Norway</option>
<option value="Iceland">Iceland</option>
</select><br>
<br><input type="submit" id="submit" value="Save">
</form>
</body>
</html>
Add method attribute to your form tag like this:
<form action="welcome.php" method="post">
https://www.w3schools.com/tags/att_form_method.asp
If you don't send the data somewhere, it gets passed as URL parameters to the current page:
From MDN Web Docs:
The action attribute defines where the data gets sent. Its value must
be a valid relative or absolute URL. If this attribute isn't provided,
the data will be sent to the URL of the page containing the form — the
current page.

Cannot echo variables after form submittiom

So I am submitting a form to the same page. I have used the following code to check whether the form was submitted, and to avoid 'undefined variables' errors during the first page reload.
if (isset($_POST['submit'])){
// Get search variables
$pName = $_POST['pname'];
$pLocation = $_POST['plocation'];
$pPrice = $_POST['pprice'];
if (isset($_POST['ptype'])){
$pType = $_POST['ptype'];
}
echo "pType";
}
However, I cannot echo the php variables onto the page. I am guessing this is because the form is refreshed when it is sent by post, so the variables are lost.
How can I fix this problem?
This is the html form
<form method="post" action="../html/searchpage.php">
<div id="searchborder">
<input type="text" id="pname" name="pname" placeholder=" Property name">
<input type="text" id="plocation" name="plocation" placeholder=" Property location">
<input type="number" id="pprice" name="pprice" placeholder=" Property price">
<div id="ptypeholder">
<div id="ptypebox">
<select name="ptype">
<option value="" disabled selected>Post type</option>
<option value="buy">Buy</option>
<option value="rent">Rent</option>
</select>
</div>
</div>
<button type="submit"><img src="../images/search.png"></button>
</div>
</form>
I am trying to display 'property posts' into html cards from a database using php in this page. The form is the search bar for the property posts.
Thanks!
I don't think $_POST['submit'] is being set because the button needs a name ie
<input type="submit" name="submit" value="submit">
also you have a few other syntax errors, structure, may be this will help :-
<form method="post" action="searchpage.php">
<input type="text" id="pname" name="pname" placeholder="Property name">
<input type="text" id="plocation" name="plocation" placeholder="Property location">
<input type="number" id="pprice" name="pprice" placeholder="Property price">
<select name="ptype">
<option value="" disabled selected>Post type</option>
<option value="buy">Buy</option>
<option value="rent">Rent</option>
</select>
<input type="submit" name="submit" value="submit">
and you don't HAVE to assign the post values to $vars you can use them directly -
<?php
if (isset($_POST['submit'])){
// Get variables
//$pName = $_POST['pname'];
//$pLocation = $_POST['plocation'];
//$pPrice = $_POST['pprice'];
echo $_POST['ptype'].'<br>';
echo $_POST['pname'].'<br>';
echo $_POST['plocation'].'<br>';
echo $_POST['pprice'].'<br>';
}
?>
Needs more work to make it check all posts are set or validation but works as a basic starting point
Also in original you posted echo "pType"; will only echo the text pType not the value

Reading Data from two PHP pages into the third Page

I'm not able to combine the data from two pages. I'm only able to show data from one page. I tried searching for an explanation of my problem on google but I could not find it.
I get an "Undefined index" error as you can see [![in this screenshot][1]][1].
Could not put just code over here because it keeps telling me that I need to use spacing with ctrl + K and im newbie in all this things so please forgive me..
<!DOCTYPE html>
<html>
<head>
<title>TEST</title>
</head>
<body>
<form action = "page2.php" method = "POST">
<select list="Country" placeholder="Country" name="country" required class="form-control" style="max-width:250px; margin-top:50px;" id="Country">
<option >Bosnia & Herzegovina</option>
<option >Croatia</option>
<option >Serbia</option>
<option >England</option>
<option >Germany</option>
<option >Austria</option>
<option >Belgium</option>
<option >Switzerland</option>
<option >Italy</option>
<option >Romania</option>
<option >France</option>
<option >Montenegro</option>
<option >Slovenia</option>
</select>
<input type="email" name="email" id="email" placeholder="Your email address" required class="form-control" style="max-width:250px;" />
<input type="password" name="password" id="creapass" placeholder="Create your password" required class="form-control" style="max-width:250px;" />
<input type="password" name="password2" id="password" placeholder="Confirm your password" required class="form-control" style="max-width:250px;" />
<input type="button" value="Next" class="btn btn-primary" style="width:150px;">
</form>
</body>
</html>
Second Page
<!DOCTYPE html>
<html>
<head>
<title>test2</title>
</head>
<body>
<form action = "finalpage.php" method = "POST">
<!-- Values from First Step -->
<input type="hidden" name="country" value="<?php $_POST['country'] ?>">
<input type="hidden" name="email" value="<?php $_POST['email'] ?>">
<input type="hidden" name="password" value="<?php $_POST['password'] ?>">
<input type="hidden" name="password" value="<?php $_POST['password2'] ?>">
<!-- End of Values from First Step -->
<?php
echo "Country:" .$_POST["country"]."</br>";
echo "Email:".$_POST["email"]."</br>";
echo "Password:".$_POST["password"]."</br>";
echo "Password2:".$_POST["password2"]."</br>";
?>
<input type="text" name="first" class="form-control" placeholder="First name" required style="max-width:250px;" >
<input type="text" name="last" class="form-control" placeholder="Last name" required style="max-width:250px;" />
<input type="date" name="date" class="dateb" id="dateOfBirth" required />
<select list="Country" placeholder="Country" name="country2" required class="form-control" style="max-width:250px; " id="Country">
<option >Bosnian</option>
<option >Croat</option>
<option >Serb</option>
<option >English</option>
<option >German</option>
<option >Austrian</option>
<option >Belgian</option>
<option >Swiss</option>
<option >Italian</option>
<option >Romanian</option>
<option >French</option>
<option >Montenegrin</option>
<option >Slovenian</option>
</select>
<input type="text" class="form-control" name="street1" placeholder="Street address 1" required style="max-width:250px;" />
<input type="text" class="form-control" name="street2" placeholder="Street address 2 (Optional)" style="max-width:250px;" />
<input type="text" class="form-control" name="city" placeholder="City" required style="max-width:250px;" />
<input type="text" class="form-control" name="region" placeholder="Province/Region" required style="max-width:250px;" />
<input type="text" class="form-control" name="postal" placeholder="Postal code" required style="max-width:250px;" />
<input type="tel" class="form-control" name="phone" placeholder="Phone number" required style="max-width:250px;" />
<input type="checkbox" name="terms" > I have read and agree to the Terms and WBC's User Agreement.
<input type="Submit" name="insert" value="Continue" class="btn btn-primary btn-lg">
</form>
</body>
</html>
Final Step.
<html>
<head>
<title>get data from another page</title>
</head>
<body>
<?php
echo "Country:" .$_POST["country"]."</br>";
echo "Email:".$_POST["email"]."</br>";
echo "Password:".$_POST["password"]."</br>";
echo "Password2:".$_POST["password2"]."</br>";
echo "First name:" .$_POST["first"]."</br>";
echo "Last name:".$_POST["last"]."</br>";
echo "Date:".$_POST["date"]."</br>";
echo "Country2:".$_POST["country2"]."</br>";
echo "Street1:" .$_POST["street1"]."</br>";
echo "Street2:".$_POST["street2"]."</br>";
echo "City:".$_POST["city"]."</br>";
echo "Region:".$_POST["region"]."</br>";
echo "Postal code:" .$_POST["postal"]."</br>";
echo "Phone number:".$_POST["phone"]."</br>";
?>
</body>
</html>
I am not copying the entire code of yours as it is not required. Below is the logic you have to follow.
In the first step, i.e. your first form (I prefer using PHP format as it allows you to use PHP functions, if required), put your second PHP in the form's action.
<form action = "step_2.php" method = "POST">
Now in your step_2.php, you have to add the below in your form.
<!-- Values from First Step -->
<input type="country" name="country" value="<?php echo $_POST['country'] ?>">
<input type="hidden" name="email" value="<?php echo $_POST['email'] ?>">
<input type="hidden" name="password" value="<?php echo $_POST['password'] ?>">
<!-- End of Values from First Step -->
Above code will add the values posted from the first step into your second step form. Now you can simply fetch these values in the final step. To do this, add your final step PHP in your Action of this form.
<form action = "final_step.php" method = "POST">
In your final_step.php, you can normally get the values by $_POST.
You've got a number of problems. First, your option fields don't have values.
What you have: <option>Bosnia</option>
What you need: <option value="bosnia" >Bosnia</option>
You should also have a default as your first option, otherwise your program is going to assume that everyone who doesn't pick something has the first option, and you are going to get a million submissions that are not accurate. Eg:
<option value="false" selected="selected">Please select an option from below</option>
Then your backend should be checking like this:
<?php
if (!isset($_POST['country'] || $_POST['country'] === 'false')
{
//They did not pick a country, and you need to bounce them back to the form with an error message.
header('Location: /path/to/your/form');
exit;
}
//country is defined, you can continue,
//but you should pre-validate the other required field here also.
//do not assume things are right, assumptions = bugs.
...
The anchor tag you have surrounding your submit button may be redirecting instead of submitting the form, in which case your $_POST will be completely empty. The below tag you have:
<input type="button" value="Next" class="btn btn-primary" style="width:150px;">
Needs to look more like this:
<input type="submit" value="Next" class="btn btn-primary" style="width:150px;">
Or alternately:
<button type="submit" class="btn btn-primary" style="width:150px;">Next</button>
If you are stumped, put this at the beginning of what you have on your processing code:
echo '<pre>' . print_r($_POST, 1); exit;
This will show you what was submitted, and let you work through from there as needed.
In general, your conditionals should check if a key exists before validating it if there is any ambiguity as to whether or not it is set:
//BAD
if ($_POST['country'] == 'someval') { ... }
//GOOD
if (array_key_exists('country', $_POST) && $_POST['country'] == 'someval') { ... }
You can also check with isset($_POST['country']); HOWEVER, if null values are valid for whatever you are checking, then this will return false, even if the key is there. So in any case where null is valid, you need to use array_key_exists() instead.
Instead of passing variables directly from one page to another, it's a lot easier if you use $_SESSION, so if they derp up and hit back or walk away for a while, the values are not entirely lost. Users hate having to redundantly redo things, and will probably entirely lose interest in your site if they have to do that. Instead, you can set the values if they exist into session memory like this:
<?php
session_start(); //you have to do this before printing ANY other content.
$_SESSION['country'] = (isset($_POST['country']) ? $_POST['country'] : null);
And then you can retrieve this at any time from any page by doing:
<?php
session_start();
echo $_SESSION['country'];
and if you want to clear them, you just do:
<?php
session_start(); //can't destroy a non-existent session, you have to do this first
session_destroy(); //clears the session
session_start(); //starts a new one
Stashing ongoing form values in the session temporarily lets you access them for as long as the session cookie lasts, so they are not lost if the user quits your form, goes to another site, then comes back to finish. Your form will have to put these back in manually though, so an input might look something like this
<input type="password" name="password" value="<?= isset($_SESSION) && isset($_SESSION['password'] ? $_SESSION['password'] : null; ?>" />
I tried to explain the relevant logic you are not applying rather than just the specific use case, because without actually grasping what the underlying lack of logic is, you would otherwise probably just hit the same wall again. Hopefully this saves you from a number of other bugs that you would otherwise likely hit immediately after this specific thing gets fixed for you.

Unable to post the form values without refreshing after changing option

I have a following form in my HTML code.
When I forget to fill in the surname,
the form will show me a "bubble message" You have to fill in the surname, then I
will fill in the surname, press the submit button and the values are submitted.
When I forget to change the default option from <select> the form will show
me a "bubble message" You have to choose something, then I will choose another option,
press the submit button, but the values are not submitted. I always have to refresh
the page. Do you know where is the problem and how to achieve it without refreshing?
<form action="add" method="post">
...
<select id="choice" name="choice"
required oninvalid="setCustomValidity('You have to choose something')"
oninput="setCustomValidity('')">
<option value="" selected="selected"></option>
<option value="first">first</option>
<option value="second">second</option>
</select>
...
<input type="text" name="surname" id="surname" value=""
required oninvalid="setCustomValidity('You have to fill in the surname')"
oninput="setCustomValidity('')">
...
</form>
There is no problem with the form data submitting as you will see from this jsfiddle example:
http://jsfiddle.net/vbnh1a4y/
<form action="/echo/html" method="post">
<select id="choice" name="choice">
<option value="" selected="selected"></option>
<option value="first">first</option>
<option value="second">second</option>
</select>
<input type="text" name="surname" id="surname" value="" />
<input type='submit' />
</form>

PHP action / salesForce

I have been asked to update a contact form, i always leave action blank(action="") in any forms i have worked on before. I have been sent the following form as seen below. When the form is submitted, it is sent to the url, which is a blank screen. Has anyone implemented a salesForce contact form before ?
<form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">
<input type=hidden name="oid" value="00D200000005wgb">
<input type=hidden name="retURL" value="http://"> <!-- add URL of completed page here
-->
<label for="first_name">First Name</label><input id="first_name" maxlength="40" name="first_name" size="20" type="text" /><br>
<label for="last_name">Last Name</label><input id="last_name" maxlength="80" name="last_name" size="20" type="text" /><br>
<label for="email">Email Address</label><input id="email" maxlength="80" name="email" size="20" type="text" /><br>
<label for="phone">Phone</label><input id="phone" maxlength="40" name="phone" size="20" type="text" /><br>
<select id="country" name="country" title="country">
<option value="London">London</option>
<option value="Midlands">Midlands</option>
<option value="North England">North England</option>
<option value="South England">South England</option>
<option value="Wales">Wales</option>
<option value="Scotland">Scotland</option>
<option value="Northern Ireland">Northern Ireland</option>
</select><br>
<textarea id="00N200000016Kk5" name="00N200000016Kk5" rows="4" type="text" wrap="soft"></textarea><br>
<!-- Below 3 fields are hidden -->
<select id="recordType" name="recordType" style="display:none;">
<option value="012w0000000QCbe">Prospect UK</option></select>
<select id="00N20000001L8Pi" name="00N20000001L8Pi" title="Web Source" style="display:none;"><option value="Download Whitepapers UK">Download Whitepapers UK</option> </select>
<select id="lead_source" name="lead_source" style="display:none;">
<option value="Download Whitepapers UK">Download Whitepapers UK</option></select>
<input type="submit" name="submit">
</form>
The action attribute of a <form> is basically a redirect for the form that sends the POST or GET data along with it.
If action is left blank, it redirects to the current URL, thus "refreshes".
If action is a link beginning with http:// or https://, the form sends the $_POST / $_GET request to the full page link.
If action is set to a link not beginning with http:// nor https://, the link set in the action is added to the current sub-directory in the same way a php include works.
Therefore, this in your code:
<form action="https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8" method="POST">
Will send a POST request to https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8

Categories