我遇到了一些麻烦,有些代码可以找到与平台一起重复的名称。这也将适用于稍后查找唯一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语句并且它有效;我用一个简单的名称/平台尝试了它,它找到了正确的行。
如果有人可以帮助我,我会很感激。
答案 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");