3

ユーザーにファイルをアップロードさせ、そのファイルを 1 行ずつ postgres データベースに挿入しようとしています。

このコードがあり、構文で次のエラーが発生します。

配列 ( [0] => 42601 [1] => 7 [2] => エラー: ""INSERT INTO "" またはその近くで構文エラーが発生しました 行 1: "INSERT INTO "public"."tblSedimentGrabEvent" VALUES ('A1000' ... ^ )

PHP PDO マニュアルと Postgres サイトを参照し、エラー コードを検索しましたが、まだ成功していません。私はそれがおそらく小さなものであることを知っていますが、それは私を困惑させました.

<?php
try { 
    $db = new PDO("pgsql:dbname=name;host=host","user","pass");
}   
catch(PDOException $e) {
    echo $e->getMessage();
}

if ($_FILES["file"]["error"] > 0)
{
    echo "Error: " . $_FILES["file"]["error"] . "<br>";
}
else
{
    echo "Uploaded Successfully!<br>";
    echo "File Name: " . $_FILES["file"]["name"] . "<br>";
    echo "Type: " . $_FILES["file"]["type"] . "<br>";
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    echo "Temp file: " . $_FILES["file"]["tmp_name"]. "<br>";
    {
        move_uploaded_file($_FILES["file"]["tmp_name"],
        "D:/Apapub/public_html/databases/B13/temp/" . $_FILES["file"]["name"]);
        echo "Stored in: " . "D:\Apapub\public_html\databases\B13\temp" . $_FILES["file"]["name"]. "<br>";
    }

 }

$file_handle = fopen("D:/Apapub/public_html/databases/B13/temp/grabevents.txt", "r");

while (!feof($file_handle) ) {

    $text_file = fgetcsv($file_handle);

    print_r($text_file);

    $query=<<<eof
"INSERT INTO "public"."tblSedimentGrabEvent" VALUES ('$text_file[0]','$text_file[1]','$text_file[2]','$text_file[3]','$text_file[4]','$text_file[5]','$text_file[6]','$text_file[7]','$text_file[8]','$text_file[9]','$text_file[10]','$text_file[11]','$text_file[12]','$text_file[13]','$text_file[14]','$text_file[15]','$text_file[16]','$text_file[17]','$text_file[18]','$text_file[19]','$text_file[20]','$text_file[21]','$text_file[22]','$text_file[23]')"
    eof;
    $sth = $db->query($query);
}
if (!$sth) {
    echo "<p>\nPDO::errorInfo():\n</p>";
    print_r($db->errorInfo());
} 
fclose($file_handle);

echo "<p><b>Records Imported</b></p>";

?>

サンプル配列は次のとおりです。

A1000,24,M,28/Mar/2013,11:45:27,1,SCCWRP,Singel Van Veen,33.1234,-118.523,AGPS,12,cm,Olive Green,Sand,None,Yes,No,No,No,None,Test Record # 1,No,22/May/2013
A1000,24,M,28/Mar/2013,11:45:27,1,SCCWRP,Singel Van Veen,33.1334,-118.543,AGPS,12,cm,Olive Green,Sand,None,Yes,No,No,No,None,Test Record # 1,No,15/May/2013
A1000,24,M,28/Mar/2013,11:56:33,2,SCCWRP,Single Van Veen,33.1635,-118.593,AGPS,12,cm,Olive Green,Sand,None,No,Yes,No,No,None,Test Record #2,No,15/May/2013
A1000,24,M,28/Mar/2013,12:06:33,3,SCCWRP,Single Van Veen,33.1534,-118.563,AGPS,12,cm,Olive Green,Sand,None,No,No,Yes,No,None,Test Record #3,No,15/May/2013
A1000,24,M,28/Mar/2013,12:12:33,4,SCCWRP,Single Van Veen,33.1034,-118.503,AGPS,12,cm,Olive Green,Sand,None,No,No,No,yes,None,Test Record #4,No,15/May/2013

私は COPY コマンドを使用して成功しましたが、スーパーバイザーは、後でいくつかのチェックを実行するために行ごとに解析することを望んでいます

!!答え!!

@Spudley に小道具を提供する方法がわかりませんが、彼は質問に答えるのを手伝ってくれました。

彼が言ったことを実行した後、クエリを引用符で囲む必要がないことがわかりました(ヒアドキュメントを使用しているためだと思いますか?)。

これは機能しました(ただし、Craig Ringerによる編集、これはまだ危険なほど安全ではないため、決して使用しないでください。これをサンプルコードとしてコピーしないでください):

$query=<<<eof
INSERT INTO "public"."tblSedimentGrabEvent" VALUES ('$text_file[0]','$text_file[1]','$text_file[2]','$text_file[3]','$text_file[4]','$text_file[5]','$text_file[6]','$text_file[7]','$text_file[8]','$text_file[9]','$text_file[10]','$text_file[11]','$text_file[12]','$text_file[13]','$text_file[14]','$text_file[15]','$text_file[16]','$text_file[17]','$text_file[18]','$text_file[19]','$text_file[20]','$text_file[21]','$text_file[22]','$text_file[23]')
eof;
$sth = $db->query($query);

再度、感謝します!

4

2 に答える 2

1

SQL へのテキスト置換は、エラーが発生しやすく、安全ではなく、デバッグが難しく、ひ​​どいスタイルです。PDO または のいずれかで、パラメーター化されたステートメントを使用しますpg_query_params。あなたの「答え」は完全に安全ではありません。使用しないでください。

これにより、問題が解決されるだけでなく、SQL インジェクションを含む重大なセキュリティの脆弱性のクラス全体から保護されます。ウィキペディアbobby テーブル、およびPHP マニュアルを参照してください。

この前の回答も参照してください。

COPYその間、はるかに効率的な を使用して、CSV を PostgreSQL のテーブルに直接ストリーミングすることを検討してください。pg_copy_fromまたは下位レベルのpg_put_line関数を参照してください。

于 2013-05-18T02:19:46.897 に答える