【问题标题】:Undefined offset error on php when importing a CSV导入CSV时php上的未定义偏移错误
【发布时间】:2015-11-21 16:06:47
【问题描述】:

我正在尝试将 CSV 文件导入到我的数据库中,并且最终成功执行。但是,在执行过程中,我收到“未定义的偏移量”错误消息,当我检查导入的数据时,我看到表中更新了一些空记录。如何避免将这些空单元格导入我的数据库?我也不想看到这些错误信息。

    <?php
require_once("database.php");

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);


// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

/// Delete table contents
$dsql = "TRUNCATE TABLE User_Mirror_Tbl";

if ($conn->query($dsql) === TRUE) {
  echo "Table content is truncated successfully". PHP_EOL;
  } else {
  echo "Error: " . $dsql . "<br>" . $conn->error;
  }


//read file
$csvfile=file_get_contents("/samba/import/User_Update_Tbl.csv");


//counters:
$record_number=0;
$record_number_err=0;

$lines = explode(PHP_EOL, $csvfile);
$array = array();
foreach ($lines as $line) {
    $field = str_getcsv($line);
      if $field[0] != ''){
$field[1]= ( $field[1] == '' ? NULL : $field[1]);
$field[6]= ( $field[6] == '' ? NULL : $field[6]);
$field[7]= ( $field[7] == '' ? NULL : $field[7]);
        $sql="INSERT INTO User_Mirror_Tbl (History_Record_ID, Employee_ID, Application_ID, User_Status, Record_Date, User_Name, User_Role, Last_Signon, UserKeyString)
                VALUES
                ('$field[0]','$field[1]','$field[2]','$field[3]','$field[4]','$field[5]','$field[6]','$field[7]','$field[8]') ";

        //insert record to database
        if ($conn->query($sql) === TRUE) {
        //      echo "New record created successfully". PHP_EOL;
                $record_number=$record_number+1;
        } else {
                echo "Error: " . $sql . "<br>" . $conn->error;
                $record_number_err=$record_number_err+1;

        }

}
}

echo $record_number.' Successful record and '.$record_number_err.' Unsuccessful record executed.';

$conn->close();



<?php
require_once("database.php");

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);


// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

/// Delete table contents
$dsql = "TRUNCATE TABLE User_Mirror_Tbl";

if ($conn->query($dsql) === TRUE) {
  echo "Table content is truncated successfully". PHP_EOL;
  } else {
  echo "Error: " . $dsql . "<br>" . $conn->error;
  }


//read file
$csvfile=file_get_contents("/samba/import/User_Update_Tbl.csv");


//counters:
$record_number=0;
$record_number_err=0;

$lines = explode(PHP_EOL, $csvfile);
$array = array();
foreach ($lines as $line) {
    $field = str_getcsv($line);
      if $field[0] != ''){
$field[1]= ( $field[1] == '' ? NULL : $field[1]);
$field[6]= ( $field[6] == '' ? NULL : $field[6]);
$field[7]= ( $field[7] == '' ? NULL : $field[7]);
        $sql="INSERT INTO User_Mirror_Tbl (History_Record_ID, Employee_ID, Application_ID, User_Status, Record_Date, User_Name, User_Role, Last_Signon, UserKeyString)
                VALUES
                ('$field[0]','$field[1]','$field[2]','$field[3]','$field[4]','$field[5]','$field[6]','$field[7]','$field[8]') ";

        //insert record to database
        if ($conn->query($sql) === TRUE) {
        //      echo "New record created successfully". PHP_EOL;
                $record_number=$record_number+1;
        } else {
                echo "Error: " . $sql . "<br>" . $conn->error;
                $record_number_err=$record_number_err+1;

        }

}
}

echo $record_number.' Successful record and '.$record_number_err.' Unsuccessful record executed.';

$conn->close();

【问题讨论】:

  • 在询问之前你有没有尝试过?这些将对您有所帮助:issetarray_key_exists。此外,您应该认真阅读 SQL 注入。
  • 亲爱的 rlanvin。我对这一切有点陌生。这就是为什么我问我如何使用这个问题。感谢您对 SQL 注入的建议。

标签: php mysql csv


【解决方案1】:

有时您需要忽略 csv 的最后一行或几行。我将顶部的忽略行数设置为 $start_offset,将底部要忽略的行数设置为 $end_offset。从零开始并增加直到偏移误差消失
我是这样做的:

$data = file_get_contents($filename);//load up csv

$data_array = explode("\n", $data);//break file into lines
$csv = array_map('str_getcsv', $data_array);//break up comma delimited
$csv_len = count($csv); //count of number of lines
$start_offset = 2;
$end_offset = 3;
for ($i=$start_offset; $i<$csv_len-$end_offset; $i++)
{
    //access columns as $csv[$i][0], $csv[$i][1] etc
}

【讨论】:

  • 感谢您的评论。当我将此部分插入代码时,运行代码后出现以下错误消息。 PHP 注意:使用未定义的常量 start_offset - 在 /var/www/html/iacd/mirrortableupdate.php 第 30 行假定为“start_offset”
  • 抱歉,在 start_offset 之前缺少 $。我编辑了我的代码并修复了它。
  • 你能发送一个示例 csv 文件吗?
  • 我认为在这个网站上添加文件是不可能的。
猜你喜欢
  • 2016-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多