使用Ajax在Laravel 5中进行实时搜索

时间:2016-06-19 08:06:40

标签: php jquery ajax laravel

我将项目转移到Laravel 5.我在导航栏中有一个实时搜索功能,可在您键入时列出数据库中的现有名称。

当我输入一个字母时,会调用Ajax中的url,但是在网络检查中会出现500错误。

任何人都知道解决方案吗?

搜索输入:

<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();
    });
});

JS脚本

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>';
    }

}

搜索控制器内的索引功能:

SELECT CASE WHEN t.ItemType = 'MD5' THEN 'NAM' ELSE t.country END as [Country],
       t.itemType
FROM YourTable t

2 个答案:

答案 0 :(得分:0)

您必须在请求中传递crsf令牌,因此请参阅手册:

您必须设置元标记:

<meta name="csrf-token" content="{{ csrf_token() }}" />

在你的js:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

https://laravel.com/docs/5.0/routing#csrf-protection

答案 1 :(得分:0)

500错误意味着您遇到服务器问题,因为您的路由看起来很简单,这表明它在您的控制器中。

您可以通过启用调试https://laravel.com/docs/5.2/errors#configuration

从应用中获取更多信息

错误可能是SearchController @ index是回显内容,而不是返回它(或更好的视图)。

Laravels响应类会在您的控制器(例如设置Cookie和标头)之后做很多繁重的工作,如果内容已经发送,可能会导致错误。

由于您的html相当简单,我建议将其移至视图并将数据传递到该视图。

当然,正如Joaquin Javi所说,使用csrf-token。