PHP - 上传CSV时迭代多行/行

时间:2017-04-06 03:48:49

标签: php sql csv counter

我有一个当前上传页面,我正在上传CSV文件并将其导入数据库。就导入然后拆分到其他表而言,它工作得很好,但唯一的问题是它只导入CSV中的第一行。当前测试文件有6行,应该在一次上传时导入。我觉得这会使用计数器(++)或换行符(/ n)。这是在我的SQL语句之前上传的主循环:

for($tableno = 0;$tableno < sizeof($tablenames);$tableno++){
$q = "";
$q2 = "";
$q3 = "";
$q4 = "";
$q5 = "";
$q6 = "";
$col_list = '`'.str_replace(',','`,`',$table_cols[$tableno]).'`';
$q .= "INSERT INTO ".$tablenames[$tableno]." (".$col_list.") VALUES (";
$last_id = mysqli_insert_id($connect);
$cols = explode(",",$table_cols[$tableno]);
$data = array();
foreach($cols as $key => $fldname) {
    $data[] = "'".$coldata[$fldname]."'";
}

UPDATE 以下是CSV读取的代码:

if(isset($_POST['submit']))
{

$file = $_FILES["file"]["tmp_name"];
$handle = fopen($file, "r");
$filesop = fgetcsv($handle, 0, ",");

$coldata = array();

$coldata[ "orderNumber" ] = $filesop[0];
$coldata[ "place" ] = $filesop[1];

在每行的最后一列之后需要调用的地方,我有点模糊。

2 个答案:

答案 0 :(得分:1)

您正在从文件指针中读取一行 - 您需要遍历这些行,直到您点击EOF。 docs明确指出:

  

如果提供了无效句柄,则fgetcsv()返回NULL;对于其他错误,包括文件结尾,则返回FALSE。

因此您需要执行while($returnResult !== false){.....}

之类的操作

答案 1 :(得分:1)

PHP documentation for fgetcsv上的第一个示例显示了如何遍历文件中的行以及行中的字段。

$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    // This loops through the lines
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $row++;
        // This loops through the fields
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}

更新:

使用已发布代码中的一些代码段,从您的输入文件构建multi-insert statement。它假定$col_list中的字段和csv文件中的相应字段的顺序相同。

$q .= "INSERT INTO {$tablenames[$tableno]} ({$col_list}) VALUES "
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $rows[] = " ( '" . implode( $data, "','" ) . "' )";
    }
    fclose($handle);
}
$q .= implode( $rows, "," );

它未经测试,但最后$q应该看起来像

  

INSERT INTO示例     (example_id,name,value,other_value)   VALUES     (100,'姓名1','价值1','其他1'),     (101,'姓名2','价值2','其他2'),     (102,'姓名3','价值3','其他3'),     (103,'姓名4','价值4','其他4');

当然,您正在将CSV文件读入各个字段,然后基本上将它们连接回CSV列表以进行插入。如果它们在源文件中被正确转义,则可能更容易在插入的括号内使用fgets

注意在插入数据库之前,您需要进行一些数据清理和转义。