只有在发布到同一页面的表单上单击提交后才将数据发送到数据库

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 的文章:


还有一篇关于如何使用会话和令牌防止多次提交的好文章:

我过去成功使用过的东西可能会有用。