2016-06-19 21 views
0

プロジェクトをLaravel 5に転送しています。入力時にデータベースの既存の名前をリストするナビゲーションバー内にライブ検索機能があります。Larvel 5内でAjaxを使用して検索

文字を入力すると、Ajax内のURLが呼び出されますが、ネットワーク検査で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', '[email protected]'); 

検索コントローラ内部のインデックス機能:

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

} 
+0

入手している500エラーに関する詳細情報を提供できますか? 'debug'toをtrueにすると詳細が得られます。 –

答えて

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

0

500エラーは、あなたのルーティングが正常に見えるとシンプルな、これはあなたのコントローラでそのことを示唆しているので、あなたは、サーバーに問題があることを意味します。

あなたは、デバッグをオンにしてアプリからより多くの情報を得ることができます。https://laravel.com/docs/5.2/errors#configuration

エラーがコンテンツをインデックス@ SearchControllerをエコーされ、よりもむしろ(またはより良いビュー)を返すことがあります。

Laravelsレスポンスクラスは、コンテンツが既に送信されているとエラーを引き起こす可能性のあるコントローラ(Cookieやヘッダーの設定など)の後に大量に持ち上げます。

ここであなたのHTMLはかなりシンプルなので、ビューに移動してデータをそのビューに渡すことをお勧めします。

もちろん、Joaquin Javiがすでに言っているように、csrfトークンを使用してください。

関連する問題