phpでcsvデータをMySQLにインポートをしたいのですがその時に重複チェックを同時に行い重複したものについてはインポートしないという作業を行いたいのです。




uid pass addr comment

111 222 a@a.a ほげほげ

インポートする時 uid、addrにおいて1個でも重複があればその行だけはインポートをしないという設定です。

下記がソースになります。

下記の場合ですと重複していると出るのですがsqlに登録されています。

重複をはずし登録する場合はどのように記述すればよいでしょうか?


http://d.hatena.ne.jp/zenval/20070703

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2007/07/03 19:52:40
  • 終了:2007/07/04 14:49:47

回答(3件)

id:F-15X No.1

F-15X回答回数111ベストアンサー獲得回数132007/07/03 21:39:52

ポイント44pt

NSERT IGNORE 構文

過去質問より

http://q.hatena.ne.jp/1166170219

http://q.hatena.ne.jp/1164377582

参考になりますでしょうか?

id:zenval

自分の能力不足なのでしょうか…

ちょっと違ったような気がします

2007/07/04 11:00:25
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/07/04 00:40:39

ポイント44pt

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.5.7 CREATE INDEX 構文

uid, addr の双方のカラムに UNIQUE インデックスを張っておく。

これで重複登録は防げる。


MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.3 INSERT 構文

その後、INSERT IGNORE INTO table_name 構文を使って「全てのレコードを」INSERT する。

重複するレコードは前述のインデックスによってはじかれるが、IGNORE オプションをつけているので SQL 自体はエラーにならない。

これで要求は満たせるはず。

id:zenval

参考にさせて頂きました。

2007/07/04 12:41:31
id:Yota No.3

Yota回答回数453ベストアンサー獲得回数282007/07/04 09:58:28

ポイント44pt

1.あらかじめDBの方でcolumnに必要な制約をつけておく。例として。

uid PRIMARY KEY,addr UNIQUE,pass NOT NULL,comment NOT NULL

2.スクリプトは抜粋してアレンジしてみました。

$fp = fopen('test.csv', "r");

$row = 0 ;

$valid = true ;

while ($data = fgetcsv($fp,",")) {

$row++ ;

if($data[0] == NULL) { echo$row.'行目1項目目がない
'; $valid = false ; }

if($data[1] == NULL) { echo$row.'行目2項目目がない
'; $valid = false ; }

if($data[2] == NULL) { echo$row.'行目3項目目がない
'; $valid = false ; }

if($data[3] == NULL) { echo$row.'行目4項目目がない
'; $valid = false ; }

if(mysql_num_rows(mysql_query("SELECT name FROM hoge WHERE id = $data[0] ")) > 0 ) {echo'ID重複
' ;$valid = false ; };

if(mysql_num_rows(mysql_query("SELECT name FROM hoge WHERE add = $data[2] ")) > 0 ) {echo'ID重複
' ;$valid = false ; };

if(!$valid) { //ループの先頭へ戻る

continue ;

}else {

mysql_query("insert into name values ('$data[0]', '$data[1]', '$data[2]', '$data[3]','$data[4]', '$data[5]')");

}

}

fclose($fp);

参考にした。

http://www.php.net/manual/ja/function.fgetcsv.php

id:zenval

参考にした結果どうも登録されてないような…

原因なぞです。何が原因とかんがえられるでしょうか。

$inif = "./data.csv";

if(file_exists($inif)){

system("dos2unix $inif data.tmp");

rename("./data.tmp", $inif);

}

else {

echo <<<END</p>

<html>

<body>

<meta http-equiv="content-type" content="text/html; charset=euc-jp">

<title>File Not Found</title>

<head><h1>

ログファイルが見つかりません。
</h1></head>

<form action="./index.htm" method=GET>

<input type=submit name=submit value=戻る>

</form>

</body>

</html>

END;

exit;

}

if($flag == "on"){

$fp = fopen("$inif", "r");

$cnt = 1;

$db = mysql_connect("localhost", "db_id", "db_pass");

if(!$db){

die("mysql_connect() error occured.");

}

$db = mysql_select_db("aaaaaaaaa", $db);

if(!$db){

die("Base de donn? es CONNECTABLE mysql_select_db()");

}

while ($data = fgetcsv($fp,",")) {

$row++ ;

if($data[0] == NULL) { echo$row.'行目1項目目がない

'; $valid = false ; }

if($data[1] == NULL) { echo$row.'行目2項目目がない

'; $valid = false ; }

if($data[2] == NULL) { echo$row.'行目3項目目がない

'; $valid = false ; }

if($data[3] == NULL) { echo$row.'行目4項目目がない

'; $valid = false ; }

if(mysql_num_rows(mysql_query("SELECT * FROM user WHERE uid = $data[0] ")) > 0 ) {echo'ID重複

' ;$valid = false ; };

if(mysql_num_rows(mysql_query("SELECT * FROM user WHERE pass = $data[2] ")) > 0 ) {echo'ID重複

' ;$valid = false ; };

if(!$valid) { //ループの先頭へ戻る

continue ;

}else {

mysql_query("insert into user values ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]')");

}

}

mysql_close($db);

fclose($fp);

echo <<<END</p>

<html>

<meta http-equiv="content-type" content="text/html; charset=euc-jp">

<title>登録完了</title>

<head><h1>

登録完了
</h1></head>

<body>

<form action="./index.htm" method=GET>

<input type=submit name=submit value=戻る>

</form>

</body>

</html>

END;

exit;

}

2007/07/04 12:43:39
  • id:zenval
    無事解決しました。

    ありがとうございました。
  • id:Yota
    回答者3です。
    根本的な間違いがありました。
    $valid = true ;
    がループの内側でないと、一回falseになるとそのままになってしまいす。
    失礼しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません