У меня проблемы с небольшим количеством кода, чтобы найти дубликаты имени вместе с платформой. Это также будет адаптировано для поиска уникальных идентификаторов позже.
Например, если на Xbox есть сервер с именем «Apple», и вы пытаетесь вставить запись с именем «Apple» с той же платформой, она отклонит ее. Тем не менее, разрешена другая платформа с таким же именем, как «Apple» с PS3.
Я пробовал придумывать идеи и искать ответы, но я вроде как в темноте, что лучший способ проверить дубликаты.
Пока это то, что у меня есть:
$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.
О, и я пробовал SQL-запрос в phpMyAdmin, и он работает; Я попробовал это с простым именем / платформой, и он нашел строки правильно.
Если кто-нибудь сможет мне помочь, я буду признателен.
Для большинства баз данных PDOStatement :: rowCount () не возвращает количество строк, на которые влияет инструкция SELECT. Вместо этого используйте PDO :: query () для выдачи оператора SELECT COUNT (*) с теми же предикатами, что и ваш запрошенный оператор SELECT, а затем используйте PDOStatement :: fetchColumn (), чтобы получить количество строк, которое будет возвращено. Затем ваше приложение может выполнить правильное действие.
Вместо того, чтобы проверять дубликаты, почему бы просто не привести их в соответствие с таблицей базы данных? Создайте составной ключ, который запретит делать записи, если они уже есть?
CREATE TABLE servers ( serverName varchar(50), platform varchar(50), PRIMARY KEY (serverName, platform) )
Таким образом, вы никогда не получите дубликатов, а также сможете использовать insert... on duplicate key update...
mysql insert... on duplicate key update...
синтаксис, который звучит, как будто это может быть вам очень удобно.
Если у вас уже есть первичный ключ или вы не хотите создавать новую таблицу, вы можете использовать следующее:
ALTER TABLE servers DROP PRIMARY KEY, ADD PRIMARY KEY(serverName, platform);
Изменить: Первичный ключ – это либо одна строка, либо несколько строк, которые должны иметь в них уникальные данные. Одна строка не может иметь одно и то же значение дважды, но составной ключ (который я предлагаю здесь) означает, что между двумя столбцами одни и те же данные не могут отображаться.
В этом случае, что вы хотите сделать, добавить имя сервера и связать его с платформой – таблица позволит вам добавить столько строк, содержащих одно и то же имя сервера, – пока каждая из них имеет уникальную платформу, связанную с это – и наоборот, вы можете иметь платформу, указанную столько раз, сколько хотите, если все имена серверов уникальны.
Если вы попытаетесь вставить запись, в которой существует одна и та же комбинация серверов / платформы, база данных просто не позволит вам это сделать. Однако есть еще одна золотая награда. Из-за этого ключевого ограничения – mysql позволяет использовать специальный тип запроса. Это insert... on duplicate key update
синтаксиса 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-адрес сервера, который был вашим намерением.
Удалите одинарные кавычки из вашего запроса в токенах параметров … они будут указаны после их привязки … это часть причины для подготовленного оператора.
$nameDuplicate_sql = $db->prepare("SELECT * FROM `servers` WHERE name= :name AND platform= :platform");