Я переношу проект в Laravel 5. У меня есть функция поиска в реальном времени внутри навигационной панели, которая перечисляет существующие имена в базе данных по мере ввода.
Когда я печатаю букву, вызывается URL-адрес внутри Ajax, но он дает ошибку 500 внутри проверки сети.
Кто-нибудь знает решение?
Вход для поиска:
<form action="/search" class="search_form" method="get" autocomplete="off"> <div class="form-field"> <input type="text" name="s" class="search_keyword" id="search_keyword_id" placeholder="Search the FTSE 100 & 250" required/> <button type="submit" class="search_button" onclick="submitdata()">Search</button> <div id="result"> </div> </div> </form>
Сценарий JS
<script type="text/javascript"> $(function () { $(".search_keyword").keyup(function () { var search_keyword_value = $(this).val(); var dataString = 'search_keyword=' + search_keyword_value; if (search_keyword_value != '') { $.ajax({ type: "POST", url: "/searching", data: dataString, cache: false, success: function (html) { $("#result").html(html).show(); } }); } return false; }); $("#result").live("click", function (e) { var $clicked = $(e.target); if (e.target.nodeName == "STRONG") $clicked = $(e.target).parent().parent(); else if (e.target.nodeName == "SPAN") $clicked = $(e.target).parent(); var $name = $clicked.find('.name').html(); var decoded = $("<div/>").html($name).text(); $('#search_keyword_id').val(decoded); }); $(document).live("click", function (e) { var $clicked = $(e.target); if (!$clicked.hasClass("search_keyword")) { $("#result").fadeOut(); } }); $('#search_keyword_id').click(function () { $("#result").fadeIn(); }); });
Маршрутизация:
Route::post('/searching', 'SearchController@index');
Функция индекса внутри контроллера поиска:
class SearchController extends Controller { public function index() { $search_keyword = $_POST['search_keyword']; $first_query = DB::table('ftse100')->select('name', 'symbol')-> where('symbol', 'like', '%' . $search_keyword . '%')->orWhere('name', 'like', '%' . $search_keyword . '%'); $query = DB::table('ftse250')->select('name', 'symbol')-> where('symbol', 'like', '%' . $search_keyword . '%')->orWhere('name', 'like', '%' . $search_keyword . '%') ->union($first_query)->get(); $bold_search_keyword = '<strong>' . $search_keyword . '</strong>'; if ($query) { foreach ($query as $rows) { echo '<div class="show" align="left"><span class="name">' . str_ireplace ($search_keyword, $bold_search_keyword, $rows['name']) . '</span></div>'; } } else { echo '<div class="show" align="left">No matching records.</div>'; } }
Вы должны передать токен crsf в запросе, поэтому, ссылаясь на руководство:
Вы должны установить метатег:
<meta name="csrf-token" content="{{ csrf_token() }}" />
И в ваших js:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
Ошибка 500 означает, что у вас проблема с сервером, так как ваша маршрутизация выглядит просто и просто, это говорит о ее в вашем контроллере.
Вы можете получить дополнительную информацию из приложения, включив отладку: https://laravel.com/docs/5.2/errors#configuration
Ошибка может быть указателем SearchController @, отражая содержимое, а не возвращающее его (или лучше представление).
Класс ответа Laravels делает много тяжелой работы после вашего контроллера (например, установка файлов cookie и заголовков), которые могут вызывать ошибки, если контент уже отправлен.
Поскольку ваш html довольно прост здесь, я бы предложил переместить его в представление и передать ваши данные в это представление.
И, конечно же, использовать csrf-токен, как сказал Хоакин Джави.