0

今天使用 fgetcsv 对我来说是一个全新的功能。我习惯于与 mysql 打交道,所以 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
    } 
}

使用上面的代码,我目前收到以下错误

无法打开流:第 51 行的 C:\path\insertDataFGet.php 中的参数无效

第 51 行是 $db->e​​xecute 行

csv样本

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

1 回答 1

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);

这段代码只是一个例子有两个问题,首先直接在你的代码中实现是 getcwd() 在你的情况下你不需要它,因为我使用虚拟路径和动态创建的“ln -s”所以我的工作目录并不总是相同的,文件也不总是在同一个位置。由于您知道确切的路径,因此您可以直接将路径放入

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

第二个问题是您不能复制和粘贴我的 sql 语句,因为它依赖于我的自定义 mysql db 访问类。因此,您必须更改开头的行$db->execute以使用可用的 mysql 函数。如果你正在做一个基本的插入,我想你可以单独构建你的查询,然后通过你的query()orexecute()函数传递它,任何一个都应该工作。不要忘记正确指定您编写示例代码的表名是错误的。

第三个问题是您需要确保正确转义输入变量$data[] 等,并确保将 CSV 中的列与插入列相匹配,不要忘记$data将从 0(零)开始计数

于 2013-04-16T08:52:50.793 回答