Как я делаю нечеткое соответствие названий компаний в MySQL с PHP для автоматического заполнения?

MySQL: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с ... at line ...

Эта ошибка часто возникает из-за того, что вы забыли правильно удалить данные, переданные в MySQL-запрос .

Пример того, что не делать («Плохая идея»):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Этот код может быть включен в страницу с формой для отправки с URL-адресом например http://example.com/edit.php?id=10 (для редактирования сообщения n ° 10)

Что произойдет, если представленный текст содержит одинарные кавычки ? $query закончится:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

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

Чтобы избежать таких ошибок, вы ДОЛЖНЫ всегда избегать данных перед использованием в запросе.

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

Документация:

47
задан Community 23 May 2017 в 11:33
поделиться

4 ответа

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

недостатки SOUNDEX():

  • его неспособность дифференцировать более длинные строки. Только первые несколько символов приняты во внимание, более длинные строки, которые отличаются в конце, генерируют то же значение SOUNDEX
  • факт, первая буква должна быть тем же, или Вы не найдете соответствие легко. SQL Server имеет РАЗЛИЧИЕ () функция, чтобы сказать Вам, сколько два значения SOUNDEX независимо, но я думаю, что MySQL не имеет ничего из того встроенного вида.
  • для MySQL, по крайней мере, согласно документы , SOUNDEX повреждается для входа unicode

Пример:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

Для более усовершенствованных потребностей, я думаю, что необходимо посмотреть расстояние Левенштейна (также названный "расстояние редактирования") двух строк и работать с порогом. Это - более сложное (=slower) решение, но оно допускает большую гибкость.

Основной недостаток, что Вам нужны обе строки для вычисления расстояния между ними. С SOUNDEX можно сохранить предрасчетный SOUNDEX в таблице и выдерживать сравнение/сортировать/группировать/фильтровать на этом. С расстоянием Левенштейна Вы могли бы найти, что различие между "Microsoft" и "Nzcrosoft" - только 2, но потребуется намного больше времени для прибытия в тот результат.

В любом случае, функция расстояния Левенштейна в качестве примера для MySQL может быть найдена в codejanitor.com: Расстояние Левенштейна как MySQL Stored Function (10-го февраля 2007) .

54
ответ дан danronmoon 26 November 2019 в 19:40
поделиться

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

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

Украденный от Википедии: http://en.wikipedia.org/wiki/Soundex

Как ответ на дефициты в алгоритме Soundex, Lawrence Philips разработал алгоритм Метафона для той же цели. Philips позже разработал улучшение Метафона, который он назвал Двойным Метафоном. Двойной метафон включает намного больший набор правила кодирования, чем его предшественник, обрабатывает подмножество нелатинских символов и возвращает основное устройство и вторичное кодирование для составления различного произношения отдельного слова на английском языке.

У основания двойной страницы метафона, у них есть реализации его для всех видов языков программирования: http://en.wikipedia.org/wiki/Double-Metaphone

Python & реализация MySQL: https://github.com/AtomBoy/double-metaphone

22
ответ дан Veve 26 November 2019 в 19:40
поделиться

Вот ссылка на php обсуждение функций soundex в mysql и php. Я запустил бы оттуда, затем расширился бы в Ваши другие not-so-well-defined требования.

Ваши ссылочные ссылки методология Levenshtein для соответствия. Две проблемы. 1. Это более подходит для измерения различия между двумя известными словами, не для поиска. 2. Это обсуждает решение, разработанное больше для обнаружения вещей как проверка ошибок (использующий "Levenshtien" для "Levenshtein"), а не орфографические ошибки (где пользователь не знает, как записать, сказать "Levenshtein" и типы в "Levinstein". Я обычно связываю его с поиском фразы в книге, а не значения ключа в базе данных.

РЕДАКТИРОВАНИЕ: В ответ на комментарий -

  1. Может Вы, по крайней мере, заставлять пользователей помещать названия компаний в несколько текстовых полей; 2. или используйте однозначный разделитель имени (скажите обратную косую черту); 3. не учтите статьи и универсальные сокращения (или можно отфильтровать для них); 4. Squoosh пробелы и соответствие для того также (так Микро Мягкий => Microsoft, Предметы первой необходимости => bareessentials); 5. Отфильтруйте пунктуацию; 6. Сделайте "ИЛИ" поиски на словах ("пустой" ИЛИ "основы") - люди будут неизбежно пропускать один или другой иногда.

Тест как безумный и использование обратная связь от пользователей.

4
ответ дан dkretz 26 November 2019 в 19:40
поделиться

лучшая функция для нечеткого соответствия является levenshtein., это традиционно используется программами проверки правописания, так, чтобы мог бы быть способ пойти. существует UDF для него доступен здесь: http://joshdrew.com/

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

0
ответ дан 26 November 2019 в 19:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: