2015-10-11 2 views
0

Я создавал функцию поиска на веб-сайте, и я хочу добавить функцию коррекции типа. Когда я добавляю в этот код, вывод всегда является первым из массива слов, пожалуйста, помогите!"Вы имели в виду" функцию с php и mysql

Это мой код:

<?php 
$input = $q; 

// array of words to check against 
$sql = "SELECT `English` FROM `dict`"; 
$result = mysql_query($sql); 
$words = mysql_fetch_array($result, MYSQL_BOTH); 

$shortest=100; 
// loop through words to find the closest 
foreach ($words as $word) { 

    // calculate the distance between the input word and the current word 
    $lev = levenshtein($input, $word); 
    //if the distance is shorter than the last shortest one, replace it. 
    if ($lev <= $shortest) { 
     // set the closest match, and shortest distance 
     $closest = $word; 
     $shortest = $lev; 
    } 
} 

echo "Input word: ".$input."<br />"; 
echo "Did you mean: ".$closest."?<br />"; 
?> 
+0

Был ли y ou попробовать это с разными примерами? И вы проверили пример [levenshtein] (http://php.net/manual/en/function.levenshtein.php)? – agold

+0

Вот откуда я получил свою идею, мой код основан на примере с этого сайта. – Jay

+0

Что не так с вашим кодом? – desbest

ответ

0

В MySQL добавить Левенштейн функцию.

DELIMITER $$ 
CREATE FUNCTION levenshtein(s1 VARCHAR(255), s2 VARCHAR(255)) 
RETURNS INT 
DETERMINISTIC 
BEGIN 
DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; 
DECLARE s1_char CHAR; 
-- max strlen=255 
DECLARE cv0, cv1 VARBINARY(256); 
SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; 
IF s1 = s2 THEN 
RETURN 0; 
ELSEIF s1_len = 0 THEN 
RETURN s2_len; 
ELSEIF s2_len = 0 THEN 
RETURN s1_len; 
ELSE 
WHILE j <= s2_len DO 
SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; 
END WHILE; 
WHILE i <= s1_len DO 
SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; 
WHILE j <= s2_len DO 
SET c = c + 1; 
IF s1_char = SUBSTRING(s2, j, 1) THEN 
SET cost = 0; ELSE SET cost = 1; 
END IF; 
SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; 
IF c > c_temp THEN SET c = c_temp; END IF; 
SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1; 
IF c > c_temp THEN 
SET c = c_temp; 
END IF; 
SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; 
END WHILE; 
SET cv1 = cv0, i = i + 1; 
END WHILE; 
END IF; 
RETURN c; 
END$$ 
DELIMITER ; 

Примечание: - Этот ответ был добыт из ответов на этот стек переполнения вопрос How to add levenshtein function in mysql?

Совет: - Вы должны запустить этот SQL скрипт/код в MySQL консоли или PHPMyAdmin, как вы выполняете нормальные команды SQL.

И теперь вы можете использовать эту функцию, как этот

SELECT levenshtein('abcde', 'abced') 

Returns : 2 

В соответствии с вашей проблемой и словарем таблицы вы можете использовать эту команду SQL

SELECT `English` FROM `dict` 
ORDER BY 
levenshtein(`English`, 'USER_INPUT') 
ASC LIMIT YOUR_LIMIT(Number of suggestions you want) 

Примечание: - Вы должны сделать ФИЛЬТРАЦИЮ ON ВХОД ДЛЯ ПОЛЬЗОВАТЕЛЯ ДЛЯ ПРЕДОТВРАЩЕНИЯ ИНЪЕКЦИИ SQL И УДАЛЕНИЯ СПЕЦИАЛЬНЫХ ЧАРОВ (Это также улучшит скорость, а также предотвратит проблемы, связанные с инъекциями)