如何在php中修复“未捕获的错误:在null上调用成员函数insertOne()”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在php中修复“未捕获的错误:在null上调用成员函数insertOne()”相关的知识,希望对你有一定的参考价值。

我按照这里介绍的解决方案https://stackoverflow.com/a/36041188/11295637创建了一个新的csv文件,并将一个大型csv文件的特定列提取到新的。但是,我收到此错误:未捕获错误:在null上调用成员函数insertOne()。

代码如下:

php

$new= Writer::createFromPath('path	ofile', 'w+');
$filename= Reader::createFromPath($filename, 'r');
          $filename->setOffset(1);
          $filename->each(function ($row) use ($indexes) {
            $new->insertOne($row);
            return true;
          });

问题是新变量未定义。我也试过了

php
$new= Writer::createFromFileObject(new SplTempFileObject());

但我得到了同样的错误。

答案

在PHP中,如果要引用在函数外部定义的变量,则必须(a)在匿名函数签名中使用use限定符或(b)在函数内使用global语句。

在您的情况下,您有一个use限定符,但它引用了一个变量$indexes。我没有在你的代码中看到$ indexes变量,所以你需要在该列表中添加$ new或者用$ new替换$ indexes。

$new = Writer::createFromPath('path	ofile', 'w+');
$filename = Reader::createFromPath($filename, 'r');
$filename->setOffset(1);
$filename->each(function ($row) use ($new) {
    $new->insertOne($row);
    return true;
});

要仅选择$indexes变量中指定的索引,应从$ row中选择某些键,然后重新构建新行。你可以使用array_fliparray_intersect_key来做到这一点。

// convert [cat, dog] => [cat => 0, dog => 1]
$indexKeys = array_flip($indexes);
$filename->each(function ($row) use ($new, $indexKeys) {
    $selectedCols = array_intersect_key($row, $indexKeys);
    $new->insertOne($selectedCols);
    return true;
});

以上是关于如何在php中修复“未捕获的错误:在null上调用成员函数insertOne()”的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的错误:在 null 上调用成员函数 select()

如何在 PHP 中修复警告非法字符串偏移

如何修复php中日期到日期之间的错误

如何在 PHP 8 中修复这个动态 SQL 查询功能?

如何修复来自 PHP 中 date() 的警告" [重复]

如何修复 PHP MySQL 中达到 508 资源限制