【问题标题】:Laravel - 500 (Internal Server Error) on Ajax CallLaravel - Ajax 调用时出现 500(内部服务器错误)
【发布时间】:2020-02-06 01:28:26
【问题描述】:

关于我的上下文,我一直在尝试本教程 (https://www.youtube.com/watch?time_continue=7&v=D4ny-CboZC0),但我收到了这个错误:

POST http://127.0.0.1:8000/transactions/fetch500(内部服务器错误)

create.blade.php

@extends('layouts.app')
@section('title', 'New Transaction')
@section('content')
<form action="/transactions" method="POST">
    <div class="row">
        <label>Item Name</label>
        <input type="text" name="item_name" id="item_name" class="form-control input-lg" placeholder="Item Name">
        <div id="itemList"></div>
        {{ csrf_field()}}
        <label>Quantity</label>
        <input type="text" name="quantity[]"  value="" placeholder="Quantity">
        {{ $errors->first('quantity')}}
    </div>
    <button type="submit" class="btn btn-primary">Complete Order</button>
    @csrf
</form>

<script type="text/javascript">
$(document).ready(function(){
    $('#item_name').keyup(function(){
        var query = $(this).val();
        if(query!=''){
            var _token = $('input[name="_token"]').val();
            console.log(_token);
            $.ajax({
                url: "{{route('autocomplete.fetch')}}",
                method: "POST",
                data: {query: query, _token:_token},
                success:function(data){
                    $('#itemList').fadeIn();
                    $('#itemList').html(data);
                }
            })
        }
    });
})
</script>
@endsection

TransactionController.php中的获取函数

public function fetch(Request $request)
{
    if($request->get('query')) {
        $query= $request->get('query');
        $data = DB::table('items')
        ->where('item_name', 'LIKE', '%{$query}%')
        ->get();
    }

    $output = '<ul class="dropdown-menu" style="display:block; position:relative">';
    foreach ($data as $row) {
        $output.= '<li> <a href="#">' .$row->item_name.'</a></li>';
    }
    $output .= '</ul>';
    echo $output;
}

web.php

Route::resource('transactions', 'TransactionController');
Route::post('/transactions/fetch', 'TransactionController@fetch')->name('autocomplete.fetch');

请帮助我找出问题所在。我尝试了很多网上看到的方法,但都没有奏效。

提前致谢!

【问题讨论】:

  • 日志中的错误是什么?您可以在storage/logs 中找到它
  • 请转到您的网络。您将在那里找到错误详细信息。
  • 如果你得到一个 500 错误,很有可能你的 Laravel storage/logs 没有得到这个错误。另请检查网络服务器错误日志。
  • @ChinLeung 感谢您的帮助。我可以通过并修复它。但是现在我可以看到 $data 变量是空的。该查询未获取任何值。我已经交叉检查了表名和列名。知道为什么它没有得到任何数据吗?
  • 我认为您需要将引号 '%{$query}%' 更改为 "%{$query}%",因为单引号不允许您在其中使用变量 stackoverflow.com/a/3446286/8068675

标签: javascript php ajax laravel laravel-5.8


【解决方案1】:

您非常接近获得解决方案。但我认为你的错误来自这里: 您的控制器中的 $data 变量将是一个数组,因此在您的 foreach 正文中,您从这里得到一个错误

$row->item_name

所以不要这样:

$data = DB::table('items')
       ->where('item_name', 'LIKE', '%{$query}%')
       ->get();

这样写(假设你的模型名称是“Item”):

$data = Item::where('item_name', 'LIKE', '%{$query}%')->get();

恕我直言,这将解决问题。但这只会返回区分大小写的值。例如,如果您输入“abc”,它不会返回带有“ABC”的单词。因此,您可以将 2 面设为大写并进行比较。像这样:

$data = Item::whereRaw("UPPER(item_name) LIKE '%" . strtoupper($query) . "%'")->get();

如果你想继续搜索特殊字符,那么我认为这个答案不仅仅是你问题的答案。 但此时我建议你使用最后一行。

【讨论】:

  • 成功了。但是你能解释一下为什么它不能正常工作吗?
  • 关于区分大小写,取决于排序规则。 utf8_general_ci 将不区分大小写,而 utf8_general_cs 将区分大小写
  • $items = DB::table('items')->where(...)->get() 将返回一个数组。但是 $items = Item::where(...)->get() 将返回一个集合。这就是为什么您在使用 DB Query 时无法访问 $data->something
  • 不要按原样使用最后一个示例。永远不要将未转义/未清理的数据直接传递到原始 SQL。 owasp.org/index.php/SQL_Injection
  • @deefour 模型方法不支持 PDO 吗?据我所知,我们不应该使用数据库查询,但我们可以使用模型方法,或者在糟糕的情况下我们可以使用绑定.. 不是吗?
【解决方案2】:

请您使用-&gt;where('item_name', 'LIKE', '%' . $query . '%') 代替-&gt;where('item_name', 'LIKE', '%{$query}%')

if($request->get('query')){
      $query= $request->get('query');
      $data = DB::table('items')
              ->where('item_name', 'LIKE', '%' . $query . '%')
              ->get();
}

它对我有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2017-04-12
    • 2020-02-12
    • 2018-04-16
    相关资源
    最近更新 更多