7

我想防止重复值从使用 PHP 的表单中复制到数据库表中。

我创建了以下内容:

具有名为clients的表的数据库:

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脚本?

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

如果在表单上输入名字/姓氏组合时未发现重复行,则应将条目插入数据库并显示消息“客户已添加”

我已经读过应该先运行一个 SELECT 然后再运行一个 INSERT 但我不确定如何在我现有的代码中实现它。

4

4 回答 4

20
  <?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";
    };
  ?>

只需检查数据库中的名字和姓氏(如果存在)的行回显 - 否则插入您的消息

于 2013-10-31T20:23:59.517 回答
3

由于您的主键是 (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.');

于 2013-10-31T20:50:19.643 回答
1

处理$_POST数据后,使用SELECT查询和if语句检查表中是否存在与$_POST名字和姓氏数据相同的名字和姓氏的行。

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

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

于 2013-10-31T18:48:47.957 回答
1

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

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

使该键进入主键的列。然后你使用 anINSERT IGNORE并且你可以忽略任何错误。

然后SELECT在 $key 上运行 a 以返回与用户相关的所有内容,$key并以友好的格式显示您对用户的任何信息。此时您不必向用户显示错误,只需向他们提供已捕获的信息即可。如果您担心同名用户看到彼此的数据,那么数据可能会被混淆。例如,不是显示电话号码 (333) 444-5555,而是显示 (333) 444-5* 5 或 (333) * *-5555。可以为用户提供足够信息以知道是他们还是同名的其他人的东西。

通常我使用SELECT, if empty INSERTand SELECTagain, 方法。它可以工作,但比简单的INSERT IGNOREthen慢得多SELECT。我使用我在 PDO 之上构建的 DAO,INSERT IGNORE当单列是主键时工作正常。我没有在基于超过 1 列的主键上尝试过,也没有使用 mysqli_* 函数尝试过。

于 2013-10-31T19:05:17.990 回答