首页 > 解决方案 > 如何防止 SQL 表中的重复项?

问题描述

我有一个电子邮件列表页面,其中包含一个输入栏和一个按钮,用户可以使用它来加入我的时事通讯。下面的 php 成功地将用户的电子邮件添加到 SQL 数据库中的表中。

一旦用户输入他们的电子邮件并单击按钮,用户就会被重定向到一个确认页面,让他们知道他们的电子邮件已发送到数据库。

提交输入后刷新页面时出现我的问题。我注意到刷新此确认页面会将相同的电子邮件项目发送到数据库,创建一个副本(或者如果页面刷新 7 次,则有 7 个重复项)。

为了防止这种情况发生,以及一般防止重复的表项,可以在我的下面的 php 代码中添加什么?

旁注:我刚刚开始学习 php、pdo 和 mysql,所以如果我的代码中缺少您推荐的任何内容(进一步保护 sql 注入,),请告诉我和/或附上来源在那里我可以找到进一步的阅读材料。谢谢你。:)

<?php 
$dbHost = "";
$dbUser = "";
$dbPassword = "";
$dbName = "";

try {
  $dsn = "mysql:host=" . $dbHost . ";dbname=" . $dbName;
  $pdo = new PDO($dsn, $dbUser, $dbPassword);
} catch(PDOException $e) {
  echo "DB Connection Failed: " . $e->getMessage();
}

$status = "";
if($_SERVER['REQUEST_METHOD'] == 'GET') {
  $email = $_GET['email'];

  if(!filter_var($email, FILTER_VALIDATE_EMAIL))  {
      $status = "Please enter a valid email<br/>(no space at the end)";
    } else {

      $sql = "INSERT IGNORE INTO contactinfo (email) VALUES (:email)";

      $stmt = $pdo->prepare($sql);
      
      $stmt->execute(['email' => $email]);

      $status = "Success! Please click the confirmation link in the email I've sent you. It will expire in 12 hours.";
      $email = "";
    }
  }
?>

标签: phpmysqlinputpdoduplicates

解决方案


推荐阅读