Php Laravel中的AJAX函数未将表单数据过帐到控制器

Php Laravel中的AJAX函数未将表单数据过帐到控制器,php,jquery,html,ajax,laravel,Php,Jquery,Html,Ajax,Laravel,我在Laravel有一个表单,用户可以在那里购买产品。我试图在不刷新页面的情况下动态地实现这一点。我可以调用AJAX函数,但它没有将数据发布到控制器,我需要帮助。控制器中的一切都非常正常,只是数据没有发送到它 这是HTML表单 <form class="buy-product-form" id="{{$product->id}}" action="/UoE/buy-product/{{$product->id}}" method="POST">

我在Laravel有一个表单,用户可以在那里购买产品。我试图在不刷新页面的情况下动态地实现这一点。我可以调用AJAX函数,但它没有将数据发布到控制器,我需要帮助。控制器中的一切都非常正常,只是数据没有发送到它

这是HTML表单

<form class="buy-product-form" id="{{$product->id}}" action="/UoE/buy-product/{{$product->id}}" method="POST">
                                    {{csrf_field()}}
                                    <button class="pull-right btn btn-primary">BUY NOW</button>
                                </form>
以下是控制器中的前几行

 public function buyProduct($university_code, $product_id){
        $player = Player::where('user_id', Auth::user()->id)->first();
        $product = Product::where('id', $product_id)->first();
        $totalPrice = $product->quantity_available * $product->price; 

看起来您无法提交表单,因为您的按钮不是提交按钮。

您没有将请求对象传递给控制器,但您已声明它包含两个参数。 在路由中,您只指定一个参数(
$product->id
)。 根据我的猜测,控制器方法应该是这样的:(编辑)

公共功能购买产品(请求$Request){
$product\U id=$request->id;//也可以是$product\U id=$request()->id;
}
访问
Request$Request
对象或
Request()

贴子url:
url:$(this).最近的(“form”).attr('action')
已经翻译成
/UoE/buy-product/{{{$product->id}}
,因此那里已经有了
产品->id
/
产品id

我的建议是将您的路线更改为最像post的路线
/UoE/buy product
,并传递数据(产品id和csrf令牌)


您的控制器操作需要两个参数
buyProduct($university\u code,$product\u id)
,但在表单操作中,您只传递产品id。

我刚刚经历了在Laravel中通过AJAX发布的头痛。我有和你类似的代码,但它不起作用。我做了一些改变:

标记没有任何操作

<form id="contact-form" class="main-form">

是的<代码>按钮
默认情况下元素是
type=“submit”
。*开始检查:控制台或调试栏中是否有输出?是否在ajax文件中发送csrf令牌(例如在站点元中)?表单中的{csrf_field()}}不在控制器的ajax帖子中,请参见:@jtwes我刚刚添加了meta标记和ajaxsetup函数。不幸的是,这仍然不起作用。你至少应该看到一些东西或得到一个错误。add error:function(response){console.log(response)}并成功地将响应输出到控制台。昨天我确实收到了一个Laravel verify CSRF令牌错误,但我记不起是什么原因造成的,因为我的ajax函数中甚至没有URL或任何内容。$university_代码参数是多余的,并且没有在控制器中实际使用。我将删除它。我只需要发送产品id,然后控制器为我处理所有事情。因此,如果URL操作中已经传递了product_id,那么我是否仍然需要使用请求对象,如果需要,其中包含什么?因为您正在执行POST请求,我假设您将向服务器“发布”数据。例如,获取表单
.buy product form
字段的值,并将其放入
数据:{}
请求正文中。因为您只需要product_id,所以不需要使用request对象。(不过,我建议使用
Route::post(“/UoE/buy product”)
然后将产品id放入
数据:{'id':产品id}
。然后您将访问
函数(Request$Request){$product\u id=$Request->id;}
)-但这只是我的观点!不管哪种方式适合你,哈哈,太谢谢你了,我现在已经开始工作了。我现在正试着按照你说的做,我想从URL中删除Product_id,只让它通过AJAX函数发送给控制器。但除非我把它放在URL里,否则它不会起作用。我只是想确保如果你明白我说的话,它不会被发送两次。非常欢迎。我在上面编辑了我的答案以便更清晰,也许这会有帮助?好luckI完全明白你想让我做什么。但是我的IDE说/UoE/buy product是一个未解析的文件或目录,链接不起作用。即使我在routes.php文件中更改了它
$(document).ready(function(){
            $('form.buy-product-form').on('submit', (function (e) {
                e.preventDefault();
                var product_id = $(this).closest("form").attr("id");

                //doesn't matter which csrf, they're all the same
                var csrf=document.querySelector("input[name='_token']").getAttribute('value'); 

                $.ajax({
                    url: `/UoE/buy-product',
                    type: 'POST',
                    data: {
                        'id': product_id,
                        '_token':csrf //pass CSRF
                    },
                    dataType: 'JSON',
                    success: function () {
                        window.alert(url);
                    }
                });
            }));
        });
<form id="contact-form" class="main-form">
<button class="btn btn-primary submit-button" type="button">Submit</button>
$(document).ready(function() 
{
    $(".submit-button").click(function(e){            
        form_data = $("form").serialize()
        $.ajax({
            url: "/contact",
            type: "POST",
            data: form_data,
            success: function(data) 
            {
                if ($.isEmptyObject(data.error))
                {
                    handleSuccess(data.success);
                }
                else
                {
                    handleError(data.error);
                }
            }
        });
    });
});