【问题标题】:Import CSV rows to SQL (INSERT or UPDATE)将 CSV 行导入 SQL(INSERT 或 UPDATE)
【发布时间】:2012-10-25 01:13:22
【问题描述】:

我尝试编写一个 PDO PHP 文件以由 cron 作业执行。我的问题不是 cron 工作,而是我的脚本似乎不起作用的事实..

我找到了这个脚本

http://www.php.happycodings.com/Database_Related/code11.html
并更改了一些内容。例如,我不需要将邮件发送给我,而且我只有一个 .CSV 文件。问题在于这个脚本,我想检查每一行,看看它是否已经存在于数据库中。如果是这样,我想更新 SQL 中的行,如果不是,我想在 SQL 中插入行。

它没有显示任何错误或任何东西,但不知何故,它似​​乎没有在 SQL 中插入任何内容。每次我执行文件时,它都会在页面中运行并最终变成空白......对我来说似乎是正确的,因为我已经告诉它如果发生错误就死掉。

<?php 

try{
    $conn = new PDO("mysql:host=localhost;dbname=data", 'user', 'pass');
}
catch(PDOException $pe)
{
    die('Connection error, because: ' .$pe->getMessage());
}

$columnheadings = 1; 


$filecontents = file ('../../_resources/_csv/letters.csv');

for($i=$columnheadings; $i<sizeof($filecontents); $i++) { 

    list($f1, $f2, $f3)=explode(";",$filecontents[$i]); 

    $sth = $conn->prepare("SELECT * FROM test WHERE 1 = '".$f1."'");

    if ($sth->execute() && $row = $sth->fetch())
        {
            $update = $conn->execute("UPDATE test SET 1 = '$f1', 2 = '$f2', 3 = '$f3' WHERE id='".$row['id']."'");


        }
    else 
        {
            $insert = $conn->execute('INSERT INTO test VALUES ($filecontents[$i])');


        }

} 


?>

在脚本中应该很容易看出我想要做什么,所以如果您有任何想法或建议,请告诉我该怎么做。

SQL Database

 ----------------
| id | 1 | 2 | 3 |
|----------------|
|  1 | A | A | A |
|----------------|
|  2 | B | B | B |
 ----------------


.CSV File

 -----------
| 1 | 2 | 3 |
|-----------|
| A | A | A |
|-----------|
| B | B | B |
|-----------|
| C | C | C |
 -----------

这意味着我的脚本应该能够忽略SQL数据库中已经存在的A和B,然后只插入C。

这是@njk 想法的一个例子。但它似乎仍然不起作用。我需要一个服务器插件来接受传入的 .CSV 文件吗?

<?php 

try{
    $conn = new PDO("mysql:host=localhost;dbname=data", 'user', 'pass');
}
catch(PDOException $pe)
{
    die('Connection error, because: ' .$pe->getMessage());
}


$sth = $conn->execute("LOAD DATA 
                       INFILE '../../_resources/_csv/letters.csv'
                       [REPLACE] INTO TABLE test [FIELDS [TERMINATED BY ';']]
                       [LINES TERMINATED BY ' '] [IGNORE 1 LINES] (1, 2, 3)");


?>

【问题讨论】:

  • 您无法使用LOAD DATA?见this
  • 其实我只是觉得这更容易理解。而且我不知道加载数据是否会在无法更新时插入..
  • 对于LOAD DATA,如果您指定REPLACE,则输入行将替换现有行,或者如果您指定IGNORE,则会跳过与唯一键值上的现有行重复的输入行。跨度>
  • 我还是个新手,请给我看一个与我当前脚本相关的示例。?

标签: php insert pdo cron sql-update


【解决方案1】:

如果您使用 Replace into 函数,您可以简化查询并避免多次调用服务器。

$conn->execute("replace into test values ('$f1','$f2', '$f3') WHERE id='".$row['id']."'");

【讨论】:

  • 可能您对更新的看法是正确的,但脚本甚至没有插入任何内容。我确信它与脚本有关,而不是语句。
【解决方案2】:

你应该使用LOAD DATA

这个resource 将帮助您入门。查看manual 中关于允许您IGNORE 重复行的语法和可选关键字。

根据您的示例数据,您的 LOAD DATA 语法可能类似于:

LOAD DATA INFILE 'file.csv'
    IGNORE                   # <= Skip duplicate input rows
    INTO TABLE test
    (1, 2, 3)                # <= The columns to insert into

【讨论】:

  • 所以我最终将编写我的 PDO DB 连接、catch 命令和这个 $sth = $conn-&gt;execute("LOAD DATA INFILE '../../_resources/ _csv/letters.csv' IGNORE INTO TABLE test (1, 2, 3)");
猜你喜欢
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多