PHP で MYSQL のテーブルを CSV 出力したり

ちょっと需要があったので30分ぐらいで作った突貫プログラム。見て分かる通りセキュリティ穴だらけなんで使うとしたらローカルで使う等して下さい。このままだと実用には不向きですが改良すれば使えるかも。

< ?php
$DBNAME="データベース名";
$DBUSER="ユーザ名";
$DBPASSWORD="パスワード";
$DBSERVER="データベースサーバ";

$con=mysql_connect($DBSERVER,$DBUSER,$DBPASSWORD);

$query=rawurldecode($_SERVER['QUERY_STRING']);
$querylist=explode("&",$query);
extract($querylist);
if (!empty($table_name)) {
    if ($mode=="csv") {
        show_csv($DBNAME,$table_name);
    } else {
        show_data($DBNAME,$table_name);
    }
} else {
    show_tables($DBNAME,$con);
}

//テーブル一覧表示
function show_tables ($db_name, $db)
{
    global $title;
    global $body;
    $title="「".$db_name."」テーブル一覧";
    $rs=mysql_list_tables($db_name,$db);
    $num_rows=mysql_num_rows($rs);
    if ($num_rows > 0) {
        for ($i = 0; $i < $num_rows; $i++) {
            $table_name = mysql_table_name($rs,$i);
            $body.="<a href="$PHP_SELF?table_name=".$table_name."">".$table_name."[<a href="$PHP_SELF?table_name=".$table_name."&mode=csv">CSV</a>]n";
        }
    } else {
        $body.="テーブルはありませんn";
    }
    mysql_free_result($rs);
    return;
}

//テーブルデータ表示
function show_data ($db_name, $table_name)
{
    global $title;
    global $body;
    $title="「".$table_name."」データ表示";
    $sql="select * from ".$table_name."";
    $rs=mysql_db_query($db_name,$sql);
    $fields=mysql_num_fields($rs);
    $rows=mysql_num_rows($rs);
    $body.="<table><tbody>n";
    for ($i=0;$i< $rows;$i++) {
        $body.="<tr>";
        for ($j=0;$j < $fields;$j++) {
            $body.="<td>";
            $body.=mysql_result($rs,$i,$j);
            $body.="";
        }
        $body.="n";
    }
    $body.="</tbody></table>n";
    mysql_free_result($rs);
    return;
}

//CSV出力
function show_csv ($db_name,$table_name)
{
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".$table_name."_".date(ymd).".csv");
    $sql="select * from ".$table_name."";
    $rs=mysql_db_query($db_name,$sql);
    $fields=mysql_num_fields($rs);
    $rows=mysql_num_rows($rs);
    for ($i=0;$i< $rows;$i++) {
        for ($j=0;$j<$fields;$j++) {
            print(mb_convert_encoding(mysql_result($rs,$i,$j),'SJIS','auto'));
            if ($j<$fields - 1) print(",");
        }
        print("n");
    }
    mysql_free_result($rs);
    exit;
}

mysql_close($con);
?>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
</meta><meta http-equiv="Content-Style-Type" content="text/css">
<title>< ?= $title ?></title>
</meta></head>
<body>
<h1>< ?= $title ?></h1>
< ?= $body ?>
</body>
</html>

データ表示も分割している訳もなく全データを表示してしまっているのでレコード数が多いとブラウザが固まって本当に使えません。CSV 出力する部分は何かと重宝するとか。しないとか。