【问题标题】:prevent duplicate records in mysql table防止mysql表中的重复记录
【发布时间】:2015-02-11 00:35:34
【问题描述】:

我正在创建一个用于预订活动的网站。我有3个中心。客户不能在不同的中心两次预订相同的活动。我在 mysql 中使用一个表来存储客户提供的信息。如果客户已经多次预订相同的活动并回显错误消息,是否有任何方法可以过滤或检查我的 php 代码? 我的表(以及我询问的信息)包含以下列: 身份证(主要) 名 姓 电子邮件 联系电话 班级名称 星期 强度 中心名称

$values = $_POST;
foreach ($values as &$value) {
$value = mysql_real_escape_string($value);
}

$sql1="INSERT INTO loan (loan_id)
VALUES ('$values[loan_id]')";

$result = mysql_query($sql1);
if (!$result) {
die('Invalid query: ' . mysql_error());
}

【问题讨论】:

    标签: php mysql duplicates


    【解决方案1】:

    当您创建表时,将唯一属性添加到您想要阻止的字段中,类似这样

    CREATE TABLE Persons
    (
    P_Id INT NOT NULL AUTO_INCREMENT,
    LastName VARCHAR(255) NOT NULL,
    FirstName VARCHAR(255),
    Address VARCHAR(255),
    City VARCHAR(255),
    UNIQUE (P_Id)
    )
    

    如果您已经创建了表格,只需像这样编辑它

    ALTER TABLE Persons
    ADD UNIQUE (P_Id)
    

    【讨论】:

    • 使用唯一属性不可能有重复记录,因为服务器拒绝它并显示错误。
    【解决方案2】:

    希望这对您有所帮助;如果您没有唯一的 ID,我相信这将最适合您的需求;请注意,这不是完整的代码;您需要添加一些其他信息以适合您的问题;

    // Checks if the value already exist on the database
    $query = SELECT EXISTS(SELECT column_name FROM table_name WHERE 
    condition   LIMIT 1)
    
    // If condition is not met it will proceed with save
    if (mysql_num_rows(!$query) > 0) {
        echo "Activity Booked";
    } else { // If condition is met it will echo an error message
        echo "Unable to booked activity"; }
    

    【讨论】:

    • 它出现错误消息:警告:mysql_num_rows() 期望参数 1 是资源,给定布尔值.. $query = "SELECT EXISTS(SELECT FirstName, LastName, @987654324 @, ContactNumber, ClassName, Week, Intensity FROM Bookings WHERE 条件 FirstName = '$FirstName', LastName = '$LastName', Email = '$Email', ClassName = '$Class' , 周 = '$Week', 强度 = '$Intensity' )";
    • 去掉WHERE后面的条件,用&&代替(,)逗号;我为您的示例代码添加了条件作为指导,它不完全是代码的一部分。
    • 抱歉没看到.. 我修复了它,但它仍然给我同样的错误........ $query = "SELECT EXISTS(SELECT FirstName, LastName, @ 987654332@, ContactNumber, ClassName, Week, Intensity FROM Bookings WHERE FirstName = '$FirstName'&& LastName='$LastName'&& ='E ClassName = '$Class'&& Week = '$Week' && Intensity = '$Intensity' )";
    • 警告:mysql_num_rows() 期望参数 1 是资源,布尔值在第 45 行的 /directory/ 中给出,无法预订活动
    • 不知道为什么它不工作,我检查过它对我有用,然后才在这里发布;你能把你的整个代码给我看一下吗?
    【解决方案3】:

    您需要在希望唯一的列上创建唯一(复合)索引。在制作唯一索引时,您可以忽略您的 PK。在您的情况下,您的 sql 看起来像:

    Alter table yourtablename 
    add unique index idx_unq(`LastName`, `FirstName`, `Email`, `ContactNumber` `ClassName`, `Week`, `Intensity`, `CentreName`);
    

    然后执行 INSERT IGNORE INTO 而不是 INSERT INTO。

    这篇文章也可能对你有所帮助。

    "INSERT INTO .. ON DUPLICATE KEY UPDATE" Only inserts new entries rather than replace?

    为了查看表中是否已经存在记录,您必须首先“测试”以查看表中是否存在该确切记录。这要在逻辑中的“插入 IGNORE Into”之前完成。使用变量,您的代码将如下所示:

    $testcount = "Select count(`LastName`, `FirstName`, `Email`, `ContactNumber` `ClassName`, `Week`, `Intensity`, `CentreName`) 
          from yourtablename 
              where 
    (LastName = '$LastName' AND FirstName= '$FirstName' AND Email= '$EMAIL' AND ContactNumber= '$ContactNumber' AND ClassName= '$ClassName' AND Week= '$Week' Intensity = '$Intensity' AND CentreName = '$CentreName' )";
    

    此查询将返回(假设表中没有重复项)0 或 1 并将其存储在您的 $testcount 变量中。然后,这可以用于根据值确定将记录插入表中,或者打印一条消息给最终用户,通知他们它已经存在。

    我不确定你想如何构建 php 代码,但伪代码看起来像:

    If $testcount = 1 then do your insert.
    
    else if $testcount = 0 then echo your message.
    

    【讨论】:

    • 试过了,但我想在有人尝试输入重复记录时回显一条错误消息
    • 哦,你有没有这些值 LastName, FirstName, Email, ContactNumber ClassName, Week, Intensity, CentreName 存储在你的数组中php代码?
    • 这些是用户给定的,然后存储在 phpMyAdmin 的表中 $FirstName = $_POST['name']; $姓氏 = $_POST['姓氏']; $Email = $_POST['email']; $ContactNumber = $_POST['number']; $Class = $_POST['classname']; $Week = $_POST['week']; $强度 = $_POST['强度']; $Centre = "康希尔";
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多