从csv插入多行到mysql并使用AJAX查看进度

时间:2014-11-15 11:04:57

标签: php mysql ajax csv

我有一个包含超过10,000行或记录的CSV文件。我已经知道如何在MySQL中插入它们。我想要的是到目前为止已经插入了多少行或列的交互式通知?

示例:

插入10000行中的100行

我尝试使用AJAX,这是我的代码。

function insert_logs(filename) {
    //alert("Inserting Data!!!" + filename);
    var ajax = new XMLHttpRequest();
    ajax.onreadystatechange=function() {
        if (ajax.readyState==4 && ajax.status==200) {
            _("logStatus").innerHTML = ajax.responseText;
        }
    }
    ajax.open("GET","insert_logs_module.php?fileName="+filename,true);
    ajax.send();
}

这是我的insert_logs_module.php代码:

if (file_exists ( $targetFile)) {

    $data = fopen( $targetFile , 'r' );

    $numRows = count(file($targetFile,FILE_SKIP_EMPTY_LINES));

    /*$sql = mysql_query( "select * from logs where vessel_token = '" . $vessel_token . "'") or die("Error Select Logs - " . mysql_error());

    if( mysql_num_rows( $sql ) > 0 ){
        mysql_query("delete from logs where $vessel_token = '" . $vessel_token . "'" ) or die("Error Vessel Delete - " . mysql_error());
    }
    */
    $processRowCount = 0;
    $csvContent = fgetcsv( $data, 1000, "," );
    $traj_id = 0;
    $previousDate = 0;
    while( $csvContent = fgetcsv( $data, 1000, "," ) )
    {
        $ts = strtotime($csvContent[2]);
        $date =  date('Y/m/d',$ts);
        $logged_day = date('l',$ts);
        if ($previousDate != $date)
        {
            $traj_id++; 
        }
        $lat = $csvContent[2];
        $lon = $csvContent[1];
        $logged_at = $csvContent[3];

        mysql_query("insert into logs (vessel_token,traj_id,lat,lon,logged_at,logged_day) values ('" . $csvContent[0] . "','" . $traj_id . "','" . $lat . "','" . $lon . "','" . $logged_at . "','" . $logged_day . "');") or die("Error Insert - " . mysql_error());
       $previousDate = $date;
       $processRowCount++;
       $percent = ($processRowCount/$numRows) * 100;
       echo "$percent-$processRowCount of $numRows Records Processed!";
    }
} else {
        echo "File Does Not Exists! $targetFile";   
}

非常感谢!

2 个答案:

答案 0 :(得分:0)

只需上传一个csv文件并使用文件mysql fn中的Load。

form.php的

 <form enctype="multipart/form-data" method="post" action="upload.php">
 Send this file: <input name="uploadedfile" type="file" /><br />
 <input type="submit" value="Send File" />
 </form>

upload.php的

    <?php
    $con = mysqli_connect("localhost","my_user","my_password","my_db");
    $target_path = "";
    $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

    if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
        $file_name = $_FILES['uploadedfile']['name'];  
        echo "The file ".basename($file_name)." has been uploaded";  
        mysqli_query($con,"LOAD DATA LOCAL INFILE '$file_name' INTO TABLE test FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'");
    } else {
        echo "There was an error uploading the file, please try again!";
    }
    ?>

您当前使用的方法将占用资源

答案 1 :(得分:0)

尝试使用2个AJAX调用,一个用于插入数据并设置计数变量。另一个用于检查后端上第一个ajax调用的进度,检索计数变量。不要忘记把第二个ajax呼叫放在一个间隔,可能是一秒钟或者一半。