2013-04-16 25 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

相关问题