2013-06-18 90 views
0

提交我怎么能捕获“nicefile.csv”,并在文件中计算行数后,我从形式POST提交后?我尝试了类似$csvlinecount = count(file('$_FILES[csv]'));而没有结果。原因是我有我的数据库中的行之前和之后我导入csv值,但我在整理重复条目的行数的代码。因此,知道前面的条目数是100还是200后很有趣,然后我知道它导入了100条新线。但是,如果我不知道csv文件中的行数,我不知道它在导入过程中跳过了多少。计数线以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) ; 

?> 
+2

数'和addslashes()不推荐'。相反,尝试[PDO](http://php.net/pdo) –

+0

或'mysql_real_escape_string()'在最低限度。 –

回答

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。我总是遇到很多关于addslashes函数的问题,并且在mysql_real_escape_string覆盖更多的SQL注入技术时,它只是避开斜线。

但最好是忘记mysql_ *函数(这些都已经过时),并使用PDO或mysqli的,而不是

+0

Perfekt,谢谢! :) – Frigol33t

0

在您可以对行进行计数之前,您必须将其分成若干行。之前它只是一个很长的字符串。

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

当我复制/粘贴此代码到我的网站,并将其保存(使用Joomla IM),从斜杠为“\ r \ n”刚刚消失,我结束了“RN”。任何想法为什么? – Frigol33t

+0

你自己或通过joomla内的编辑器将它保存在文件中? 如果是第二种情况,可以通过joomla删除斜线。 –

+0

通过joomla编辑器。是的,我猜这是Joomla删除它。有没有其他方法可以编写代码并获得相同的结果? Joomla不会为我移除的某种方式? 更新:刚刚试过你的代码与斜杠去“/ r/n”,和joomla保持它。它会以同样的方式工作吗? – Frigol33t

0

您的代码:

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

集作为参数有关的功能文件中的字符串而不是实际的文件内容。

尝试:

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

要做到这一点,而无需通过CSV迭代最好的办法是到了Linux后端的服务器。从John Reeve

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

使用下面的代码,你可以得到线

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