使用PHP防止重复记录到表

时间:2013-10-31 18:46:13

标签: php mysql

我想使用PHP防止表单中的重复值进入数据库表。

我创建了以下内容:

包含名为客户

的表格的数据库
CREATE TABLE clients(
 firstName varchar(20),
 lastName varchar(20),
 primary key(firstName, lastName));

一个名为 form.html

的简单表单
<h2>Enter your First and Last Name</h2>
<form action="frm_script.php" method="post">
<p><strong>First Name:</strong><br /> <input type="text" name="firstName" /></p>
<p><strong>Last Name:</strong><br /> <input type="text" name="lastName"/></p>
<input type="submit" name="submit" value="Add Customer" />
</form>

名为 frm_script.php

的表单处理脚本
<?php
if(isset($_POST['submit']))
{

//get the name and comment entered by user
$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];

//connect to the database
$dbc = mysqli_connect('host', 'username', 'password', 'dbname') or die('Error connecting to MySQL server');

//insert results from the form input
$query = "INSERT IGNORE INTO clients(firstName, lastName) VALUES('$firstName', '$lastName')";

$result = mysqli_query($dbc, $query) or die('Error querying database.');

mysqli_close($dbc);
}
echo "Customer Added";
?>

到目前为止,通过我的 frm_script.php 文件,以上工作方式和唯一记录显示客户已添加。但是,对于重复记录,它会抛出“错误查询数据库”。

如何为以下内容更新 frm_script.php 脚本?

如果在输入名字/姓氏组合时发现重复行,则应显示消息“客户已列出”以及该记录。

如果在表单上输入First / Last名称组合时没有找到重复行,则应将该条目插入数据库并显示消息“customer added”

我已经读过应该首先运行SELECT然后运行INSERT但是我不确定如何将它实现到我现有的代码中。

4 个答案:

答案 0 :(得分:16)

  <?php
    if(isset($_POST['submit'])) {

    //get the name and comment entered by user
    $firstName = $_POST['firstName'];
    $lastName = $_POST['lastName'];

    //connect to the database
    $dbc = mysqli_connect('host', 'username', 'password', 'dbname') or die('Error connecting to MySQL server');
    $check=mysqli_query($dbc,"select * from clients where firstname='$firstname' and lastname='$lastname'");
    $checkrows=mysqli_num_rows($check);

   if($checkrows>0) {
      echo "customer exists";
   } else {  
    //insert results from the form input
      $query = "INSERT IGNORE INTO clients(firstName, lastName) VALUES('$firstName', '$lastName')";

      $result = mysqli_query($dbc, $query) or die('Error querying database.');

      mysqli_close($dbc);
    }
    echo "Customer Added";
    };
  ?>

只需在数据库中检查firstname和lastname中的行,如果存在echo,则返回其他消息  插入

答案 1 :(得分:2)

由于您的主键是(firstName,lastName),因此您不需要php来阻止插入重复值。 Mysql为您做到这一点,因为主键必须是唯一的。
(如果它不是你的主键,你可以使用一个独特的约束)

要在重复条目上显示错误消息“客户端已列出”,您可以使用mysqli_errno($dbc)并检查错误代码1062

快速修复应该做你想做的事:用or die('Error querying database.');

替换or die(mysqli_errno($dbc) == 1062 ? "Client already listed" : 'Error querying database.');

答案 2 :(得分:0)

处理$_POST数据后,使用SELECT查询后跟if语句检查表中是否有任何行,其名称和姓氏与$_POST名字和姓氏数据。

如果有,则显示已插入此数据的消息。

如果没有,请使用INSERT查询将此数据添加到数据库表中,并显示已将此数据添加到表中的消息。

答案 3 :(得分:0)

我一直有这个问题。我已经从使用自动递增的主要到大多数时候使用md5哈希。所以虽然我自己还没有实现这个 - 现在没有机会/需要 - 你可以创建一个主键(VARCHAR 32),它是名字和姓氏的md5哈希。像这样:

$key = md5(strtolower($firstName . $lastName));

使该列成为主键。然后使用INSERT IGNORE,您可以忽略任何错误。

然后在$ key上运行SELECT以返回与$key相关的所有内容,并以友好的格式显示您对用户的任何信息。您不必在此时向用户显示错误,只需向他们提供已捕获的信息即可。如果您担心具有相同名称的用户看到彼此的数据,则可以对数据进行模糊处理。例如,您不是显示电话号码(333)444-5555,而是显示(333)444-5 * 5或(333)* * - 5555。为用户提供足够信息以确定是否是他们或其他具有相同名称的人。

我通常使用SELECT,如果再次为空INSERTSELECT,则使用方法。它有效但速度明显慢于简单INSERT IGNORE然后SELECT。我使用的是我在PDO之上构建的DAO,当单个列是主键时,INSERT IGNORE可以正常工作。我没有尝试过基于超过1列的主键,也没有尝试使用mysqli_ *函数。