使用PDO搜索重复条目

时间:2012-09-05 02:16:45

标签: php mysql

我遇到了一些麻烦,有些代码可以找到与平台一起重复的名称。这也将适用于稍后查找唯一ID。

因此,例如,如果Xbox上有一个名为“Apple”的服务器,并且您尝试使用同一平台插入名称为“Apple”的记录,则会拒绝它。但是,允许使用另一个具有相同名称的平台,例如带有PS3的“Apple”。

我已经尝试过提出想法并寻找答案,但我对于检查重复项的最佳方法有点不知所措。

到目前为止,这就是我所拥有的:

$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name=':name' AND platform=':platform'");
$nameDuplicate_sql->bindValue(':name', $name);
$nameDuplicate_sql->bindValue(':platform', $platform);
$nameDuplicate_sql->execute();

我尝试了很多不同的解决方案,其中一些来自这里,另外一些来自PHP的手册等。但似乎无法解决。

我正在努力坚持PDO,但是,这是我无法弄清楚转向的一个例子。如果这是在mysql_ *我可能只是使用mysql_affected_rows,但与PDO我不知道。 rowCount似乎很有希望,但它总是返回0,因为它既不是INSERT,UPDATE或DELETE语句。

哦,我已经在phpMyAdmin中尝试过SQL语句并且它有效;我用一个简单的名称/平台尝试了它,它找到了正确的行。

如果有人可以帮助我,我会很感激。

3 个答案:

答案 0 :(得分:2)

  

对于大多数数据库,PDOStatement :: rowCount()不返回   受SELECT语句影响的行数。       相反,使用PDO :: query()发出SELECT COUNT(*)语句,其语句与预期的SELECT语句相同,然后使用   PDOStatement :: fetchColumn()来检索将要的行数   被退回       然后,您的应用程序可以执行正确的操作。

答案 1 :(得分:2)

为什么不直接在数据库表上强制执行,而不是检查重复项?创建一个复合键,如果它们已经存在则禁止输入?

CREATE TABLE servers (
    serverName varchar(50),
    platform varchar(50),
    PRIMARY KEY (serverName, platform)
) 

通过这种方式,您将永远不会获得重复项,并且它还允许您使用mysql insert... on duplicate key update...语法,这听起来对您来说非常方便。

如果您已经有主键,或者您不想制作新表,则可以使用以下内容:

ALTER TABLE servers DROP PRIMARY KEY, ADD PRIMARY KEY(serverName, platform);

编辑:主键是 的单行或多行,以便在其中包含唯一数据。单行不能具有相同的值两次,但是复合键(这是我在此建议的)意味着在两列之间,相同的数据不会出现。

在这种情况下,您想要做什么,添加一个服务器名称并将其与平台相关联 - 该表将允许您添加包含相同服务器名称的多个行 - 只要每个行都具有唯一的与之相关的平台 - 反之亦然,只要所有服务器名称都是唯一的,您就可以根据需要多次列出一个平台。

如果您尝试插入存在相同服务器名称/平台组合的记录,则数据库根本不允许您这样做。但是还有另一个好处。由于这个键约束 - mysql允许使用特殊类型的查询。它是insert... on duplicate key update语法。这意味着如果您尝试两次插入相同的数据(即数据库说不),您可以捕获它并更新表中已有的行。例如:

您有一行serverName=Fluffeh并且它位于platform=Boosh但您现在还不知道,所以您尝试插入一条记录以更新服务器IP地址。

通常你会写这样的东西:

insert into servers (serverName, platform, IPAddress) 
values ('$serverName', '$platform', '$IPAddy')

但是如果确定了一个很好的主键,你可以这样做:

insert into servers (serverName, platform, IPAddress) 
values ('$serverName', '$platform', '$IPAddy') 
on duplicate key update set IPAddress='$IPAddy';

第二个查询将插入包含所有数据的行(如果它尚不存在)。如果它,Bam!它会更新你一直想要的服务器的IP地址。

答案 2 :(得分:1)

从参数令牌的查询中删除单引号......一旦绑定它们就会被引用...这就是准备语句的部分原因。

$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name= :name AND platform= :platform");