ここから本文です

解決済みのQ&A

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

yngling111さん

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("登録しました");
}
?>

  • 質問日時:
    2008/2/26 00:24:34
  • 解決日時:
    2008/3/11 04:46:45
  • 閲覧数:
    12,806
    回答数:
    2

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

nishukangoさん

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すればいいのかな。

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

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

(1件中1〜1件)

 

ngsatsgさん

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

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

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

総合Q&Aランキング

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

知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

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