Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-上载CSV时迭代多行/多行_Php_Sql_Csv_Counter - Fatal编程技术网

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

PHP-上载CSV时迭代多行/多行,php,sql,csv,counter,Php,Sql,Csv,Counter,我有一个当前的上传页面,在那里我上传CSV文件,并将它们导入数据库。它可以很好地导入然后拆分到其他表中,但一个问题是它只导入CSV中的第一行。当前测试文件有6行,这些行应该在一次上载时全部导入。我觉得这要么使用计数器(++)要么使用换行符(/n)。以下是在我的SQL语句之前上载的主循环: for($tableno = 0;$tableno < sizeof($tablenames);$tableno++){ $q = ""; $q2 = ""; $q3 = ""; $q4 = ""; $q

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

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

您正在从文件指针读取一行-您需要迭代这些行,直到达到EOF。委员会明确指出:

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

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

的操作。上的第一个示例显示了如何循环文件中的行和行中的字段

$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);
}
它没有经过测试,但是在它的末尾,
$q
应该看起来像

插入示例中 (示例\u id、名称、值、其他\u值) 价值观 (100,‘名称1’、‘值1’、‘其他1’), (101,‘名称2’、‘值2’、‘其他2’), (102,‘名称3’、‘值3’、‘其他3’), (103,‘名称4’、‘值4’、‘其他4’)

当然,您正在将CSV文件读入各个字段,然后将它们连接回CSV列表以插入。如果它们在源文件中正确转义,那么只在括号中使用插入可能会更容易


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

用于csv读取的代码在哪里?刚刚用该代码编辑/更新,该代码包含前2列数组元素(尽管总共有200个)您使用的是什么数据库?插入数据时请使用参数。还要学习阅读文档:“fgetcsv-从文件指针获取行并解析CSV字段”-php.net/fgetcsvI请参见。我正在努力将其放入我现有的代码中,但实际上我会在我的“fgetcsv”代码下面做一个while循环,上面写着while$fgetcsv!=false,然后使用/n中断,直到文件结束?我“我在阅读文档,唯一让人困惑的是我的代码已经在字段中循环,它只是停在第一行的末尾。确实如此,但看起来你的工作有点颠倒了。”。我们没有剩下的代码,但看起来您正在遍历表列名列表,并尝试引用CSV文件中的匹配字段,而不是循环遍历CSV字段,然后将它们插入到INSERT语句的相应表列中。我将使用您的代码片段更新我的答案。谢谢。没错,我给每个列数组元素命名以匹配MySQL数据库,因为CSV每天都会被上传多次,并且总是以相同的顺序
$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);
}
$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, "," );