在表单中提交后计算csv文件中的行

时间:2013-06-18 11:10:49

标签: php html mysql csv

我如何捕获“nicefile.csv”并在我从表单提交POST后计算文件中的行?我试过像$csvlinecount = count(file('$_FILES[csv]'));这样没有结果的东西。原因是我有代码在导入csv值之前和之后计算我的数据库中的行的数量,但我正在整理重复的条目。因此,知道之前的条目数是100还是200之后会很有趣,然后我知道它导入了100个新行。但是,如果我不知道csv文件中的行数,我不知道它在导入期间跳过多少行。

<?php 

if ($_FILES[csv][size] > 0) {

//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");

//loop through the csv file and insert into database
do {
if ($data[0]) {
    mysql_query("INSERT IGNORE INTO wifi (bssid, channel, privacy, ciper, auth, power, essid, latitude, longitude, first_seen, last_seen) VALUES
        (
            '".addslashes($data[0])."',
            '".addslashes($data[1])."',
            '".addslashes($data[2])."',
            '".addslashes($data[3])."',
            '".addslashes($data[4])."',
            '".addslashes($data[5])."',
            '".addslashes($data[6])."',
            '".addslashes($data[7])."',
            '".addslashes($data[8])."',
            '".addslashes($data[9])."',
            '".addslashes($data[10])."' 
        )
    ");
}
} while ($data = fgetcsv($handle,1000,","));

//redirect
header('Location: index.php/upload?success=1'); die;

}

//Count after import
$after = mysql_query("SELECT * FROM wifi");
$num_rows_after = mysql_num_rows($after);


//echo stats
echo "Number of rows before - ";
echo "$num_rows_before";
<br>
echo "Number of rows after - ";
echo "$num_rows_after";

//generic success notice
if (!empty($_GET[success])) { echo "<br><b>Result: Your file is imported!</b><br>"; } 

//Close connection to databse
mysql_close($connect) ; 

?>

6 个答案:

答案 0 :(得分:1)

您可以简单地添加另一个变量来计算行数。例如,如下所示(请参阅新的$linesCount变量):

if ($_FILES[csv][size] > 0) {

//get the csv file
$file = $_FILES[csv][tmp_name];
$handle = fopen($file,"r");
$linesCount = 0;
//loop through the csv file and insert into database
do {

if ($data[0]) {
    $linesCount ++;
    mysql_query("INSERT IGNORE INTO wifi (bssid, channel, privacy, ciper, auth, power, essid, latitude, longitude, first_seen, last_seen) VALUES
        (
            '".addslashes($data[0])."',
            '".addslashes($data[1])."',
            '".addslashes($data[2])."',
            '".addslashes($data[3])."',
            '".addslashes($data[4])."',
            '".addslashes($data[5])."',
            '".addslashes($data[6])."',
            '".addslashes($data[7])."',
            '".addslashes($data[8])."',
            '".addslashes($data[9])."',
            '".addslashes($data[10])."' 
        )
    ");
}
} while ($data = fgetcsv($handle,1000,","));

//redirect
header('Location: index.php/upload?success=1'); die;

}

另外,我建议使用mysql_real_escape_string函数代替addslashes。我总是遇到很多addlashes函数问题,当mysql_real_escape_string涵盖更多SQL注入技术时,它只是转义斜杠。

但最好的方法是忘记mysql_ *函数(已经弃用)并使用PDO或mysqli

答案 1 :(得分:1)

使用以下代码可以获得行数

$upload_temp=$_FILES["school_upload"]["tmp_name"];      
$fileTemp = $upload_temp;    
$lines = file($fileTemp);    
echo count($lines);

答案 2 :(得分:0)

在计算行数之前,必须将行拆分为行。在它只是一个很长的字符串之前。

$count = count(explode("\r\n", file_get_contents($_FILES[csv][tmp_name])));

答案 3 :(得分:0)

您的代码:

$csvlinecount = count(file('$_FILES[csv]'));

将函数文件设置为字符串而不是实际文件内容。

尝试:

$csvlinecount = count(file($_FILES['csv']['tmp_name']));

答案 4 :(得分:0)

在不必迭代CSV的情况下执行此操作的最佳方法是使用服务器的Linux后端。来自John Reeve

$linecount = exec('perl -pe \'s/\r\n|\n|\r/\n/g\' ' . escapeshellarg($_FILES[csv][tmp_name]) . ' | wc -l');

答案 5 :(得分:0)

echo $linecount = count(file($filename));