Intereting Posts
Ошибка Object Not Found для простого скрипта php Как использовать веб-службы GeoNames с помощью PHP PHP ограничение на количество вывода, разрешенное до перенаправления местоположения заголовка, отклонено Амперсанд в GET, PHP Шифровать данные с помощью открытого ключа в c # и расшифровать данные с помощью закрытого ключа в php Можно ли вызывать ob_start PHP более одного раза? Предупреждение: implode () : Пропущенные недопустимые аргументы Ошибка PHPMailer: SMTP -> ОШИБКА: Не удалось подключиться к серверу Преобразование специальных символов в PHP Как передать массив строк в PDO для их вставки? Лучшая оценка для обработки полей форм PDF с помощью PHP5 Объект Persist с двумя иностранными идентичностями в доктрине Проверка проверки JQuery, если значение существует в базе данных Инъекционная инъекция с помощью гидратора Doctrine 2 Переменная $ _GET с испорченной кодировкой

Поиск дубликатов записей с помощью PDO

У меня проблемы с небольшим количеством кода, чтобы найти дубликаты имени вместе с платформой. Это также будет адаптировано для поиска уникальных идентификаторов позже.

Например, если на 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");