Php 如何导入带或不带标题的csv,并允许记录具有空列字段?

Php 如何导入带或不带标题的csv,并允许记录具有空列字段?,php,mysql,forms,csv,Php,Mysql,Forms,Csv,我已经看过其他的问题和答案了。我就是这样得到我正在使用的基本代码的。我根据自己的需要修改了它。基本上,我用的是两张桌子。第一个表创建一条记录,然后第二个表是csv文件的所有记录,它将刚刚在表1中创建的id复制到表2的job_id字段中 不起作用的是,如果csv行中的任何一行没有用所有列完全填充。代码只是将所有填充的行插入到数据库中,当它到达第一个具有空白列的行时,它停止运行。下面两个版本都不起作用 如果csv没有标题,这里是版本1 if ($_FILES[csv][size] > 0) {

我已经看过其他的问题和答案了。我就是这样得到我正在使用的基本代码的。我根据自己的需要修改了它。基本上,我用的是两张桌子。第一个表创建一条记录,然后第二个表是csv文件的所有记录,它将刚刚在表1中创建的id复制到表2的job_id字段中

不起作用的是,如果csv行中的任何一行没有用所有列完全填充。代码只是将所有填充的行插入到数据库中,当它到达第一个具有空白列的行时,它停止运行。下面两个版本都不起作用

如果csv没有标题,这里是版本1

if ($_FILES[csv][size] > 0) {

    include_once('db.php');
    //get the csv file
    $file = $_FILES[csv][tmp_name]; 
    $handle = fopen($file,"r");

    $job_name = $_POST['job_name'];
    $file_name = $_FILES[csv][name];
    $date_created = $_POST['date_created'];

    $sql = "INSERT INTO jobs (job_name, file_name, date_created) VALUES ('$job_name','$file_name','$date_created')";
    mysql_query($sql) or die(mysql_error());

    $job_id = mysql_insert_id();

    //loop through the csv file and insert into database
    do {
        if ($data[0]) {
            mysql_query("INSERT INTO people (job_id, company, first, last, address1, address2, city, state, zip, phone, email, tracking_number, year, make, model, image, misc1, misc2, misc3, misc4, misc5, misc6, list) VALUES ( '".$job_id."', '".addslashes($data[0])."', '".addslashes($data[1])."', '".addslashes($data[2])."', '".addslashes($data[3])."', '".addslashes($data[4])."', '".addslashes($data[5])."', '".addslashes($data[6])."', '".addslashes($data[7])."', '".addslashes($data[8])."', '".addslashes($data[9])."', '".addslashes($data[10])."', '".addslashes($data[11])."', '".addslashes($data[12])."', '".addslashes($data[13])."', '".addslashes($data[14])."', '".addslashes($data[15])."', '".addslashes($data[16])."', '".addslashes($data[17])."', '".addslashes($data[18])."', '".addslashes($data[19])."', '".addslashes($data[20])."', '".addslashes($data[21])."') ");
        }
    }
    while ($data = fgetcsv($handle,1000,",","'"));

    //redirect
    header('Location: upload.php?success=1&job_name='.$job_name.'&file_name='.$file_name.'&date_created='.$date_created.'&job_id='.$job_id.'');

    die;

}
如果csv在顶部有一行标题,那么这里是第二个版本

if ($_FILES[csv][size] > 0) {

    include_once('db.php');
    //get the csv file
    $file = $_FILES[csv][tmp_name]; 
    $handle = fopen($file,"r");

    // get headers
    $columns = fgetcsv($handle,1000,",","'");
    $column_list = implode(",",$columns);
    $column_list = "job_id,".$column_list;

    $job_name = $_POST['job_name'];
    $file_name = $_FILES[csv][name];
    $date_created = $_POST['date_created'];

    $sql = "INSERT INTO jobs (job_name, file_name, date_created) VALUES ('$job_name','$file_name','$date_created')";
    mysql_query($sql) or die(mysql_error());

    $job_id = mysql_insert_id();

    //loop through the csv file and insert into database
    while ($data = fgetcsv($handle,1000,",","'")) {
        if ($data[0]) {
            for ($i=0;$i<count($columns);$i++){
                $data[$i]="'".mysql_real_escape_string($data[$i])."'";
            }
            $values = implode(",",$data);
            $values = "'".$job_id."',".$values;
            mysql_query('INSERT INTO people ('.$column_list.') VALUES ('.$values.')');
        }
    }

    //redirect
    header('Location: upload.php?success=1&job_name='.$job_name.'&file_name='.$file_name.'&date_created='.$date_created.'&job_id='.$job_id.'&column_list='.$column_list.'&values='.$values.'');

    die;

}

您试图访问“截断”数据上不存在的数组键。看:

$data = fgetcsv($handle,1000,",","'")
这里正好构建了N个元素的数组,其中N是从CSV获得的值的计数。然后你打电话:

$data[$i]="'".mysql_real_escape_string($data[$i])."'";
对于范围
[0..columns-1]
中的
$i
。但是
数据
数组中的项目可能会更少。以下是热修复程序:

$data[$i]="'".mysql_real_escape_string( 
  ( array_key_exists( $i, $data ) ? $data[$i] : '' ) 
)."'";

UPD
if($data[0])
防止操作公司名称为空的行,因为
if(“”)
计算结果为
false

是否允许在
人员
表中使用空值?您的意思是允许空值?是的,它被设置为允许null。
$data[$i]="'".mysql_real_escape_string( 
  ( array_key_exists( $i, $data ) ? $data[$i] : '' ) 
)."'";