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

Posted

技术标签:

【中文标题】如何在 Laravel 中使用 Ajax 调用将数据发布到数据库?【英文标题】:How to post data to database using Ajax call in Laravel? 【发布时间】:2015-07-18 08:36:08 【问题描述】:

我有一个订阅框:

我的目标是当用户输入电子邮件时,我想将其保存到我的数据库中。

我已经知道如何通过 Laravel 使用表单发布来实现这一点。


通过 Laravel 形成 POST

public function postSubscribe() 

    // Validation
    $validator = Validator::make( Input::only('subscribe_email'),

        array(

            'subscribe_email'  => 'email|unique:subscribes,email',
            )
        );

    if ($validator->fails()) 

        return Redirect::to('/#footer')
        ->with('subscribe_error','This email is already subscribed to us.')
        ->withErrors($validator)->withInput();

    else

        $subscribe        = new Subscribe;
        $subscribe->email = Input::get('subscribe_email');
        $subscribe->save();

        return Redirect::to('/thank-you');

    



现在,我想使用 Ajax 调用来避免页面加载并了解有关 Ajax 的更多信息。这是我尝试过的:


表格

!! Form::open(array('url' => '/subscribe', 'class' => 'subscribe-form', 'role' =>'form')) !!

<div class="form-group col-lg-7 col-md-8 col-sm-8 col-lg-offset-1">
  <label class="sr-only" for="mce-EMAIL">Email address</label>
  <input type="email" name="subscribe_email" class="form-control" id="mce-EMAIL" placeholder="Enter email" required>

  <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
  <div style="position: absolute; left: -5000px;"><input type="text" name="b_168a366a98d3248fbc35c0b67_73d49e0d23" value=""></div>
</div>
<div class="form-group col-lg-3 col-md-4 col-sm-4"><input type="submit" value="Subscribe" name="subscribe" id="subscribe" class="btn btn-primary btn-block"></div>


!! Form::close() !!

Ajax 调用

<script type="text/javascript">
  $(document).ready(function()
    $('#subscribe').click(function()
      $.ajax(
        url: '/subscribe',
        type: "post",
        data: 'subscribe_email':$('input[name=subscribe_email]').val(), '_token': $('input[name=_token]').val(),
        dataType: 'JSON',
        success: function (data) 
          console.log(data);

        );
    );
  );
</script>

控制器

public function postSubscribeAjax() 

        // Getting all post data

        if(Request::ajax()) 
            $data = Input::all();
            die;
        

        dd($data);
    

路线

Route::post('/subscribe','SubscribeController@postSubscribeAjax');


结果

我不断得到:

未定义变量:数据

这意味着我的Request::ajax() 不包含任何内容?这是为什么呢?

如何使用 Ajax 调用来实现这一点?

【问题讨论】:

【参考方案1】:

已在 Chat 中解决

我们必须修复几个语法错误并将输入按钮更改为 html 按钮,以防止表单提交。我们可以通过其他方式来做到这一点,但这很有效。


所以我将在这里解决一些问题。从底部开始向上移动!

路线

您可以不使用斜线来执行此操作。 Route::post('subscribe','SubscribeController@postSubscribeAjax');

控制器

您的控制器已经足够好,但您需要实际显示来自 ajax 的结果。我们会处理的。

如果有 Ajax 请求,请删除检查中的 die

Ajax

<script type="text/javascript">
  $(document).ready(function()
    $('#subscribe').click(function(e)
         e.preventDefault(); // this prevents the form from submitting
      $.ajax(
        url: '/subscribe',
        type: "post",
        data: 'subscribe_email':$('input[name=subscribe_email]').val(), '_token': $('input[name=_token]').val(),
        dataType: 'JSON',
        success: function (data) 
          console.log(data); // this is good
        
      );
    );
  );
</script>

表格

很确定表格是好的。

【讨论】:

天哪,你太棒了。感谢您分享您的知识。 :D 在我的控制器中,我尝试了dd(Request::ajax()); 我得到了false,我想看到真假? 我不知道我现在该怎么办,$data = Input::all(); 永远不会跑。 当它是一个 ajax 请求时,您应该会看到 true。所以我们需要在这里仔细检查一些东西......页面是使用 ajax 提交还是显示给你一个控制台?? Request::all() 有什么好处??【参考方案2】:

假设您的 postSubscribeAjax 方法中发生“未定义变量”错误,您的范围似乎有问题。具体来说,当 php 解释器到达dd($data) 行时,变量$data 尚未定义。

这并不奇怪,因为 $data 是在 if 语句之后的代码块内分配的 - 它在该块之外不可用。

您可以通过在if 语句之前添加$data = null; 来解决此问题,但是...这只会向您表明您遇到了不同的问题。原因如下:

您收到“未定义变量”错误。这意味着您的代码正在跳过 if 块(我怎么知道这一点?因为如果它没有跳过它,它将执行 die 语句并且您永远不会看到错误)。这意味着您的代码没有正确地将请求识别为 AJAX 请求。

我要做的是:完全跳过 if 块。只需获取您的数据并进行处理。

我已经有一段时间没有看到这些东西了,但是 IIRC,没有可靠的方法来检测 AJAX 请求。对于服务器来说,AJAX 请求就像任何其他请求一样。一些 Javascript 库(包括 jQuery,如果我没记错的话)在请求上设置了一个标头以将其标识为 AJAX,但它既不是普遍需要也不是普遍检测到的。

此 AJAX 检测的唯一好处是防止您的用户直接从浏览器访问 AJAX URL。而且,最终,如果有人真的想要这样做,你无法阻止他们,因为他们可以(通过一点工作)欺骗任何请求。

【讨论】:

应该仍然是 5 的一部分,但请参阅 4 上的 ajax 文档

以上是关于如何在 Laravel 中使用 Ajax 调用将数据发布到数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用json将数据传递给ajax函数?

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

如何在 AJAX 调用中获取 JavaScript 变量作为 Laravel 路由名称

我如何在 laravel 中调用 ajax 文件

如何从 laravel 中的 ajax 调用中获取值

在 laravel 中使用视图作曲家将数据传递给惯性js