При попытке повторного использования кода я написал в основном 14 лет назад. Я пришел к выводу, что прекрасная небольшая настройка, которую я написал тогда, была ... отсутствующая в определенных местах, а именно обработка пользовательских входов.PHP/MySQL лучше искать пользователя
Урок: Никогда не недооценивайте возможность пользователей загружать мусор, опечатки и обманывать мимо ваших валидаторов.
Старый способ достигает критической массы, поскольку в выпадающем списке SELECT есть 470 элементов. Я хочу переосмыслить эту часть процесса, поэтому мне не нужно беспокоиться о том, что она наносит удар.
Итак, идея заключается в создании метода нечеткого поиска, так что после того, как машинистка войдет в строку поиска, мы проверим против пяти частей данных, все из которых находятся в одной строке.
Мне нужно проверить имя, представленное в отношении имени этапа, двух также известных имен, а также их юридического имени и в качестве окончательной проверки индекса soundex() на основе их имени этапа (это несколько ошибок орфографии пропущено иначе)
Я пробовал сложный блок кода, чтобы проверить эти вещи (и это не работает, главным образом потому, что я думаю, что я закодировал слишком строгие сравнения) как часть цикла do/while ,
В приведенном ниже каталоге var $Rin
будет содержать имя, предоставленное пользователем.
$setr = mysql_query("SELECT ID,StageName,AKA1,AKA2,LegalName,SoundEx FROM performers");
IF ($R = mysql_fetch_array($setr)) {
do {
$RT = substr(trim($Rin), 5);
$RT1 = substr($R[1], 5);
$RT2 = substr($R[2], 5);
$RT3 = substr($R[3], 5);
$RT4 = substr($R[4], 5);
$RTx = soundex($RT);
IF ($RT == $RT1) {
$RHits[] = $R[0];
}
IF ($RT == $RT2) {
$RHits[] = $R[0];
}
IF ($RT == $RT3) {
$RHits[] = $R[0];
}
IF ($RT == $RT4) {
$RHits[] = $R[0];
}
IF ($RTx == $R[5]) {
$RHits[] = $R[0];
}
} while ($R = mysql_fetch_array($setr));
}
Идея заключается в том, что я буду строить массив ID # 'с недалекими хитами, которые я заселяю в отборный выпадающий список, который имеет только надеюсь, меньше хиты, что весь стол. Это означает, что вы запрашиваете набор результатов из содержимого этого массива, чтобы отобразить имя исполнителя в выпадающем списке SELECT и передать идентификатор # в качестве значения для этих вариантов.
Thats, когда я нажимаю «Мне нужно использовать массив в задаче WHERE», и после обнаружения этого ответа, я начинаю подозревать, что мне не повезло из-за Stipulation # 2 ниже. Поэтому я начал искать альтернативные методы поиска, и я не уверен, что я где-то, но больше смущен.
Итак, есть ли лучший способ сканировать одну таблицу для шести полей, проверив пять против ввода пользователя и отметив шестой для отображения в подмножестве исходной таблицы?
процесс мысли:
Против всей таблицы, для каждой записи, тест $ Rin против этих тестов в таком порядке:
$ Рин -> сценическое имя
$ Rin -> AKA1
$ Rin -> AKA2
$ Rin ->
юридическое имя физического лица Саундэкс ($ Rin) -> SOUNDEX
, где удар по любому из пяти операций добавляет ID # в массив результатов, который используется для сужения результатов от 470 исполнителей до разумного списка на выбор.
УСЛОВИЙ:
1) Как написано, я знаю, что это уязвимы для атаки инъекции SQL.
2) Сервер запускает PHP 4.4.9 и MySQL 4.0.27-Standard, я не могу его обновить. Я должен доказать, что это работает, прежде чем деньги будут потрачены.
3) Это материал на уровне хобби, а не моя дневная работа.
4) Исполнители часто используют неанглийские имена или элементы в своих именах, и это привело к опечаткам и дублированию машинистами ввода данных.
Я нашел много ответов mysqli и PDO для такого рода вещей, и я вижу много вещей, которые только наполовину имеют смысл (например, ссылка № 4 ниже). Я работаю над тем, чтобы ускорить это, пытаясь исправить то, что сломалось.
мест уже смотрели:
- PHP mysql using an array in WHERE clause
- PHP/MySQL small-scale fuzzy search
- MySQL SubString Fuzzy Search
- Sophisticated Name Lookup
Прежде всего, «mysql_ *» теперь дефферируются. Вместо этого используйте «mysqli_ *». :) – Ronald
Является ли mysqli доступным на PHP v4.4.9? –
Имея несколько сотен опций и тип-вперед, я предлагаю загружать данные через сервисный вызов (AJAX) в фоновом режиме после загрузки страницы и обрабатывать typeahead с помощью инструмента Javascript, например. [Twitter's Typeahead library] (https://twitter.github.io/typeahead.js/examples/), * особенно * если вы ищете несколько столбцов. – alttag