X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Обработка уникальных полей в MySQL
Banderas
Banderas
Topic Starter сообщение 13.3.2011, 11:15; Ответить: Banderas
Сообщение #1


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

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


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Banderas
Banderas
Topic Starter сообщение 13.3.2011, 12:27; Ответить: Banderas
Сообщение #3


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

Вот мой запрос
[php]$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');[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 13.3.2011, 12:36; Ответить: matroskin8
Сообщение #4


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


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 13.3.2011, 13:02; Ответить: ZiTosS
Сообщение #5


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

Сколько движков не смотрел, все проверяют данные перед занесением с помощью предварительного SELECT запроса:
IPB2, DLE, Joomla...
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gaaarfild
gaaarfild
сообщение 13.3.2011, 20:13; Ответить: gaaarfild
Сообщение #6


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


gaaarfild, это ты хорошо подметил. Только при INSERT запись вставляется, если значение UNIQUE-поля уникально. А REPLACE - замена :rolleyes:
Мне вот только интересно, при REPLACE возможно ли сделать значения уникального поля неуникальными или здесь тот же самый принцип, что и при вставке (INSERT).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Banderas
Banderas
Topic Starter сообщение 19.3.2011, 14:55; Ответить: Banderas
Сообщение #8


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

Возник вопрос, можно ли проверять 2 или 3 поля? что бы не писать
[php]$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('Такоей имейл уже существует в нашей БД');
}[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 19.3.2011, 15:10; Ответить: sc2r2bey
Сообщение #9


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 22.3.2011, 20:29; Ответить: ZiTosS
Сообщение #10


surfer, +1 :)

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1174 24.11.2023, 14:46
автор: alexey
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыpocket-exchange.com - обмен электронных валют. Низкие курсы! Быстрая обработка заявок!
8 pocket_exchange 9303 12.8.2022, 15:30
автор: pocket_exchange
Открытая тема (нет новых ответов) 10000 уникальных статей из вебархива всего за 25500 рублей!
Под заказ, уникальность 90-100%
1 bposter94 2553 12.2.2022, 15:22
автор: SanekBug
Горячая тема (нет новых ответов) Proxylist4you.com - 2.000.000 уникальных IP в месяц. Приватные прокси http\https\socks4\socks5. GEO пулы
Чистые и быстрые прокси. Residential Backconnect Rotating Proxies
40 proxylist4you 29953 8.11.2021, 14:34
автор: proxylist4you
Открытая тема (нет новых ответов) Сотрудничество и качественная обработка трафика
4 BNRKmaster 882 12.6.2021, 13:02
автор: NormanSky


 



RSS Текстовая версия Сейчас: 29.3.2024, 18:06
Дизайн