“未定义的索引:名称” Laravel 5.7控制器

时间:2018-12-07 02:31:09

标签: php laravel

我是该博客的新手,因为有一段时间的问题而加入了我。

以下代码用于通过.csv文件将用户导入数据库,但是当我尝试导入用户时,出现以下错误。

8
"Undefined index: name"
"D:\xampp\htdocs\plataforma\app\Http\Controllers\UserController.php"
39
array:7 [▼
  "request" => Request {#43 ▶}
  "validator" => Validator {#257}
  "file" => UploadedFile {#247 ▶}
  "csvData" => """
    name,username,email,password,role,idSede,idManager\r\n
    Claudio Magallan,claudiomg,claudiomagallan@hotmail.com,secret,2,60,0\r\n
    Cristina Vargas,cristyvg,cristyvargas@institutodeventas.com,secret,3,61,4\r\n
    """
  "rows" => array:3 [▶]
  "header" => array:7 [▶]
  "row" => array:7 [▶]
]

非常感谢您的帮助,希望您能为我的问题提供帮助。 我附上我的控制器代码。

public function upload(Request $request) {
  $validator = Validator::make($request->all(), [
    'file' => 'required'
  ]);
  if ($validator->fails()) {
    return redirect()
    ->back()
    ->withErrors($validator);
  }
  $file = $request->file('file');
  $csvData = file_get_contents($file);
  $rows = array_map("str_getcsv", explode("\n", $csvData));
  $header = array_shift($rows);
  foreach ($rows as $row) {
    $row = array_combine($header, $row);
    User::create([
      'name' => $row['name'],
      'username' => $row['username'],
      'email'    => $row['email'],
      'password' => bcrypt($row['password']),
      'role'     => $row['role'],
      'idSede'   => $row['idSede'],
      'idManager'=> $row['idManager'],
    ]);
  }
  flash('Users imported');
  return redirect()->back();
}

错误标记下一行代码:

  

'name'=> $ row ['name'],

致谢!

1 个答案:

答案 0 :(得分:1)

以下更改可能有效:

$rows = array_map("str_getcsv", explode("\n", $csvData));
$header = array_shift($rows);
array_pop($rows); // delete the element
foreach ($rows as $row) { .. }

可以使用dump()dd()轻松调试Laravel:

foreach ($rows as $row) {
    $row = array_combine($header, $row);
    dump($row); // print the current row for debugging.
    User::create([
      'name' => $row['name'],
      ...
    ]);
  }

这将产生类似:

    array(7) {
        ["name"]=> "Claudio Magallan"
        ....
    }

    array(7) {
        ["name"]=> "Cristina Vargas"
        ....
    }

    bool(false)

因此,错误之前的最后一行是false,而不是数组。只需滤除此元素即可。

如果只有最后一行是垃圾,请使用array_pop($rows)删除$rows的元素。或手动删除CSV最后一行中的换行符。 如果更多行是垃圾,则可以使用array_filter删除不符合要求的行。例如:

$header = array_shift($rows);
$rows = array_filter($rows, function ($row) use ($header) {
    return count($row) === count($header);
});
foreach ($rows as $row) { .. }