2013-02-08 80 views
1

我一直在嘗試這一段時間,並調查儘可能多的渠道,因爲我可以在此之前問我的第一個問題。php LOAD數據本地INFILE csv到mysql

我有一個非常簡單的csv文件。一列,由linux換行符分隔的數據。我想將它導入到表(代碼)的第二列(密碼)中。第一列是主鍵自動遞增。

下面是簡單的CSV數據(Linux的換行 - \ n)的

A12345678911 
A12345678912 
A12345678913 
A12345678914 

這裏聚集文件的形式。

<form enctype="multipart/form-data" action="upload_webcodes.php" method="post"> 
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> 
     <input type="hidden" name="success" value="success" /> 
    Send this file: <input name="webcodeupload" type="file" /> 
    <input type="submit" value="Send File" /> 
</form> 

下面是試圖運行查詢將tmp文件加載到數據庫中的php。

<?php 

function dbconnect(){ 
$db = mysql_connect('localhost', 'root', 'root'); 
mysql_select_db("mydatabase", $db); 
return $db; 
} 

if ($_FILES['upload']['type'] === 'text/csv') { 
    $database = dbconnect(); 
    $getfile = $_FILES['upload']['tmp_name']; 
    $sql = " LOAD DATA LOCAL INFILE $getfile INTO TABLE codes (`passcode`) LINES TERMINATED BY '\n' "; 
    mysql_query($sql); 
} 
?> 

我不能得到它的工作。我正在用MAMP在本地嘗試。/tmp/php文件夾修改日期得到更新,但我看不到文件。我甚至嘗試過更大的文件,因爲我的測試文件非常簡單。 提交表單後,我已打印出$ _FILES數組。

Array 
(
    [webcodeupload] => Array 
     (
      [name] => Aimport.csv 
      [type] => text/csv 
      [tmp_name] => /Applications/MAMP/tmp/php/phpsp9ezx 
      [error] => 0 
      [size] => 52 
     ) 

) 

看來預期的結果是在那裏?我試過了phpmyAdmin中的查詢,如果我刪除了LINES TERMINATED BY子句,它就可以工作。我懷疑這是一個phpmyAdmin的事情,我也試過這個代碼,在查詢中有和沒有這個子句。

此外,加載頁面時還會出現一些「未定義索引」錯誤。我有點理解爲什麼,並且在這裏閱讀了線索,指出了掩蓋錯誤的方法,但我很想知道如何避免它們而不是隱藏它們。

任何輸入,將不勝感激。

謝謝。

+0

檢查'mysql_query()'的返回值。負載查詢可能會失敗,但是您沒有捕獲任何返回值,這意味着您已經簡單地認爲它已成功。至少:'$ result = mysql_query(...)或死(mysql_error())'。 – 2013-02-08 21:14:47

+0

請參閱此問題的答案:http://stackoverflow.com/questions/6114651/php-mysql-load-data-infile-help – freejosh 2013-02-08 21:37:59

回答

0

首先,您已經正確分析,該文件應該在/tmp/php。所以,你應該檢查

  1. 權限在/tmp/php文件夾。
  2. 以MySQL的是能夠從/tmp/php目錄中讀取文件,在linux下,不要忘記設置的AppArmor配置/etc/apparmor.d/usr.sbin.mysqld通過加入這一行/tmp/php/** rwk,
0

更改條件:

if ($_FILES['webcodeupload']['type'] == 'text/csv') { 
    // what you have now 
} 

您提供的轉儲顯示錶單輸入字段爲「webcodeupload」,但您的PHP正在檢查「上傳」。

腳本結束時文件不存在的原因很好,這就是php的工作原理。您必須調用move_uploaded_file函數來實際移動上傳的文件,否則PHP在腳本結束時將其刪除(以防止資源消耗攻擊)。

請注意,您的if聲明中可能存在其他問題,但這會讓您更接近。