0

cronジョブで実行されるPDOPHPファイルをプログラムしようとしました。私の問題はcronジョブではありませんが、スクリプトが機能していないようです。

このスクリプトを見つけました

http://www.php.happycodings.com/Database_Related/code11.html
いくつかのコンテンツを変更しました。たとえば、メールを送信する必要はなく、.CSVファイルは1つしかありません。このスクリプトでは、すべての行をチェックして、データベースにすでに存在するかどうかを確認したいと思います。もしそうなら、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)");


?>
4

2 に答える 2

0

を使用する必要がありますLOAD DATA

このリソースから始めましょう。行の複製を可能にする構文とオプションのキーワードに関するマニュアルを見てください。IGNORE

サンプル データに従うと、LOAD DATA構文は次のようになります。

LOAD DATA INFILE 'file.csv'
    IGNORE                   # <= Skip duplicate input rows
    INTO TABLE test
    (1, 2, 3)                # <= The columns to insert into
于 2012-10-24T15:37:56.300 に答える
0

Replace into 関数を使用すると、クエリを簡素化し、サーバーへの多くの呼び出しを回避できます。

$conn->execute("replace into test values ('$f1','$f2', '$f3') WHERE id='".$row['id']."'");
于 2012-10-24T15:30:43.410 に答える