使用PHP防止表中的重复记录

使用PHP防止表中的重复记录,php,mysql,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_sc

我想防止使用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";
?>

处理完
$\u POST
数据后,使用
选择
查询,然后使用
if
语句检查表中是否有与
$\u POST
名字和姓氏数据相同的行

如果有,则显示一条消息,说明此数据已插入


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

我一直有此问题。我大部分时间都是从使用自动递增的主哈希表改为使用md5哈希表。所以,虽然我自己还没有实现这一点-目前没有机会/需要-您可以创建一个主键(VARCHAR 32),它是名和姓的md5散列。像这样:

$key = md5(strtolower($firstName . $lastName));
使该列成为te主键。然后使用插入忽略,可以忽略任何错误

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

通常我使用了
SELECT
,如果
INSERT
为空,则再次使用
SELECT
方法。它可以工作,但比简单的插入忽略然后选择要慢得多。我使用在PDO之上构建的DAO,当一列是主键时,
INSERT IGNORE
可以很好地工作。我没有在基于多个列的主键上尝试过,也没有在mysqli_*函数上尝试过。


  <?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-yourmessage-else 插入

因为主键是(firstName,lastName),所以不需要php来防止重复值的插入。Mysql为您做到了这一点,因为主键必须是唯一的
(如果不是主键,则可以使用唯一约束)


要在重复条目上显示错误消息“Client ready listed”,可以使用
mysqli\u errno($dbc)
并检查错误代码
1062


快速修复程序,可以执行您想要的操作:替换
或死亡('Error querying database')带有
或die(mysqli_errno($dbc)==1062?“已列出客户端”:“查询数据库时出错”)

die(mysqli_Error($dbc))替换
die('Error query database'))
firstName=”;删除表客户端--。再见,客户们。嗨,艾玛,我喜欢你们的解决方案。查看重复条目的一个简单方法是插入记录时出现问题。哇,gabe,谢谢你的全面回答。这确实给了我一些努力的方向。感谢您的回复,我将尝试一下;-)@安第尔:没问题。当我写这篇文章的时候,我并不认为我需要它,但我现在正处于其中。例如,我正在捕获所有AdWords活动及其状态(暂停、活动等)。通常我会将所有活动放在一个表中,状态放在另一个表中,然后创建链接表-camp2stat。但是,状态会随着时间的推移而改变,我希望在状态改变时进行存储。因此,我现在有一个链接表,其中包含日期,而不仅仅是活动ID和状态ID。但是,我不想在每天的状态发生变化时存储它们……嗨,goddfree,我只是使用上面Sai的回复来存储的。尽管如此,仍然会出现错误-第一个:mysqli_query()需要至少2个参数,第二个:mysqli_num_rows()需要参数1为mysqli_result,null。我不知道这些到底是什么意思-有什么想法吗?谢谢;-)
mysqli_query()需要至少两个参数
此错误表示您尚未传递连接或未建立到数据库的连接
mysqli_num_rows()要求参数1为mysqli_result,null
表示查询工作不正常。首先在数据库中测试您的查询,然后将其作为良好实践在php中使用警告:这个答案对所有人都是开放的,应该使用参数化的预处理语句,而不是手动构建查询。它们由或提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行。