只有在发布到同一页面的表单上单击提交后才将数据发送到数据库
Sending data to database only after submit has been clicked on a form that posts to same page
我有一个发布到同一页面的表单,因为我需要在单击提交后在下方显示值,它确实如此。问题是,一旦页面加载完毕,php 就会运行并立即将数据发送到数据库,因此它会向数据库发送一个空值,因为用户没有提交任何内容。
$servername = "localhost";
$username = "my_username";
$password = "my_password";
$dbname = "my_database";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO my_table (firstname)
VALUES (:firstname)");
$stmt->bindParam(':firstname', $firstname);
// insert a row
$firstname = $name;
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
<form method="post" id="nick-form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name" value="<?php echo $name;?>">
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>Your Input:</h2>";
echo $name;
?>
如果可能,我希望 $name 变量仅在用户点击提交时发送。
你有一个可能的检查子句和一个使用
的 if 语句
if (count($_POST) > 0) {
//code runs if POST is submitted data
if (!empty($_POST['name'])){
///process the name form field value
}
}
这会解决您的问题,但是当用户刷新页面时,刷新后的页面也会重新提交 POSTED 数据 ,这就是为什么在数据库 activity 页面上 HIGHLY 建议将数据发送到另一个页面,然后一旦数据被保存,return 浏览器将原始页面,因此刷新原始页面不会重新提交 POSTED 数据
为了进一步说明,创建另一个名为 "save.php" 的 PHP 文件,将 PHP 标签中的所有内容放在 <form>
元素上方,放入 save.php文件,然后将表格设置为转到 save.php,并在 save.php 的底部将 header("location:formpage.php");die();
设置为 return 表格。
您仍然需要在表单页面上调用数据库以显示所需的输出。但这将阻止在页面刷新时重新提交数据
你可以使用 if :
if(isset($_POST['name']) && $_POST['name'] != null) {
// Your code
}
你还应该检查 $_POST['submit'].
"I would like the $name variable to only get sent when the user hits submit, if possible."
在提交按钮中使用条件 isset()
。
<?php
if(isset($_POST['submit']))
{
// code to execute
}
旁注:您 could/should 也在您的输入中添加了一个 !empty()
,强烈建议这样做以防止空提交。
您还可以在成功提交后实现 header 以重定向到另一个页面:
header('Location: http://www.example.com/');
exit; // avoid further execution of code, if any resides below that
如果您打算使用它,请确保您没有在 header 之前输出。
这里有一篇关于 Stack 的文章:
还有一篇关于如何使用会话和令牌防止多次提交的好文章:
我过去成功使用过的东西可能会有用。
我有一个发布到同一页面的表单,因为我需要在单击提交后在下方显示值,它确实如此。问题是,一旦页面加载完毕,php 就会运行并立即将数据发送到数据库,因此它会向数据库发送一个空值,因为用户没有提交任何内容。
$servername = "localhost";
$username = "my_username";
$password = "my_password";
$dbname = "my_database";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters
$stmt = $conn->prepare("INSERT INTO my_table (firstname)
VALUES (:firstname)");
$stmt->bindParam(':firstname', $firstname);
// insert a row
$firstname = $name;
$stmt->execute();
echo "New records created successfully";
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
<form method="post" id="nick-form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name" value="<?php echo $name;?>">
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>Your Input:</h2>";
echo $name;
?>
如果可能,我希望 $name 变量仅在用户点击提交时发送。
你有一个可能的检查子句和一个使用
的 if 语句 if (count($_POST) > 0) {
//code runs if POST is submitted data
if (!empty($_POST['name'])){
///process the name form field value
}
}
这会解决您的问题,但是当用户刷新页面时,刷新后的页面也会重新提交 POSTED 数据 ,这就是为什么在数据库 activity 页面上 HIGHLY 建议将数据发送到另一个页面,然后一旦数据被保存,return 浏览器将原始页面,因此刷新原始页面不会重新提交 POSTED 数据
为了进一步说明,创建另一个名为 "save.php" 的 PHP 文件,将 PHP 标签中的所有内容放在 <form>
元素上方,放入 save.php文件,然后将表格设置为转到 save.php,并在 save.php 的底部将 header("location:formpage.php");die();
设置为 return 表格。
您仍然需要在表单页面上调用数据库以显示所需的输出。但这将阻止在页面刷新时重新提交数据
你可以使用 if :
if(isset($_POST['name']) && $_POST['name'] != null) {
// Your code
}
你还应该检查 $_POST['submit'].
"I would like the $name variable to only get sent when the user hits submit, if possible."
在提交按钮中使用条件 isset()
。
<?php
if(isset($_POST['submit']))
{
// code to execute
}
旁注:您 could/should 也在您的输入中添加了一个 !empty()
,强烈建议这样做以防止空提交。
您还可以在成功提交后实现 header 以重定向到另一个页面:
header('Location: http://www.example.com/');
exit; // avoid further execution of code, if any resides below that
如果您打算使用它,请确保您没有在 header 之前输出。
这里有一篇关于 Stack 的文章:
还有一篇关于如何使用会话和令牌防止多次提交的好文章:
我过去成功使用过的东西可能会有用。