2013-04-16 27 views
0

使用fgetcsv是我今天的一項全新功能。我習慣於處理mysql,因此sql server也是一種野獸。因此,我轉向你們!使用fgetcsv將數據添加到sql server中

我有下面的代碼,我相信做的一切,我需要,除了採取CSV,並把它變成一個SQL表。

你們可以幫助一些示例代碼,可以緩解這個問題嗎?

function connect() { 
    if (!function_exists('sqlsrv_num_rows')) { // Insure sqlsrv_1.1 is loaded. 
     die ('sqlsrv_1.1 is not available'); 
    } 

    /* 
    * Log all Errors. 
    */ 
    sqlsrv_configure("WarningsReturnAsErrors", TRUE);  // BE SURE TO NOT ERROR ON A WARNING 
    sqlsrv_configure("LogSubsystems", SQLSRV_LOG_SYSTEM_ALL); 
    sqlsrv_configure("LogSeverity", SQLSRV_LOG_SEVERITY_ALL); 

    $conn = sqlsrv_connect('instance', array 
    (
    'UID' => 'userName', 
    'PWD' => 'password', 
    'Database' => 'database', 
    'CharacterSet' => 'UTF-8', 
    'MultipleActiveResultSets' => true, 
    'ConnectionPooling' => true, 
    'ReturnDatesAsStrings' => true, 
    )); 

    if ($conn === FALSE) { 
     get_last_error(); 
    } 

    return $conn; 
} 

function query($conn, $query) { 
    $result = sqlsrv_query($conn, $query); 
    if ($result === FALSE) { 
     get_last_error(); 
    } 
    return $result; 
} 

function execute ($stmt) { 
    $result = sqlsrv_execute($stmt); 
    if ($result === FALSE) { 
     get_last_error(); 
    } 
    return $result; 
} 

$conn = connect(); 


if (($handle = fopen(getcwd().'C:\path\TASKS.csv', "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) { 
     $db->execute("INSERT INTO Database..table (taskID, name, active) VALUES ('{$data[1]}','{$data[2]}','{$data[3]}')"); 
     set_time_limit(60); // reset timer on loop 
    } 
} 

與上面的代碼我目前收到以下錯誤

未能打開流:無效的參數在C:\路徑\ insertDataFGet.php上線51 51

線是$ DB->執行CSV行

樣品

1,taskName1,1 
2,taskName2,0 
3,taskName3,0 
+1

你有什麼問題?顯示您嘗試的代碼,解釋它如何不起作用,並且有人會幫助您解決問題。 – Barmar

回答

1

這裏的我怎麼做在我的一個小導入腳本。有可能有更好的方法來做到這一點,但這是有效的。

if (($handle = fopen(getcwd()."/tmp/updatedpricing.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) { // loop through each line of CSV. Returns array of that line each time so we can hard reference it if we want. 
    $db->execute("UPDATE table SET col1='{$data[1]}',col2='{$data[2]}',col3='{$data[3]}' WHERE something=something",ENABLE_DEBUG); 
    set_time_limit(60); // reset timer on loop 
    } 
} 
fclose($handle); 

此代碼只是一個例子 有沒有在這2個問題有直接實現到代碼中第一個被GETCWD()在你的情況,你不需要它的使用,因爲我使用虛擬路徑和「LN做 - s「,因此我的工作目錄不總是相同的,文件並不總是在同一個位置。既然你知道確切的路徑你可以把路徑直接

if (($handle = fopen('C:\path\TASKS.csv', "r")) !== FALSE) { 

第二個問題是你不能複製和粘貼我的SQL語句作爲其依賴於我的自定義的MySQL數據庫訪問類。因此,您必須更改從$db->execute開始的行以使用您的可用mysql函數。如果你正在做一個基本的插入,我想你可以單獨構建你的查詢,然後通過你的query()或​​函數傳遞它,任何一個都應該工作。不要忘記正確地指定您的示例代碼寫入錯誤的表名。

第三個問題是,你需要確保你逃避你輸入正確乏等$data[],也確保你從CSV列匹配您插入列別忘記$data從0(零)計數

+0

10000在'fgetcsv($ handle,10000,「,」)'中做了什麼?我閱讀手冊,我可以告訴它與長度有關,但你不是第一個在那裏有10k的人 – mhopkins321

+0

告訴它閱讀不超過10000字節/千字節的行不知道哪個關閉頂部頭我知道在我的情況下csv將永遠不會超過40個字符,所以我可以逃脫閱讀固定長度的行。如果其可變長度輸入行(例如產品描述),例如您可能想要使用一個小的行長度calc來給出您嘗試讀取的行的實際長度,並將該實際長度傳遞給fgetcsv()而不是固定的長度,因爲我做 – Dave

+0

我收到一個錯誤。我編輯了我的原文。你能幫助我通過這個嗎? – mhopkins321

相關問題