[PHP-users 5297] アップロードしたファイルからpg_put_lineを利用してのDB挿入。

mots php-users@php.gr.jp
Thu, 7 Feb 2002 19:24:51 +0900


こんばんは。

ブラウザからcsvファイルをアップロードして、
そのデータをpg_put_lineを利用してDB挿入を試みているのですが、
一部のカラムに対するデータ挿入が完全ではありません。
どなたが御教授頂けますでしょうか。どうぞ宜しくお願い致します。

【CSVファイル】5行
 10,20
 30,40
 50,60
 70,80
 90,100

【pg_put_line】
@pg_exec($con, "COPY id FROM stdin"); //idはテーブル名
$b = "1013070721"; // mktimeで取得
foreach($file as $line) {
// $fileはアップロードされたCSVファイルをfile関数で読みこみ
 $tmp = explode(",", $line);
 pg_put_line($con, sprintf("%d\t%d\t%d\n", $tmp[0], $tmp[1], $b));   // #1
 //pg_put_line($con, sprintf("%s\t%s\t%d\n", $tmp[0], $tmp[1], $b)); // #2
}
pg_put_line($con, "\\.\n");
pg_end_copy($con);


この様なコード(一部略)で、
本来アップロードしたいCSVには”数字だけではなく英字も入る”のですが、
その際に#2のようにsprintfの型指定子を%s(文字列)に替えて実行すると
以下のようにデータベース挿入に問題が起こります。

※数値データはうまくいくのですが、英数字のデータが入るとダメなのです…。
※ %d の型指定子は、10進数整数。

     id     |     pw     | time
------------+------------+------
        |     20
            | 1013070655 |
        |     40
            | 1013070655 |
        |     60
            | 1013070655 |
        |     80
            | 1013070655 |
       |      100
            | 1013070655 |
(10 rows)

※テーブルは、id (text),pw (text),time (int4)となっております。

PHP-4.1.1
postgresql-7.1.3-patched-20011205
Apache1.3.22