提交ajax请求时,为什么请求会随机变空?

时间:2018-03-20 14:07:10

标签: php ajax laravel-forge

问题

通过ajax发送的请求在控制器中为空,结果为

  

为foreach()提供的参数无效

大多数请求都是在没有问题的情况下提交的,并且具有请求中预期的数据。该错误似乎是随机,即使复制了错误接收的用户输入,我们也无法重现错误。

从PHP 7.0更新Laravel Forge到PHP 7.1后出现问题。一旦我们注意到错误,我们将其降级为PHP 7.0,但错误仍然存​​在。

我们所知道的

  • 似乎没有任何关系
    • 浏览器
    • 浏览器版本
    • 用户输入
  • 请求通过ajax
  • 提交
  • 控制器顶部的请求中没有数据

通过ajax

发送数据的相关代码

简化表单HTML

<form>
  <label>First name:</label>
  <input type="text" name="firstname">
  <label>Last name:</label>
  <input type="text" name="lastname">
</form> 

的Javascript

var signatureImageUrl = $("#jSignature").get(0).toDataURL();

$.ajax({
    method: "POST",
    url: "submit",
    contentType: "application/x-www-form-urlencoded; charset=UTF-8",
    data: {
        "visit_data": $("form").serializeArray()
    }
});

在控制器中抛出错误的相关代码

public function submit(Request $request) {
    try {
        foreach ($request->input('visit_data') as $index => $visitComponent) {
            // Iterates over data
        }
    } catch (\ErrorException $e) {
        // Handles error
    }
}

问题

为什么提交ajax请求时请求会随机变空?

1 个答案:

答案 0 :(得分:1)

当问题发生时,无法查看客户端的开发人员工具/控制台,几乎不可能回答这个问题。你可以做一些事情,这样用户就不会在屏幕上看到一些奇怪的错误:

if(!empty($request->input('visit_data')) { foreach ($request->input('visit_data') as $index => $visitComponent) { // Iterates over data } } 期望发送一个数组和一个空字符串。你应该在处理之前测试空虚:

if(isset($request->input('visit_data')) && !empty($request->input('visit_data')) {
    foreach ($request->input('visit_data') as $index => $visitComponent) {
        // Iterates over data
    }
}

如果AJAX调用发送空请求,您可以添加额外的检查以确保变量已设置且不为空:

UPDATE table SET points=IF(age>20,15,10)