Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用PDO搜索重复条目_Php_Mysql - Fatal编程技术网

Php 使用PDO搜索重复条目

Php 使用PDO搜索重复条目,php,mysql,Php,Mysql,我遇到了一点麻烦,因为有一段代码是为了在平台上查找名称的副本。这也将适用于以后查找唯一ID 例如,如果Xbox上有一个名为“Apple”的服务器,而您试图在同一平台上插入一条名为“Apple”的记录,它将拒绝该记录。但是,允许使用另一个同名的平台,例如带有PS3的“Apple” 我试着想出一些想法并寻找答案,但我不知道什么是检查重复的最好方法 到目前为止,这就是我所拥有的: $nameDuplicate_sql = $db->prepare("SELECT * FROM `servers`

我遇到了一点麻烦,因为有一段代码是为了在平台上查找名称的副本。这也将适用于以后查找唯一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影响的行,但对于PDO,我没有任何线索。rowCount似乎很有希望,但它始终返回0,因为这不是INSERT、UPDATE或DELETE语句

$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name= :name AND platform= :platform");
哦,我在phpMyAdmin中尝试了SQL语句,它可以工作;我用一个简单的名称/平台进行了尝试,它正确地找到了行


如果有人能在这里帮助我,我将不胜感激。

从您对参数令牌的查询中删除单引号。。。一旦它们被绑定,就会被引用。。。这是准备好声明的部分原因

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

从参数标记的查询中删除单引号。。。一旦它们被绑定,就会被引用。。。这是准备好声明的部分原因

$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name= :name AND platform= :platform");
对于大多数数据库,PDOStatement::rowCount()不返回 受SELECT语句影响的行数。 相反,请使用PDO::query()发出一个SELECT COUNT(*)语句,该语句的谓词与预期的SELECT语句相同,然后使用 PDOStatement::fetchColumn()以检索将显示的行数 被退回。 然后,应用程序可以执行正确的操作

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


与其检查重复项,为什么不直接在数据库表上强制执行它呢?创建一个复合密钥,如果条目已经存在,它将禁止创建条目

CREATE TABLE servers (
    serverName varchar(50),
    platform varchar(50),
    PRIMARY KEY (serverName, platform)
) 
这样,您将永远不会得到重复,而且它还允许您使用mysql
insert。。。关于重复密钥更新…
语法,听起来它可能对您相当方便

如果已经有主键,或者不想创建新表,可以使用以下方法:

ALTER TABLE servers DROP PRIMARY KEY, ADD PRIMARY KEY(serverName, platform);
编辑:主键是一行或多行,其中必须包含唯一的数据。一行不能有两次相同的值,但复合键(这是我在这里建议的)意味着两列之间不能出现相同的数据

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

如果您尝试在存在相同服务器名/平台组合的位置插入记录,数据库将不允许您这样做。不过,还有另一个好处。由于这个关键约束,mysql允许使用一种特殊类型的查询。这是
插入。。。在重复密钥更新时
语法。这意味着,如果您尝试两次插入相同的数据(即,数据库说否),您可以捕获它并更新表中已有的行。例如:

您有一个
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';

第二个查询将插入包含所有数据的行(如果该行不存在)。如果是真的,砰!它将更新服务器的IP地址,这是您一直以来的意图。

与其检查重复项,为什么不直接在数据库表上强制执行它呢?创建一个复合密钥,如果条目已经存在,它将禁止创建条目

CREATE TABLE servers (
    serverName varchar(50),
    platform varchar(50),
    PRIMARY KEY (serverName, platform)
) 
这样,您将永远不会得到重复,而且它还允许您使用mysql
insert。。。关于重复密钥更新…
语法,听起来它可能对您相当方便

如果已经有主键,或者不想创建新表,可以使用以下方法:

ALTER TABLE servers DROP PRIMARY KEY, ADD PRIMARY KEY(serverName, platform);
编辑:主键是一行或多行,其中必须包含唯一的数据。一行不能有两次相同的值,但复合键(这是我在这里建议的)意味着两列之间不能出现相同的数据

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

如果您尝试在存在相同服务器名/平台组合的位置插入记录,数据库将不允许您这样做。不过,还有另一个好处。由于这个关键约束,mysql允许使用一种特殊类型的查询。这是一家公司