Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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
使用csv在php中导入20k详细信息_Php_Csv - Fatal编程技术网

使用csv在php中导入20k详细信息

使用csv在php中导入20k详细信息,php,csv,Php,Csv,我正在尝试插入一个至少有20k行的csv文件,它会提示我的浏览器自行关闭它,我猜它占用了大量内存,处理速度非常慢,我也在这样做是为了导出,但同样的问题是,浏览器要关闭它需要太多时间。你对我该如何使它更容易、更快有什么建议吗 这是我的密码: 进口: if($_POST) { $error = 0; $tmpName = $_SESSION["csv_file"]; $fileExtension = $_SESSION["csv_ext"];

我正在尝试插入一个至少有20k行的csv文件,它会提示我的浏览器自行关闭它,我猜它占用了大量内存,处理速度非常慢,我也在这样做是为了导出,但同样的问题是,浏览器要关闭它需要太多时间。你对我该如何使它更容易、更快有什么建议吗

这是我的密码:

进口:

if($_POST) {
        $error = 0;

        $tmpName = $_SESSION["csv_file"];
        $fileExtension = $_SESSION["csv_ext"];

        $fieldset = explode(",", trim($_REQUEST["csv_listfields"], ","));

        unset($_SESSION["csv_file"]);   unset($_SESSION["csv_ext"]);        

        if($tmpName){
            if($fileExtension == 'csv'){
                $fp = fopen($tmpName, 'r');
                $fr = fread($fp, filesize($tmpName));
                $line = explode("\n", $fr);
                $field_pairs = array();
                $csvpos=array();
                $csvpos=$_POST['csv_pos'];
                $getCsvPos=array(); 
                $ifNotempty=0;

                for($i=0;$i<count($csvpos);$i++){
                    if($csvpos[$i]!=-1){
                        $getCsvPos[$ifNotempty] = $csvpos[$i];
                        $ifNotempty++;
                    }
                }
                $fldcolumns         = $line[0];
                $fldcolumns         = array_map("trim_field", explode(",", $fldcolumns));

                $forIndexValue=0; 
                foreach($fieldset as $fld){

                    $f = explode("=", $fld);

                    list($dbcol, $colcsv) = explode("=",$fld);
                    $field_pairs[$dbcol] = $getCsvPos[$forIndexValue] ;

                    $forIndexValue++;
                }
                $csvfile = fopen($tmpName, 'r');
                $ctr = 0;               
                $total_uploaded = 0;

                while (($datax = fgetcsv($csvfile, 1000, ",")) !== FALSE) {
                    $insert_crm = array();
                    $row_hascrm_assigned = false;
                    if($ctr != 0){
                        $ins_tbl = array(); 
                        $has_val = false;
                        foreach($field_pairs as $field => $colkey){ 
                            if( $datax[$colkey] != '' ) $has_val = true;

                            if($field != 'crm_group'){
                                if($field == 'password'){
                                    $ins_tbl[$field] = (strlen($datax[$colkey]) != 64) ? hash("sha256", $datax[$colkey]) : $datax[$colkey];
                                }elseif($field == 'birthdate' || $field == 'dateIN'){

                                    if($field=="dateIN"){
                                        if($datax[$colkey] == ""){ 
                                            $date = date("Y-m-d");      
                                        }else{
                                             $date = $datax[$colkey];
                                        }   
                                        $ins_tbl[$field] = $date;
                                    }
                                }elseif($field == 'email'){
                                    $ins_tbl[$field] = strtolower($datax[$colkey]);
                                }else{
                                    $ins_tbl[$field] = mysql_real_escape_string($datax[$colkey]);
                                }
                                if($field != "dateIN"){
                                    $ins_tbl["dateIN"] = date("Y-m-d");
                                }
                                if($field == "birthdate"){
                                    $ins_tbl[$field] = $datax[$colkey];
                                }

                            }else{  
                                foreach( explode(";", $datax[count($fldcolumns) - 1]) as $cg ){
                                    $cg = ($cg == "")?$datax[$colkey]:$cg;
                                    $cg = htmlentities($cg);
                                    $crm_sql = mysql_query("SELECT crm_gid FROM tbl_crm_groups WHERE crm_group_name = '".trim($cg, "'")."'");

                                    if(mysql_num_rows($crm_sql) < 1){
                                        mysql_query("INSERT INTO tbl_crm_groups (crm_group_name, crm_date_created, custom) VALUES ('".$cg."', '".date('Y/m/d H:i:s')."', 1)") or die("</br>Error Message: ".mysql_error());
                                        $crm_gid =  mysql_insert_id();
                                    }else{
                                        $crm_gid = ($cg != "" && mysql_num_rows($crm_sql) > 0) ? mysql_result($crm_sql, 0) : 1;
                                    }
                                    if(mysql_num_rows(mysql_query("SELECT * FROM tbl_crm_members WHERE crm_groupid = {$crm_gid} AND crm_uid = {$crm_uid}")) < 1){
                                        if(!in_array("INSERT INTO tbl_crm_members(crm_groupid, crm_uid, datejoined) VALUES('{$crm_gid}', '[give_me_uid]', '".date("Y-m-d")."')", $insert_crm))
                                            $insert_crm[] = "INSERT INTO tbl_crm_members(crm_groupid, crm_uid, datejoined) VALUES('{$crm_gid}', '[give_me_uid]', '".date("Y-m-d")."')";
                                    }
                                }

                            }
                        }
                        if($has_val){   
                            if(mysql_query("INSERT INTO tbl_members (".implode(',',array_keys($ins_tbl)).") VALUES (\"".implode('","',$ins_tbl)."\")")){

                                $last_member_inserted = mysql_insert_id();
                                $total_uploaded++;
                                if(count($insert_crm) > 0){
                                    foreach($insert_crm as $ic){
                                        mysql_query( str_replace("[give_me_uid]", $last_member_inserted, $ic) );    
                                    }
                                }else{
                                    mysql_query( "INSERT INTO tbl_crm_members(crm_groupid, crm_uid, datejoined) VALUES('1', ".mysql_insert_id().", '".date("Y-m-d")."')" ); 
                                }
                            }   
                        }                       
                    }
                    $ctr++;
                }
                fclose($fp);
                echo "<div style='color: green; margin: 10px;'>STATUS: ".$total_uploaded." record(s) successfully imported. <br/>This page will reload in a couple of seconds.</div>";              
            }else{
                exit("Not a valid csv file uploaded.");
            }
            unlink($tmpName);

            echo "<script type='text/javascript'>setTimeout(function(){parent.location.reload(true);}, 2000);</script>";
        }else{
            exit("File uploaded improperly.");
        }   
    }

使用MySQL导入功能,让数据库负责导入。速度要快得多

LOAD DATA LOCAL INFILE '/some/file/path' 
INTO TABLE table_name 
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
IGNORE 1 LINES

它一定是因为explode()函数而发生的。(对不起,无法抗拒)这就是你应该做的using@Gigi我想让它有一个BOOM@Dagon我想你可以帮我一把,不太熟悉的可以用一个更实际的解释,如果你觉得合适的话,一些示例也会很好:)$sql\u getcustomers=$\u POST['val'];但这将在没有任何验证的情况下插入?我倾向于导入临时表,然后从中读取,复制我需要的内容。一旦我处理完数据,我就可以刷新表,准备进行另一次导入。然后我可以在那里创建一个新的表导入吗?提取数据并进行验证,然后导入真正的表?但这不会花费更多的时间吗?加载数据是如何工作的?非常感谢。
LOAD DATA LOCAL INFILE '/some/file/path' 
INTO TABLE table_name 
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\n'
IGNORE 1 LINES