ファイルリストをMySQLにツっ込む
前に「最終的には同じ動作をするPHPスクリプトを書く事になるでしょう」とか書いてたら(とっても意外な事に)反応が有りましたんで、実際に作成したスクリプトを公開しときます。
ファイルリストの作成自体は前回記事参照。その後
<form method="post" action="dbup.php" enctype="multipart/form-data">
アップロードファイル:
<input type="file" name="fl" size="20" />
<input type="submit" value="upload" />
</form>
みたいなフォームから「ツっ込みスクリプト」dbup.phpを呼び出します。
<?php header("Content-Type:text/html;charset=EUC-JP"); ?>
<html>
<head>
<title>アップロード結果</title>
</head>
<body>
<h1>アップロード結果</h1>
<?php
/* 初期設定 */
$database = "database";
$table = "table";
$db=mysql_connect("localhost","user","password");
$num=0;
$errNum=0;
mysql_select_db($database,$db);
/* まず、テーブルから全てのレコードを消しちゃいます */
$sql="DELETE FROM ". $table ."";
mysql_query($sql,$db);
/* テンポラリファイルを読取専用で開いて */
$file=fopen($_FILES['fl']['tmp_name'],"r");
/* 行をセミコロン区切りで分解→配列に格納 */
while($dat=fgetcsv($file,10000,";")){
/* SJIS→EUCに変換&半角カナを全角化 */
$dat[0]=mb_convert_kana(mb_convert_encoding($dat[0], "EUC-JP" , "SJIS"));
$dat[1]=mb_convert_kana(mb_convert_encoding($dat[1], "EUC-JP" , "SJIS"));
/* pathとfilename中のシングルクォートをエスケープ */
$dat[0] = str_replace ("'" , "''" , $dat[0]);
$dat[1] = str_replace ("'" , "''" , $dat[1]);
/* パスを/毎に分解→配列へ */
$path = explode("/",$dat[0]);
/* パス中の/をカウント→階層の深さを取得 */
$level=substr_count($dat[0] , "/");
/* ファイル名をバラして配列へ→拡張子を取得する処理 */
$path_parts = pathinfo($dat[1]);
/* 取得した拡張子を小文字に変換 */
$extension=strtolower ($path_parts[extension]);
$sql="INSERT INTO $table(path,filename,filesize,timestamp,path1,path2,path3,path4,path5,path6,path7,path8,path9,ext,level) VALUES('".$dat[0]."','".$dat[1]."','".$dat[2]."','".$dat[3]."','".$path[1]."','".$path[2]."','".$path[3]."','".$path[4]."','".$path[5]."','".$path[6]."','".$path[7]."','".$path[8]."','".$path[9]."','". $extension ."','". $level ."')";
/* データベースに入れるのはタイムスタンプのあるファイルだけ */
if($dat[3]!="") {
mysql_query($sql,$db);
if(mysql_errno()!=0){
$errNum++;
echo $sql."<br>\n";
}
$num++;
}
}
fclose($file);
mysql_close($db);
?>
<br />
<div style="color:red">投入総件数は<?php print($num); ?>件、内エラー件数は<?php print($errNum); ?>件でした</div>
</body>
</html>
ちなみにテーブルはこんな感じ。
+-----------+--------------+------+-----+------------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+------------+-------+
| path | text | YES | | NULL | |
| filename | text | | | | |
| filesize | int(13) | | | 0 | |
| timestamp | date | | | 0000-00-00 | |
| path1 | varchar(255) | YES | | NULL | |
| path2 | varchar(255) | YES | | NULL | |
| path3 | varchar(255) | YES | | NULL | |
| path4 | varchar(255) | YES | | NULL | |
| path5 | varchar(255) | YES | | NULL | |
| path6 | varchar(255) | YES | | NULL | |
| path7 | varchar(255) | YES | | NULL | |
| path8 | varchar(255) | YES | | NULL | |
| path9 | varchar(255) | YES | | NULL | |
| ext | varchar(10) | YES | | NULL | |
| level | int(10) | | | 0 | |
+-----------+--------------+------+-----+------------+-------+
予告通り、パスを/毎に分解してpath1〜9に格納してます。extはファイルの拡張子で、levelはファイルの存在する階層の深さを表わします。
ワタシゃ未だPHP初心者なんで、拙い&妙なトコが有ってもどうかご寛恕くださいですm(__)m