人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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



uid pass addr comment

111 222 a@a.a ほげほげ

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

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

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

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


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

●質問者: zenval
●カテゴリ:インターネット ウェブ制作
✍キーワード:CSV MySQL PHP SQL ほげほげ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● F-15X
●44ポイント

NSERT IGNORE 構文

過去質問より

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

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

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

◎質問者からの返答

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

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


2 ● b-wind
●44ポイント

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 自体はエラーにならない。

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

◎質問者からの返答

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


3 ● Yota
●44ポイント

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

◎質問者からの返答

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

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

$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;

}

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ