php 脚本执行后如何保存用户在表单页面中输入的数据?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20471448/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to save the data that the user input in form page after the script executed?
提问by Jeff
may I know is it possible to save the data from the form which the user input earlier?
我可以知道是否可以从用户之前输入的表单中保存数据?
Here is the form file:
这是表单文件:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<title>Data</title>
<style type="text/css">
input {
background-color: #999;
border-style: solid;
border-color: #999;
border: 0px 4px 0px 4px;
padding: 3px 6px 3px 6px;
margin: 10px 0;
}
input:focus {
border-style: solid;
border-color: black;
}
</style>
</head>
<body>
<form action="count.php" method="post" action="post">
Name: <input type="text" name="customername" /><br />
DOB: <input type="text" name="date" /> <input type="text" name="month" /> <input type="text" name="year" /><br />
First Row: <input type="text" name="rowone" /><br />
Second Row: <input type="text" name="rowtwo" /><br />
Third Row: <input type="text" name="rowthree" /><br />
<input type="submit" value="Go" />
</form>
</body>
</html>
And here is the php that execute the form data that input by the user.
这是执行用户输入的表单数据的php。
<?php
$cname = $_POST['customername'];
$dob_date = $_POST['date'];
$dob_month = $_POST['month'];
$dob_year = $_POST['year'];
$year = gmdate("Y");
$month = gmdate("m");
$day = gmdate("d");
$age = $year - $dob_year; // $age calculates the user's age determined by only the year
if ($month < $dob_month) { // this checks if the current month is before the user's month of birth
$age = $age - 1;
} else if (
$month == $dob_month && $day >= $dob_date) { // this checks if the current month is the same as the user's month of birth and then checks if it is the user's birthday or if it is after it
$age = $age;
} else if ($month == $dob_month && $day < $dob_date) { //this checks if the current month is the user's month of birth and checks if it before the user's birthday
$age = $age - 1;
}
//add all initial data into an matrix variable for easier access to them later
//To access rowone use $rows[0][0], rowtwo $rows[1][0] ect.
//The matrix is an array which contains multiple array. eg. 2-dimensional arrays
//To get all the variables with $r1X simply retrieve the first array of the matrix eg $rows[0]
$rows = array(array($_POST['rowone']), array($_POST['rowtwo']), array($_POST['rowthree']), array());
//Similarities between row1 and row2 made me incoporate modulo value as an argument.
function incmod($a, $m) {
return ($a % $m) + 1;
}
//Population each row, with $populationCount number of elements, where each element is added with incmod(X, $mod)
function populateRow($rowId, $populationCount, $mod) {
//The global keyword is needed in order for the function to access the global variable.
global $rows;
$row = $rows[$rowId];
while (sizeof($row) < $populationCount) {
$rowInd = sizeof($row) - 1;
$m = incmod($row[$rowInd], $mod);
array_push($row, $m);
}
//Due to how php works with variables and references we need to set the row back into the global variable.
$rows[$rowId] = $row;
}
//This function makes sure that the values allways are between 1 and 12.
function bindToRange($v) {
if ($v == 0)
return 1;
return ($v - 1) % 12 + 1;
}
//Population the first three rows
populateRow(0, 7, 7);
populateRow(1, 12, 12);
populateRow(2, 12, 12);
//Creating the forth row by nested forloops.
//The first loop iterates over the entries in a row (in your example this would be the letters e.g r1a r1b ect)
//The second (inner) loop iterates of the rows (in you example this would be the number you had in your variables.)
//The sum over each of the three rows are added, then bound to 1-12 range, before being added to the forth row.
for ($cId = 0; $cId < 7; $cId++) {
$sum = 0;
for ($rId = 0; $rId < 3; $rId++) {
$sum += $rows[$rId][$cId];
}
array_push($rows[3], bindToRange($sum));
}
//Same as above, but for the last two remaining values. Should give a total of nine entries in the forth row.
for ($cId = 7; $cId < 12; $cId++) {
$sum = 0;
for ($rId = 1; $rId < 3; $rId++) {
$sum += $rows[$rId][$cId];
}
array_push($rows[3], bindToRange($sum));
}
function lower_than_2($var){
return ($var > 1);
}
$cssClassName = "match";
// array_count_values will count how many times each value is in the array
$cssBase = array_count_values($rows[3]);
// remove from array values that are lower than 2
$cssBase = array_filter($cssBase, "lower_than_2");
$cssNumber = array();
$cssCounter = 1;
// make $cssNumber be a mirror of $cssBase (same keys), but with serial values
foreach ($cssBase as $key => $value) {
$cssNumber[$key] = $cssCounter;
$cssCounter++;
}
unset($cssCounter);
// ------------------------------------------------
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="content-type" content="text/html" />
<title>Result</title>
<link rel="stylesheet" type="text/css" href="./css/style.css" />
</head>
<body>
Customer Name: <?php echo $cname; ?><br />
DOB: <?php echo $dob_date; ?> / <?php echo $dob_month; ?> / <?php echo $dob_year; ?><br />
<b><?php echo $age; ?></b> Years Old
<table>
<?php
//Instead of listing up (hard-coded) I've used nested forloops to generate the html.
//The loops are similar to the ones above, but use sizeof keyword to figure out how many iterations it needs.
$lines = sizeof($rows)+1; // $rows have 4 rows, we will need 1 more
for ($rId = 0; $rId < $lines; $rId++) {
echo "<tr>\n";
if($rId < 3){
$row = $rows[$rId];
$rowSize = sizeof($row);
for ($cId = 0; $cId < $rowSize; $cId++) {
echo "<td>" . $row[$cId] . "</td>\n";
}
} else if($rId == 3){
$row = $rows[$rId];
$rowSize = sizeof($row);
for ($cId = 0; $cId < $rowSize; $cId++) {
echo "<td"; // open td
// if the value is in cssBase array, we will apply a css class
if(array_key_exists($row[$cId], $cssBase))
echo ' class="'. $cssClassName . $cssNumber[$row[$cId]] .'"';
echo ">"; // close td
echo $row[$cId];
echo "</td>\n";
}
} else if($rId == 4){
for ($cId = 0; $cId < 12; $cId++) {
if($cId == (($age-1)%12)){
echo '<td>'. "$age Years Old" .'</td>'."\n";
} else {
echo "<td></td>\n";
}
}
}
echo "</tr>\n";
}
// ------------------------------------------------
?>
</table><br /><br />
<a href="./" target="_blank" title="Calculate Again">Calculate Again</a>
</body>
</html>
Is it possible to add a save button on the count.php page and the value will be the one that the user key in earlier in the form page. And the save button will echo "Data Saved" or if exist it will echo "Data Already Existed" whithin the same page. If yes, what is the method i need to use? I'm totally new as i search google, i couldnt find exactly the answer that i need. I already create table in mysql to store the data.
是否可以在 count.php 页面上添加一个保存按钮,该值将是用户在表单页面中较早键入的值。并且保存按钮将回显“数据已保存”,或者如果存在,它将在同一页面中回显“数据已存在”。如果是,我需要使用什么方法?我在谷歌搜索时完全是新手,我找不到我需要的确切答案。我已经在 mysql 中创建了表来存储数据。
The data that i want to store is the Date of Birth, rowone, rowtwo and row three. Create table in mysql with dob as date, rowone, rowtwo and rowthree as varchar (255) and id as int (11).
我要存储的数据是出生日期、第一行、第二行和第三行。在 mysql 中创建表,dob 作为日期,rowone、rowtwo 和 rowthree 作为 varchar (255) 和 id 作为 int (11)。
Here is my insertdata.php
这是我的 insertdata.php
<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "mama";
class dob {
public function set_dob($dob_date, $dob_month, $dob_year) {
$this->dob = $dob_date.'/'.$dob_month.'/'.$dob_year;
}
}
$con=mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
$sql="INSERT INTO profile (dob,rowone,rowtwo,rowthree) VALUES ('$_POST[dob]','$_POST[rowone]','$_POST[rowtwo]','$_POST[rowthree]')";
if (!mysqli_query($con,$sql))
{
die('Error: ' . mysqli_error($con));
}
echo "1 record added";
/* close connection */
$mysqli->close();
?>
and it shows error as below: Notice: Undefined index: dob in C:\xampp\htdocs\mama\inc\insertdata.php on line 18
它显示如下错误:注意:未定义索引:dob in C:\xampp\htdocs\mama\inc\insertdata.php on line 18
Notice: Undefined index: rowone in C:\xampp\htdocs\mama\inc\insertdata.php on line 18
注意:未定义索引:第 18 行 C:\xampp\htdocs\mama\inc\insertdata.php 中的 rowone
Notice: Undefined index: rowtwo in C:\xampp\htdocs\mama\inc\insertdata.php on line 18
注意:未定义索引:第 18 行 C:\xampp\htdocs\mama\inc\insertdata.php 中的 rowtwo
Notice: Undefined index: rowthree in C:\xampp\htdocs\mama\inc\insertdata.php on line 18 1 record added Notice: Undefined variable: mysqli in C:\xampp\htdocs\mama\inc\insertdata.php on line 27
注意:未定义索引:rowthree in C:\xampp\htdocs\mama\inc\insertdata.php on line 18 新增1条记录 注意: undefined variable: mysqli in C:\xampp\htdocs\mama\inc\insertdata.php on line 27
Fatal error: Call to a member function close() on a non-object in C:\xampp\htdocs\mama\inc\insertdata.php on line 27
致命错误:在第 27 行的 C:\xampp\htdocs\mama\inc\insertdata.php 中的非对象上调用成员函数 close()
回答by Yagi
To store data sent from your view page, I think you need to establish a connection between your application and your database MySQL first in your count.php, and then create a method to store your data.
要存储从您的视图页面发送的数据,我认为您需要先在您的 count.php 中建立您的应用程序和数据库 MySQL 之间的连接,然后创建一个方法来存储您的数据。
You might want to see this link :
您可能想查看此链接:
http://www.w3schools.com/php/php_mysql_insert.asp
http://www.w3schools.com/php/php_mysql_insert.asp
Hope it helps
希望能帮助到你
回答by SAnDAnGE
There are lots of ways to do this... using clientside libraries (jQuery, AngularJS, DOJO... etc) that can do validation using AJAX calls, or if you want to use plain html with php, you can use something similar to this:
有很多方法可以做到这一点......使用客户端库(jQuery、AngularJS、DOJO...等)可以使用 AJAX 调用进行验证,或者如果你想在 php 中使用纯 html,你可以使用类似于这个:
<form action="count.php" method="post" action="post">
Name: <input type="text" name="customername" value="<?php echo $prevCName; ?>" /><br />
DOB: <input type="text" name="date" value="<?php echo $prevDate; ?>" /> <input type="text" name="month" value="<?php echo $prevMonth; ?>" /> <input type="text" name="year" value="<?php echo $prevYear; ?>" /><br />
First Row: <input type="text" name="rowone" value="<?php echo $prevROne; ?>" /><br />
Second Row: <input type="text" name="rowtwo" value="<?php echo $prevRTwo; ?>" /><br />
Third Row: <input type="text" name="rowthree" value="<?php echo $prevRThree; ?>" /><br />
<input type="submit" value="Go" />
</form>
this form file must be a php file and you should make sure that the previous values are saved... either in $_SESSION or... in the previous file using includes... requires... etc.
这个表单文件必须是一个 php 文件,你应该确保以前的值被保存......在 $_SESSION 或......在前一个文件中使用包含......需要......等。
回答by Viridis
In the end you just want to do the following:
最后,您只想执行以下操作:
$con=mysqli_connect($host,$user,$password,$db);
$sql = "INSERT INTO tablename (dob,rowone,rowtwo,rowthree)
VALUES (".$_POST['customername'].",".$_POST['date'].",".$_POST['month'].",".$_POST['year'].");"
mysqli_query($con,$sql);
I'm using mysqli in my example. Way better approach is PDO of course: http://tw1.php.net/manual/en/book.pdo.php
我在我的例子中使用了 mysqli。更好的方法当然是 PDO:http: //tw1.php.net/manual/en/book.pdo.php
Eventually you will want security of course, so you'll be using prepared statements: http://php.net/manual/en/pdo.prepared-statements.php
最终你当然会想要安全性,所以你将使用准备好的语句:http: //php.net/manual/en/pdo.prepared-statements.php
回答by Onur
Maybe you can get what you want by using find('first') or find('all').
也许你可以通过使用 find('first') 或 find('all') 来得到你想要的东西。
$ex = $this->find('first' , array(
'condition' => array ('model_name.id' => 22 //specific id
)));
You can get any value from table/tables with specific location (id). To be more clear, ex: i th row's j th column's element.
您可以从具有特定位置 (id) 的表/表中获取任何值。更清楚地说,例如:第 i 行的第 j 列元素。

