Laravel 使用 AJAX 将 Javascript 变量传递给 PHP 并检索那些

Posted

技术标签:

【中文标题】Laravel 使用 AJAX 将 Javascript 变量传递给 PHP 并检索那些【英文标题】:Laravel Using AJAX to pass Javascript variable to PHP and retrieve those 【发布时间】:2016-11-21 00:27:59 【问题描述】:

如何使用 Ajax 将 javascript 变量传递给 php 并检索这些变量?

我正在使用 Jquery Ui Slider,并且在每张幻灯片上我想将 javascript 滑块值传递给 php。

我在 Ajax 方面没有(不多)经验,非常感谢帮助。

这是我的滑块的外观:

    $("#sliderNumCh").slider(
        range: "min",
        min: 0,
        max: 20,
        step: 1,
        value: numbersOfChapters,
        change : function(e, slider)
            $('#sliderAppendNumCh').empty();
            var i = 0;
            var sliderValue = slider.value;
            var getSliderVal = document.getElementById('sliderValue').value = sliderValue;

            $.ajax(
                type: 'POST',
                url: '',
                headers: 'X-Requested-With': 'XMLHttpRequest',
                data: 
                    value: getSliderVal
                ,
                success: function (option) 
                    console.log(getSliderVal);
                
            );
            ...
      
  )

我的路线示例:

编辑我的路线现在看起来像这样:

Route::post('edit/productID', ['as' => 'editProductPost', 'uses' => 'ProductController@editProduct']);

编辑我尝试过的内容:

url: ' route("editProductWeb") ',

得到了这个错误:

POST http://localhost/myApp/public/product/edit/%7BproductID%7D 500 (Internal Server Error)

并尝试过:

url: 'edit',

得到了这个错误:

POST http://localhost/myApp/public/product/edit 500 (Internal Server Error)

编辑我的编辑控制器方法:

public function editProduct($productRomID = 0)

    $product = ProductRom::find($productID);
    $sheets  = Chapters::where('product_id', '=', $productID)->get();

    $productId = $product->id;

    $sheetCount    = count($sheets);

    return view('product.edit', [
        'productId' => $productId,
        'product' => $product,
        'sheets' => $sheets,
        'sheetCount' => $sheetCount,
        'type' => 'edit',
        'route' => 'updateProductRom'
    ]);

编辑到目前为止使用 haakym 建议:

            $.ajax(
                type: 'post',
                url: " Route('editProduct', $product->id) ",
                headers: 'X-Requested-With': 'XMLHttpRequest',
                data: 
                    value: getSliderVal,
                    productId : getPrId
                ,
                success: function (option) 
                    console.log(getSliderVal);
                
            );

确实在我的调试中打印了 id + 当前滑块值,所以到目前为止有效。现在我需要获取该值并在我的视图中使用它(php)任何建议如何继续?

在我的控制器方法中使用它:

$sliderValue = $request->input('value');

还给我

编辑我也试过这个:

$sliderValue = Input::get('value');

这也让我回来了

编辑我添加了一个日志:

Log::info(Input::all());

这会在幻灯片上显示正确的滑块值和产品 ID。 但是我的Input::get('value') 仍然返回给我null

编辑我想我应该添加以下信息:

我现在将路线更改为:

Route::get('edit/productID', ['as' => 'editProduct', 'uses' => 'ProductController@editProduct']);
Route::post('edit/productID', ['as' => 'editProductPost', 'uses' => 'ProductController@editProductPost']);

get 显示特定产品的数据库中的数据并显示在我的视图中,我添加了 post 一个以将滑块值数据发布到 editProductPost 方法并随后返回值(滑块值)在编辑视图中,这是正确的吗?(顺便说一句仍然不起作用)

编辑

如果我把它放在我的控制器方法中:

if ($request->isMethod('post'))
    return response()->json(['response' => 'This is post method']);


return response()->json(['response' => 'This is get method']);

我不断收到以下错误(如果我滑动):

POST http://localhost/myApp/public/product/edit/54 500(内部 服务器错误)

我有这个想法:

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

并将其放在我的 ajax 帖子之前:

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

编辑:

这样做会在日志中返回正确的当前滑块值:

Log::info($request->get('value'));

我试过这个:

    return view('productRom.edit', [
        'value' => $value,
    ]);

但我在控制台中收到错误:

加载资源失败:服务器响应状态为 500 (内部服务器错误)http://localhost/myApp/public/product/edit/73

【问题讨论】:

从这里看起来不错。您只需将控制器/方法的 URL 放入您的 $.ajax 'url' 参数中,然后它就可以工作了 ty,所以我必须在url 中添加edit 我在问题中发布了上面的路线 你可以试试 url: '/edit',如果它不起作用,试试完整的 URL :) /edit 是绝对路径对吗?他应该只使用编辑。 我收到此错误消息POST http://localhost/myApp/public/product/edit 500 (Internal Server Error) 【参考方案1】:

正如 @julqas 所说,您需要在 $.ajax() 方法中包含 URL。

由于您有一个命名路由editProduct,您可以使用刀片输出链接:

$.ajax(
  type: 'POST',
  url: ' route("editProduct" ',
  ...

编辑 1

您的路线是get,而您的ajax 方法是post,我想这就是问题所在。您需要使它们相同。

如果您将路由更改为post,则需要在发送时将 CSRF 令牌添加到 ajax 请求中。这里有一些关于如何执行此操作的文档的指导:

https://laravel.com/docs/5.2/routing#csrf-x-csrf-token

文档建议在您的 html 头中添加此内容:

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

然后在发送请求之前使用以下代码:

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

或者,您可以将其添加到 ajax 调用中的请求中。

编辑 2

附带一点 - 我只是在猜测错误是什么,如果我问你是否可以自己调试它以查看错误是什么会更好。学习调试 ajax 请求非常有用,也不是太难。

最好的方法是在发出 ajax 请求时在您选择的浏览器中使用开发者控制台。例如,如果您使用 Chrome,请打开 Developer tools,然后在发出请求之前单击 Network 选项卡。发出请求后,您可以检查请求及其详细信息。希望对您有所帮助!

编辑 3

我会将您的 editProduct() 方法更改为不接受任何参数,而是从请求中获取产品的 id

public function editProduct()

    // value here is referring to the key "value" in the ajax request
    $product = ProductRom::find(\Request::get('value');
    ...

考虑将 json 中的 value 键更改为更有用的东西,例如 productId

data: 
    productId: getSliderVal

【讨论】:

谢谢,但我收到此错误POST http://localhost/myApp/public/product/edit/%7BproductID%7D 500 (Internal Server Error) 谢谢我改变了它(发布的路线,添加了 csrf 元,并在我的 ajax 帖子之前添加了 ajax 标头)但我得到了同样的错误 @JohnDoe2 检查我的编辑,如果不清楚请告诉我! 1.您可以使用开发人员解决和网络选项卡获取完整的错误详细信息吗? 2. 这可能是因为您的路由定义没有定义参数,而您的评论中的错误显示了某种参数edit/%7BproductID%7D - 您的edit() 方法在您的控制器中是什么样的? 好吧,我按你说的调试它,一会儿把编辑方法贴出来【参考方案2】:

您尚未输入“url”的值。创建任何路线,然后将其放入 url:'any_route_name' 中,然后在控制台天气中检查您的值是否已发布

为此,您必须在您的水平上进行一些研发。

【讨论】:

以上是关于Laravel 使用 AJAX 将 Javascript 变量传递给 PHP 并检索那些的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用 AJAX 将 Javascript 变量传递给 PHP 并检索那些

如何使用ajax将数据从视图发送到控制器laravel?

在 Laravel 中使用 Ajax 将数据插入 MySQL

如何在 laravel 中使用 ajax 发布请求将图像插入数据库?

如何在 Laravel 中使用 Ajax 调用将数据发布到数据库?

将 Ajax 数据发送到 Laravel 控制器