Предотвращение дублирования в базе данных

$db->query("SELECT * FROM ".DB_PREFIX."users WHERE uid='".$uid_id."' AND login='ExpressCheckoutUser'"); if ($db->moveNext()) { $db->assignStr("address1", $_REQUEST['address_street']); $db->assignStr("city", $_REQUEST['address_city']); $db->assignStr("state", $_REQUEST['address_state']); $db->assignStr("fname", $_REQUEST['first_name']); $db->assignStr("lname", $_REQUEST['last_name']); $db->assignStr("email", $_REQUEST['payer_email']); $db->assignStr("country", $country_code); $db->assignStr("zip", $_REQUEST['address_zip']); $db->update(DB_PREFIX."users", "WHERE uid='".$uid_id."'"); $db->reset(); } 

каждый раз, когда я делаю платеж через paypal, моя информация будет записана в базу данных, но я хочу предотвратить дубликаты. так как мне обойти это? Или я должен проверить дубликаты электронной почты?

EDIT Насколько я могу судить, uid задается первичным с помощью pinnaclecart. так не было бы «опасно» установить его уникальным?

Имя и фамилия хороши, но все, кроме уникальных. Я знаю нескольких людей, которые имеют то же имя, что и я, поэтому я думаю, что создание уникального индекса на этих двух столбцах будет только сорвать, а не помогать. Единственное, что делает меня уникальным, это то, что я единственный, у кого есть мой адрес электронной почты и пароль, поэтому я думаю, что это был бы лучший кандидат.

 ALTER TABLE users ADD UNIQUE unique_emailaddress ( email ); 

Это должно, по крайней мере, помочь с некоторыми дубликатами, но не для всех: у пользователей может быть несколько адресов электронной почты (я знаю, что я делаю;)), но это все же лучше, чем произвольная комбинация имени и фамилии, которая не является уникальной вообще.

Если вам нужно всего один столбец UNIQUE, вы можете сделать что-то вроде:

 ALTER TABLE `users` ADD UNIQUE `lname`(fname); 

Если вы установите столбец UNIQUE, он сделает только этот столбец уникальным, поэтому, если у вас есть два человека, один из которых называется «Джон Смит», а другой – «Джейн Смит», UNIQUE на lname приведет к сбою второго. Если вы устанавливаете ключи UNIQUE как в первом, так и в именином имени отдельно, то вы будете терпеть неудачу в том случае, если имена первых или фамилий совпадают.

Возможно, вы, скорее всего, захотите добавить составной ключ, чтобы обеспечить уникальность для нескольких полей в сочетании. Для этого:

 ALTER TABLE `users` ADD UNIQUE `unique_key`(fname,lname); 

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

Вы можете делать исключения из ошибок и обрабатывать их выше в своей кодовой базе, или вместо этого можете просто увидеть, что у вас есть ошибка, и вы хотите игнорировать ее.

Учитывая ваше последнее изменение, в котором говорится:

uid устанавливается на первичный с помощью pinnaclecart. так не было бы «опасно» установить его уникальным?

В этом случае не делайте этого. И ничего не делайте, PRIMARY KEY по умолчанию UNIQUE , поэтому его нельзя дублировать.

Создайте индекс UNIQUE в базе данных.