2012-05-18 36 views
6

我是一個MySQL新手,完成了我的web應用程序的核心代碼塊。代碼導入一個由FileMaker生成並清除的CSV文件(本地),並保留它。錯誤捕獲的最佳方法LOAD DATA LOCAL INFILE?

鑑於這將會在某個時間點快速投入生產(並且可能是500MB以下的數據庫),我很想知道是否有更好的錯誤檢查/捕獲功能,以便我可以在可能的情況下防止出現問題或者通知我的服務器設置。我已經閱讀了關於臨時日誌等的內容,而且我的MySQL管理還沒有達到鼻菸。

非常基本的代碼是:

$m = mysql_connect('localhost', 'mytable', 'mypassword'); 
$db = 'mydb'; 
mysql_select_db($db) or die("Import Error - Couldn't select database: " . mysql_error()); 

$sql = 'load data local infile "inventory.csv" 
     into table ibl_account_details_temp fields terminated by "," 
     optionally enclosed by "\"" 
     lines terminated by "\r" 
     (store_id, SKU, account, item_number, brand, description, size, category, price, qty, fees) 
     '; 

echo mysql_query($sql) or die(myqsl_error()); 

PS編輯:我也很想知道,如果進口的這種方法是開放的SQL注入?

+0

我看不到執行'LOAD DATA INFILE'會有什麼樣的風險,因爲MySQL沒有執行CSV文件的內容,它只是將它解析爲CSV。當然,這並沒有提到二次攻擊的風險,但只要每個需要輸入(包括來自查詢結果的輸入)的查詢都使用參數化,就應該是安全的。出於這個原因(除其他外),你應該使用mysqli或PDO來訪問mysql而不是mysql_ *函數。 –

+0

我之前使用了一個簡單的插入語句,而fgetcsv在我的18mb文件中內存不足。我無法解決這個問題,並在主機128MB的RAM上運行,並且需要保持這個工作。也就是說,我使用PDO的每個其他地方;-) – SWL

+0

當然,我不反對使用'LOAD DATA INFILE'導入CSV,這就是它的用途。 –

回答

4

不幸的是,錯誤與LOAD DATA INFILE處理非常差。我幾乎每天都會使用它,並且將它導入到某種臨時表中變得很簡單,並使用PHP和MySQL的組合來驗證導入的內容。人們可以爭辯說這是額外的工作,但它的確有一個好處,即讓我完全控制「錯誤」是什麼。簡而言之,我使用它來儘可能高效地獲取原始數據,然後在php腳本中構建我的錯誤檢查和驗證規則。

+0

感謝您的快速響應。我的錯誤檢查是在FileMaker中,它非常嚴格,所以我在那裏感覺很安全。是否有任何SQL注入此路線btw的可能性? – SWL

+0

我不知道你的數據來自哪裏,所以不能肯定地說,但這通常是用戶輸入的問題,所以大概不會。然後回到您在FileMaker中進行的擦洗,以確定您的成品的安全性。 – GDP