Запрос AJAX PHP возвращает только первое слово в строке

Вопрос:

Я нашел этот код из w3schools (не судите меня).

http://www.w3schools.com/ajax/ajax_aspphp.asp

Его код, который позволяет сделать поле поиска похожим на то, как Google работает с AJAX.

Код работает отлично, однако в моем.php строки имеют более 1 слова, и он кажется, что только правильно выводится, если я ищу первое слово. Если я попытаюсь поместить что-нибудь в строку в поле ввода, он не будет выводиться. Например, мои строки могут быть:

$a[]="This is string 1."
$a[]="This is string 2."
$a[]="Is this string 3?"
$a[]="Is this string 4?"

Проблемы состоят в том, что если я наберу “Это”, он покажет только результаты, которые START с этим. Если я поставлю “string”, он скажет, что результатов нет. Есть предположения? Я уверен, что проблема в части PHP:

$q=$_REQUEST["q"]; $hint="";

if ($q !== "")
{ $q=strtolower($q); $len=strlen($q);
foreach($a as $name)
{ if (stristr($q, substr($name,0,$len)))
{ if ($hint==="")
{ $hint=$name; }
else
{ $hint .= "<br>$name"; }
}
}
}

// Output "no suggestion" if no hint were found
// or output the correct values
echo $hint==="" ? "Refine search values" : $hint;
?>

Лучший ответ:

Вы должны снова прочитать документацию о stristr(), особенно порядок аргументов:

string stristr(string $haystack , mixed $needle [, bool $before_needle = false ])

Итак, ваша линия

if (stristr($q, substr($name,0,$len)))

на самом деле

if (stristr($name, $q))

Поскольку вы не используете строку return by stristr(), вероятно, лучше использовать stripos()

if (stripos($name, $q) !== FALSE)

Если строки должны поддерживать Unicode, замените str* -функции на их соответствующие функции mb_str*.

Ответ №1

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

То, что вы хотите сделать, – это сделать сами себя, которые могут выполнять поиск по ключевым словам. Я оставлю это для вас, чтобы выяснить, как использовать эту функцию:

 if (strpos($str, $cont) !== FALSE)

Strpos проверяет, имеет ли значение $str значение $cont и возвращает true, если оно содержит это слово.

Ответ №2

Проблема возникает из-за этой строки

substr($name, 0, $len)

только соответствует содержимому [] с начала строки.

Ваш код должен быть

if ($q !== "")
{ $q=strtolower($q); // not needed //$len=strlen($q);
foreach($a as $name)
{ if (stristr($name, $q))
{ if ($hint==="")
{ $hint=$name; }
else
{ $hint .= "<br>$name"; }
}
}
}

Ответ №3

Проблема возникает из-за этой строки

$ hint. = “$ name”;

Оцените статью
TechArks.Ru
Добавить комментарий