ここから本文です

PHPのスクリプトからCSVのデータを読み込んでMySQLの方にインポートしたいのですが...

質問者

yngling111さん

2008/2/2600:24:34

PHPのスクリプトからCSVのデータを読み込んでMySQLの方にインポートしたいのですが、完成半ばでわからなくなりました。どなたかおわかりになる方がいたらアドバイスをお願いします。ちなみに、CSVのデータは

フィールドが7つあって複数行インポートしたいと思ってます。このコードで実行するとFOR文が間違ってるみたいです。よろしくお願いします。


<?php

//ファイルのアップロード

$updir = "/";
$filename = $_FILES['upfile']['name'];
if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE)
{
print($updir.$filename);
print("upload failed...");
print($_FILES['upfile']['error']);
}
else
{
print("<b>" . $filename . "</b> uploaded");
}


//DB
$host = "localhost";
if(!$con = mysql_connect($host, "root", "root"))
{
die("データベースエラー.<br />");
}

mysql_select_db("abccorp", $con);

//ファイルサイズ
$size = $_FILES['upfile']['size'];


$row = 0;
$data = array();

//CSVファイルの中身をすべて読み込む
$fp = fopen($updir.$filename, "r")
or die('ファイルをオープンできません');

while (($tmp = fgetcsv($fp, $size, ",")) !== FALSE)
{
$num = count($tmp);


$data[$row]["id"] = mb_convert_encoding($tmp[0],"UTF-8","SJIS");
$data[$row]["name"] = mb_convert_encoding($tmp[1],"UTF-8","SJIS");
$data[$row]["shurui"] = mb_convert_encoding($tmp[2],"UTF-8","SJIS");
$data[$row]["suryou"] = mb_convert_encoding($tmp[3],"UTF-8","SJIS");
$data[$row]["price"] = mb_convert_encoding($tmp[4],"UTF-8","SJIS");
$data[$row]["seizoubi"] = mb_convert_encoding($tmp[5],"UTF-8","SJIS");
$data[$row]["checkbi"] = mb_convert_encoding($tmp[6],"UTF-8","SJIS");

$row++;

}

fclose($fp);


for($i = 0; $i <= 1; $i++)
{
//SQL文の組み立て
$sql =
"INSERT INTO shouhin " .
"(id, name, shurui, suryou, price, seizoubi, checkbi)" .
" VALUES (" .
"'" . $data[i]["id"] . "'," .
"'" . $data[i]["name"] . "'," .
"'" . $data[i]["shurui"] . "'," .
"'" . $data[i]["suryou"] . "'," .
"'" . $data[i]["price"] . "'," .
"'" . $data[i]["seizoubi"] . "'," .

"'" . $data[i]["checkbi"] . "')";

mysql_query($sql, $con)
or die("変更できませんでした。");

print("登録しました");
}
?>

閲覧数:
12,956
回答数:
2

違反報告

ベストアンサーに選ばれた回答

nishukangoさん

2008/2/2617:52:22

for($i = 0; $i <= 1; $i++) って2行限定にしているっていうのは?
for($i = 1; $i < $row; $i++) ってこと?

配列に入れなくても、そのままINSERTとしていけばよいのでは?

$data["id"] = mb_convert_encoding($tmp[0],"UTF-8","SJIS");
$data["name"] = mb_convert_encoding($tmp[1],"UTF-8","SJIS");
$data["shurui"] = mb_convert_encoding($tmp[2],"UTF-8","SJIS");
$data["suryou"] = mb_convert_encoding($tmp[3],"UTF-8","SJIS");
$data["price"] = mb_convert_encoding($tmp[4],"UTF-8","SJIS");
$data["seizoubi"] = mb_convert_encoding($tmp[5],"UTF-8","SJIS");
$data["checkbi"] = mb_convert_encoding($tmp[6],"UTF-8","SJIS");

//SQL文の組み立て
$sql =
"INSERT INTO shouhin " .
"(id, name, shurui, suryou, price, seizoubi, checkbi)" .
" VALUES (" .
"'" . $data["id"] . "'," .
"'" . $data["name"] . "'," .
"'" . $data["shurui"] . "'," .
"'" . $data["suryou"] . "'," .
"'" . $data["price"] . "'," .
"'" . $data["seizoubi"] . "'," .
"'" . $data["checkbi"] . "')";

INSERTするたびに「登録しました」っていうのも妙な気がしますし。

もっともその前に「SQLインジェクション」って単語を調べた方がいいでしょうけど。
とりあえずmysql_real_escape_stringすればいいのかな。

この質問は投票によってベストアンサーに選ばれました!

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

このQ&Aで解決しましたか?質問する

閉じる

ベストアンサー以外の回答

1〜1件/1件中

ngsatsgさん

2008/2/2609:47:07

プログラムの回答ではありませんが、MySQLには直接CSVファイルをインポートする機能があります。
LOAD DATA INFILE [filename] INTO TABLE [tablename] FIELDS TERMINATED BY ",";
[filename]はCSVファイル名、[tablename]はインポートするテーブル名を適宜入力してください。

PHPでファイルのアップロードさえ出来れば、あとはサーバ上のフルパスを[filename]に入れてあげればインポートできるかと思います。

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する