Перейти к содержимому

Сервис обмена электронных валют

Партнерская программа Kredov

  • Закрытая тема Тема закрыта

Обработка уникальных полей в MySQL

#1 Banderas

Banderas
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1
0

Отправлено 13 Март 2011 - 10:15

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

Значит что я хочу. Хочу что бы в таблице были уникальные поля логина, имейла и телефона. В самой БД я поставил галочку на поле UNIQUE. Запросы с одинаковыми логинами/телефонами/имейлами перестали добавляться, но никакой ошибки не возникает, запрос отправляется и возвращает true. Как же заставить mysql сообщать мне, что такой логин и т.д. уже есть в БД?
У меня конечно есть идея. Просто вытянуть с БД ВСЕ!!! поля логина, имейла и телефона и сравнить с теми, что ввел пользователь. Но это ппц как нерационально...

 

 

  • 0


#2 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 13 Март 2011 - 11:19

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

#3 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 13 Март 2011 - 11:27

Я так и делаю. Просто mysql не выдает ошибки если есть одинаковые поля. Тоесть передает значение true. Если true значит все впорядке и я работаю далее... Как узнать что данный пользователь уже есть в базе? Может mysql_error()?

Вот мой запрос
$add_user = mysql_query("INSERT INTO users (login, password, name, mail, sex, address, phone, date, auth_code) 
VALUES ('$login', '$password', '$name', '$mail', '$sex', '$address', '$phone', '$date', '$auth_code')", $db);
$add_user ? print('good') : print('bad');

  • 0


#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 13 Март 2011 - 11:36

Можно использовать ф-цию mysql_affected_rows(), которая возвращает количество рядов затронутых запросом по модификации таблицы. После запроса на добавление данных в таблицу (INSERT) достаточно проверить изменилось ли что-то в таблице после запроса, т.е., добавились ли новые данные:
if (mysql_affected_rows() > 0)
echo "<p>Данные внесены!</p>";
else
echo "<p>Не внесены - возможно, такие данные уже есть!</p>";

  • 0


#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 13 Март 2011 - 12:02

Banderas, конечно лишние запросы к БД ни к чему, но всё же вы данные не будете вытаскивать, ты просто проверишь на существование логин ИЛИ email ИЛИ телефон. Далее mysql_num_rows().
Никогда не использовал на практике mysql_affected_rows() - может лучше именно так и делать. Два запроса против одного.

Сколько движков не смотрел, все проверяют данные перед занесением с помощью предварительного SELECT запроса:
IPB2, DLE, Joomla...
  • 0

#6 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 13 Март 2011 - 19:13

Единственное, что если ограничение идет по UNIQUE, то mysql_affected_rows() может вернуть больше 0. Потому что я точно знаю, когда идет операция REPLACE, то он возвращает при замене одной строки - 2. Один на удаление и второй на добавление. Так что стоит быть осторожнее.
А еще лучше, проверять свободность при вводе логина с помощью AJAX.
  • 0

#7 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 14 Март 2011 - 20:50

gaaarfild, это ты хорошо подметил. Только при INSERT запись вставляется, если значение UNIQUE-поля уникально. А REPLACE - замена :rolleyes:
Мне вот только интересно, при REPLACE возможно ли сделать значения уникального поля неуникальными или здесь тот же самый принцип, что и при вставке (INSERT).
  • 0

#8 Banderas

Banderas
    Topic Starter
  • Пользователь
  • 1 168 сообщений
  • Репутация: 1

Отправлено 19 Март 2011 - 13:55

Нашел решение, вот такое простое
$unique_mail = mysql_query("SELECT COUNT(id) FROM users WHERE mail='".mysql_real_escape_string($mail)."'");
if (mysql_result($unique_mail, 0) > 0) {
die('Такоей имейл уже существует в нашей БД');
}


Возник вопрос, можно ли проверять 2 или 3 поля? что бы не писать
$unique = mysql_query("SELECT COUNT(id) FROM users WHERE login='".mysql_real_escape_string($login)."'");
print_r(mysql_fetch_array($unique));
if(mysql_result($unique, 0) > 0)
{
die('Пользователь с таким именем существует!');
}

$unique_mail = mysql_query("SELECT COUNT(id) FROM users WHERE mail='".mysql_real_escape_string($mail)."'");
if (mysql_result($unique_mail, 0) > 0) {
die('Такоей имейл уже существует в нашей БД');
}

  • 0


#9 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 19 Март 2011 - 14:10

ну да, сделай WHERE условие1 AND условие2 и т.д.
  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 22 Март 2011 - 19:29

surfer, +1 :)
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru