繁体   English   中英

PHP-上传CSV时要遍历多行/行

[英]PHP - Iterate through multiple lines/rows when uploading CSV

我有一个当前的上传页面,我在其中上传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]."'";
}

更新以下是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];

我有点不清楚在哪里需要调用以中断每一行最后一列之后的行。

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

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

所以你需要做while($returnResult !== false){.....}

PHP文档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);
}

更新:

使用您发布的代码中的一些代码片段,这将从您的输入文件构建多插入语句 假定$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,名称,值,other_value)VALUES(100,'名称1','值1','其他1'),(101,'名称2','值2','其他2') ,(102,“名称3”,“值3”,“其他3”),(103,“名称4”,“值4”,“其他4”);

当然,您要在各个字段中读取CSV文件,然后将它们本质上串联回CSV列表中以进行插入。 如果在源文件中正确地对它们进行了转义,则仅使用括号内的fgets作为插入内容可能会更容易。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM