提问者:小点点

如何防止在PHP中点击chrome中的“重新加载此页面”时重复插入数据


这是使用PDO的连接

<?php 

session_start();

    include 'db_config.php';
    
    try {
        $conn = new PDO("mysql:host=localhost;dbname=$database","root","");
    // 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 users (name, username, 
    password) 
    VALUES (:name, :username, :password)");
        $stmt->bindParam(':name', $name);
        $stmt->bindParam(':username', $username);
        $stmt->bindParam(':password', $password);
    
    // insert a row
        $name = $_POST["name"];
        $username = $_POST["username"];
        $password = $_POST["password"];
        $stmt->execute();
    
    $query="select * from users";
    $d = $conn->query($query);
     
    }
    catch(PDOException $e)
    {
        echo "Error: " . $e->getMessage();
    }
    $conn = null;
    ?>

这是用户登记表

<form method="post">
      <div class="modal-body">
        <div class="form-group">
         
            
              <input type="text" name="username" placeholder="Enter Username" class="form-control">
              <br>
              <br>

               <input type="text" name="name" placeholder="Enter Name" class="form-control">
               <br>
               <br>

               <input type="password" name="password" placeholder="Enter Password" class="form-control">
         
        </div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary" name="save_user">Save changes</button>
      </div>

    </form>

这是桌子

<tbody>

        <?php foreach ($d as $data)
        {

        ?>

        <tr>
            <td><?php echo $data['users_id']?></td>
            <td><?php echo $data['username']?></td>
            <td><?php echo $data['name']?></td>
            </tbody>
        </tr>
        <?php
}
        ?>

此映像是用户注册表单

在chrome中点击“重新加载按钮”后的这张图片

大家好,如何修复这种错误。 如果管理员想要注册另一个用户,那么管理员将点击用户注册表单的按钮,一旦管理员点击按钮,管理员需要填写表单,然后管理员完成表单,然后点击保存按钮,将数据保存在“图像”2“中。想象一下,当用户点击chrome中的重新加载页面时,以前的数据复制到”图像3“中。如何防止这种情况呢?对不起,我是PHP初学者:)


共1个答案

匿名用户

在您的位置,我不会像这样将所有pdo查询放在一堆中,因为它将在每次您加载页面时运行。 向它们添加触发器,因为很明显,您希望这些查询仅在单击“保存”按钮时运行。

相反,可以将查询分开,这样做。 我可以看到您已经加载了db_config.php文件,那么为什么要再次配置db呢? 请随意使用下面的例子。

db_config.php

$host = 'localhost';
$db   = '';
$user = 'root';
$pass = '';
$charset = 'utf8';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
    \PDO::ATTR_ERRMODE            => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
    \PDO::ATTR_EMULATE_PREPARES   => false,
];

    $conn = new \PDO($dsn, $user, $pass, $opt);

现在,每次您加载这个文件时,您都有一个到数据库的连接。 所以你可以做这样的事。

<?php 

session_start();

include 'db_config.php';

if (isset($_POST['save_user'])) {
    $name = $_POST["name"];
    $username = $_POST["username"];
    $password = $_POST["password"];

    //Your sql query
    $sql = "INSERT INTO users (name, username, password) VALUES (:name, :username, :password)";

    // prepare sql and bind parameters
    $stmt = $conn->prepare($sql);

    //Set your parameters
    $params = ['name' => $name, 'username' => $username, 'password' => $password];

    // insert a row
    $stmt->execute($params);
}
 
function loadUsers()
{
    $query = "SELECT * FROM users";

    $d = $conn->query($query);
}

loadUsers();