2013-06-18 91 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));