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

#php #sql

#php #sql

Вопрос:

 $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, моя информация будет сохраняться в базе данных, но я хотел предотвратить дубликаты. итак, как мне обойти это? Или я должен проверять дубликаты электронной почты?

РЕДАКТИРОВАТЬ Насколько я могу судить, pinnaclecart устанавливает uid в значение primary. так не было бы «опасно» вместо этого устанавливать его уникальным?

Комментарии:

1. Какую базу данных вы используете. Сделайте свой uid УНИКАЛЬНЫМ, и вы будете защищены от дубликатов.

2. Лучшим вариантом было бы включить уникальные ограничения в вашей таблице

3. @Nemoden, что вы имеете в виду, говоря о том, какую базу данных я использую? он использует базу данных pinnacle. uid в таблице user должен быть установлен уникальным?

4. @Josephine Следует ли устанавливать uid в таблице user уникальным, зависит от того, рассматриваете ли вы две записи с одинаковым uid в качестве дубликатов.

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

Ответ №1:

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

 ALTER TABLE users ADD UNIQUE unique_emailaddress ( email );
  

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

Ответ №2:

Если все, что вам нужно, это один УНИКАЛЬНЫЙ столбец, вы можете сделать что-то вроде:

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

Если вы зададите столбцу значение UNIQUE, это сделает уникальным только этот столбец, поэтому, если у вас есть два пользователя, одного зовут «Джон Смит», а другого — «Джейн Смит», уникальность в lname приведет ко второму сбою. Если вы зададите УНИКАЛЬНЫЕ ключи для полей имени и фамилии отдельно, то вы потерпите неудачу в любом случае, если имя или фамилия совпадут.

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

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

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

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

Ответ №3:

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

uid устанавливается pinnaclecart в значение primary. так не было бы «опасно» вместо этого устанавливать его уникальным?

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

Ответ №4:

Создайте УНИКАЛЬНЫЙ индекс в базе данных.