В БД логином служит ФИО человека. При регистрации человек часто ошибется в одной букве, потом не может из-за этот пройти авторизацию. И начинает клонировать анкеты. Сделал так: при неправильном логине выводится список похожих фамилий. Тупо разбивал ФИО по пробелам и сравнивал с тем, что в базе. Но вот в чем засада. Если человек ввел "Ивнов", то он не получит анкету товарища "Иванов". В этом собственно и вопрос, как реализовать Эта же тема поднималась и на другом форуме. Подробности там http://softtime.ru/forum/read.php?id_forum=1&id_theme=62577
Средствами базы - никак. Это нужен поисковой алгоритм с определением морфологии по грамматическими подсказками - и то, иногда грамматические ошибки такие, что похожие результаты даже близко не стоят. Дайте человеку подсказку, что ничего не найдено, проверте ваш запрос.
Составьте список, и примеру, из 10000 корректных фамилий. При регистрации пускай проверяется наличие введенной фамилии в списке. Если не найдена, попросить пользователя подтвердить, что он ввел фамилию правильно.
А пользователей планируется много? Если нет, то можно извратиться. Вытягивать все фамилии из базы в массив, а потом PHP: <? function print_simular($surname, $surname_from_base) { if (levenshtein( $surname, $lsurname_from_base)==1) // отличается на одну букву {echo 'похоже на: ',$surname_from_base;} } array_walk($surnames_list, 'print_simular'); Тормозить? конечно, будет зверски. Ну так задание такое
Я так понял, что меня никто не понял Есть таблица с 100.000 пользователей, у которых в профилях написаны валидные фамилии. Эти 100.000 пользователей - носители 95% распространеных фамилий. При регистрации нового, сравнивать, есть ли введеная им фамилия у кого-либо из этих 100.000 пользователей, если есть - значит фамилия правильная, если нет, то попросить у пользователя подтверждения того, что введеная им фамилия - валидная.
Да не, все поняли. Просто это не вариант. Пользователь нажмет на кнопку "подтверждаю" быстрее чем прочитает о чем речь. Вот ты когда в последний раз текст лицензии читал? Да и где их взять на старте, 100к пользователей? И что делать с фамилиями, отличающимися на одну букву? Лукин-Дукин, Путин-Пулин и так далее.
Выход - правильный дизайн. Красный заголовок h2 с текстом "Проверьте правильность фамилии", и маааленькая кнопочка "подтверждаю". А ты, когда при регистрации говорят, что такой логин уже существует, жмешь заново кнопку "регистрация" быстрее, чем прочитаешь текст ошибки? о_0 Не выход - это вот это:
Это даже не вход. Если юзер свою фамилию вбить без ошибок не может, такого вообще не стоит к компу подпускать. Upd: Кстати, есть вариант при логине вместо обычного input type=text ставить select c автокомплитом
Люди пожилые - допускают всяческие ошибки при печати на клавиатуре. А вот вариант с автокомплитом - возможное решение. Вопрос остается открытым.
Первая буква фамилии, скорее всего точна. Поэтому нужно выбирать все фамилии на 1 букву. Получится много. Поэтому, можно взять еще один ограничитель - длинна фамилии. Человек вряд ли ошибется более +/-2 буквы. Еще, чтобы облегчить труды сервера, можно ориентироваться на последнюю букву и предпоследнюю (считая её последней).
А что, он только в фамилии может сделать ошибку? А в имени и отчестве? Что-то какая-то негуманная система авторизации. Чтобы авторизоваться, нужно каждый раз фио вводить? Это ж пипец. Я б таким сервисом не стал пользоваться)
Поскольку про базу ничего не сказано, алгоритм в общих чертах. Для каждой фамилии строите набор трехбуквенных слов. Например, для Иванов строим **и, *ив, ива, ван, ано, нов, ов*, в**. Для введенной фамилии строим тоже самое. Ищем совпадения. Фамилия с наибольшим "попаданием" - наша. Реализация даже без полнотекстового поиска простая - строить свой словарь "трехбуквенное слово - указатель на фамилию". Делаем оттуда выборку по искомым сочетаниям (введенная фамилия) ну и смотрим какое id указателя чаще встречается.
Хитро придумано. если мне память не изменяет где то была функция сравнения которая выдавала результат насколько похожи две сравниваемые строчки. и как вариант функции strcmp() , strcasecmp() , а так же функция которая приводит все в 1 регитр strtr($str,$from,$to) где фром и то просто строки в алфавитном порядке. Исходя из прочитанного выше текста я понял что сайт будет называтся старички ру где пожелые люди будуи сидеть точно так же как отцы и мамы на однокласниках и молодежь на вконтакте. И исходя из того что все бабушки хотят быть толи кошками толи клеопатрами использовать метод логина нелогично. ведь что может быть уникальнее чем "Брунгильда Ургант Мафусаиловна"