Я хочу иметь автозаполнение при поиске с помощью jQuery и Laravel. Но я получаю сообщение об ошибке, когда пользователь вводит хотя бы 2 буквы в поле поиска:
GET http://proj.test/autocomplete-search?term=ca 500 (Internal Server Error)
Вы знаете, в чем проблема? Я хочу отображать конференции по буквам, введенным пользователем в форму поиска.
Ввод поиска:
<div class = "col col-md-6">
<h4 class = "text-white text-center font-weight-bold">Search</h4>
<form class = "main-search">
<input type = "text" id = "search" class = "autocomplete dropdown-toggle" placeholder = "Conference, Citiy, Category">
</form>
</div>
Маршруты Laravel:
Route::get('/autocomplete-search', 'AutocompleteController@search');
Laravel AutomcompleteController:
class AutocompleteController extends Controller
{
public function search(Request $request){
$search = $request->term;
$conferences = Conference::where('name', 'LIKE', '%'.$search.'%')->get();
$data= [];
foreach ($conferences as $key => $value){
$data[] = ['id'=>$value->id, 'value' => $value->id + " " + $value->name];
}
//dd($data);
return response($data);
}
}
jquery:
$("#search").autocomplete({
source: "{{ URL::to('autocomplete-search') }}",
minLength: 2,
select:function(key, value)
{
console.info(value);
}
});
Обновлено: на вкладке «Сеть» ошибка отображается как:
{message: "A non-numeric value encountered", exception: "ErrorException",…}
и указывает на эту строку:
{function: "search", class: "App\Http\Controllers\AutocompleteController", type: "->"}". In "$data[] = ['id'=>$value->id, 'value' => $value->id + " " + $value->name];
У вашего поля ввода нет имени, поэтому PHP не понимает, что вы имеете в виду под $request->term. Вероятно, это ошибка.
Что-то краткое, что меня поразило: ' value' => $value->name + " " + $value->name - во-первых, есть пробел перед словом "значение", которого, вероятно, не должно быть, а во-вторых, почему вы дважды объединяете имя? Возможно, вы хотели написать 'value' => $value->id + " " + $value->name? Я сомневаюсь, что это источник ошибки, но он просто выделялся, когда я читал.
@Loek посмотрите на указанный URL в начале вопроса - похоже, он довольно успешно отправляет параметр "term" в строке запроса.
Спасибо, но та же ошибка с "$ data [] = ['id' => $ value-> id, 'value' => $ value-> id +" "+ $ value-> name];".
"та же ошибка" .... вы еще не нашли ошибку! Все, что у вас есть, - это общий ответ 500. Как я уже сказал, я не утверждал, что нашел исправление. Вам нужно найти настоящее сообщение об ошибке в журналах сервера.
@MarcinMagdziarz посмотрите на URL-адрес, о котором сообщается в начале вопроса - похоже, он довольно успешно переходит на URL-адрес, определенный в маршруте.
Jquery находится на той же странице ввода поиска.
@ADyson Ах да, я это пропустил! Тогда действительно нужно проверить журналы Laravel и / или сервера и посмотреть, помогают ли они выявить проблему.
Оно появляется на вкладке сети "{сообщение:" Обнаружено нечисловое значение ", исключение:" ErrorException ",…}.
он дает номер строки? Если нет, то трассировка стека в журналах должна дать единицу. Предположительно где-то есть поле, которое должно содержать число, но не
Появляется "{функция:" поиск ", класс:" App \ Http \ Controllers \ AutocompleteController ", тип:" -> "}". В "$ data [] = ['id' => $ value-> id, 'value' => $ value-> id +" "+ $ value-> name];".






Вы использовали оператор сложения (+), когда вам нужно было использовать оператор конкатенации строк (.).
Так
$data[] = ['id'=>$value->id, ' value' => $value->id + " " + $value->name]
должен стать
$data[] = ['id'=> $value->id, 'value' => $value->id . " " . $value->name]
в противном случае PHP думает, что вы пытаетесь добавить эти поля, хотя на самом деле это текст, который вы хотите поместить в одну переменную.
См. http://php.net/manual/en/language.operators.php для информации о том, какие операторы что делают в PHP.
Спасибо, знаете ли вы, почему, например, если пользователь пишет «co» и в базе данных есть конференция с именем «conf», она появляется в автозаполнении «conf conf», а не просто «conf»?
Вероятно, из-за того, что я упоминал в своих предыдущих комментариях - «'value' => $ value-> name.» «. $ Value-> name» дважды повторяет имя в выводе. Возможно, вы имели в виду "'value' => $ value-> id." ". $ Value-> name"? Я отредактирую свой ответ (как я редактировал ваш вопрос), чтобы отразить это изменение.
Ответ 500 означает, что это ошибка на стороне сервера, то есть код сервера по какой-то причине разбился. Он не выдает никаких подробностей клиенту на случай, если он непреднамеренно обнаружит что-то, что может использовать злоумышленник (например, данные базы данных или что-то еще). Поэтому вам нужно проверить журналы сервера, чтобы выяснить настоящую ошибку, и тогда вам будет легче узнать, как ее исправить.