Php 为什么fgetcsv跳过第一行?

Php 为什么fgetcsv跳过第一行?,php,csv,Php,Csv,我使用php函数fgetcsv来读取csv文件。csv文件的结构是,第一行包含我要导入的数据,而不是列标题。我想从第一行导入,但是我注意到第一行被忽略了 如果我将第一行留空,同样的行为将持续。只有当我在第一行的单元格中添加一些伪数据时,包含我想要导入的数据的第二行才实际导入,之后的所有其他行都会按照预期导入 <?php $handle = fopen($_FILES['materials']['tmp_name'], "r"); $data = fgetcsv($handle, 1000,

我使用php函数fgetcsv来读取csv文件。csv文件的结构是,第一行包含我要导入的数据,而不是列标题。我想从第一行导入,但是我注意到第一行被忽略了

如果我将第一行留空,同样的行为将持续。只有当我在第一行的单元格中添加一些伪数据时,包含我想要导入的数据的第二行才实际导入,之后的所有其他行都会按照预期导入

<?php
$handle = fopen($_FILES['materials']['tmp_name'], "r");
$data = fgetcsv($handle, 1000, ",");

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
    if($this->checkMaterialsDuplicate($data[3]) != false) {
        Session::setSession('import_failure', 'The Materials for TX '.
            $this->_tx_no.' have already been added.');
        Helper::redirect('?section=store&subsection=import_design&page=import_design');
    }
    echo "<pre>";print_r($data);echo "</pre>";exit;
    $this->_fields[] = 'implicit_qty_of_fittings';
    $this->_values[] = $this->db->escape($data[1]);

    $this->_fields[] = 'qty_of_desired_materials';
    $this->_values[] = $this->db->escape($data[2]);

    $this->_fields[] = 'tx_no';
    $this->_values[] = $this->db->escape($data[3]);

    $this->_fields[] = 'contractor_name';
    $this->_values[] = $this->db->escape($data[4]);

    $this->_fields[] = 'contractor_id';
    $this->_values[] = $this->db->escape($data[5]);

    $this->_fields[] = 'issue_date';
    $this->_values[] = $this->db->escape($data[6]);

    $this->_fields[] = 'due_date';
    $this->_values[] = $this->db->escape($data[7]);

    $this->_fields[] = 'fitting_id';
    $this->_values[] = $this->db->escape($data[8]);

    $this->_fields[] = 'qty_multiplied_fittings';
    $this->_values[] = $this->db->escape($data[9]);

    $this->_fields[] = 'imported';
    $this->_values[] = 1;

    $sql  = "INSERT INTO `{$this->_table_6}` (`";
    $sql .= implode("`, `", $this->_fields);
    $sql .= "`) VALUES ('";
    $sql .= implode("', '", $this->_values);
    $sql .= "')";

    if (!$this->db->query($sql)) {
        $error[] = $sql;
    }

    $this->_subcontractor_name = $data[4];
    $this->_subcontractor_id = $data[5];
    unset($this->_fields);
    unset($this->_values);
}

链接到示例csv

在循环开始之前,您有一个对fgetcsv的额外调用-这将获取第一行,然后丢弃它,这意味着循环将从第二行开始

只要拆下这根线,它就会正常工作


在循环开始之前,您有一个对fgetcsv的额外调用-这将获取第一行,然后丢弃它,这意味着循环将从第二行开始

只要拆下这根线,它就会正常工作


并没有这样的选项可以跳过文件中的第一行,通常开发人员会手动添加这种行为。你能添加文件头5-10行吗?这样我们就可以重现你的问题嘿,alexander,这里有一个指向示例文件的链接,你可以看到,第一行的第一列的值为553,但是导入时,以值554开头的行是第一个在$data变量上使用print_r打印出来的行。Iainn已经添加了正确的回答谢谢@alexander.Polomodova没有跳过文件中第一行的选项,通常是开发人员手动添加此行为。你能添加文件头5-10行吗?这样我们就可以重现你的问题嘿,alexander,这里有一个指向示例文件的链接,你可以看到,第一行的第一列的值为553,但是导入时,以值554开头的行是第一个使用$data变量print_r打印出来的行。Iainn已经添加了正确的答案谢谢@alexander.polomodov
$data = fgetcsv($handle, 1000, ",");