【PHPサンプル】サクッと簡単!データベースから取得したデータをCSVでアウトプット

PHP

よく使用する処理を簡単なサンプルプログラムに起こして備忘録としておきます。
※事前の設定などの前置きは省略します。

スポンサーリンク

概要

  1. コマンドライン引数で指定された値をキーとして、データベースからデータを取得(PDOを使用)
  2. 取得したデータをCSV形式に整形 => CSVファイルでアウトプット
  3. CSVファイルを指定したファイルパスへ保存

※サンプルで使用しているデータベースは「RESAS」から取得した地域データを使用してます。

RESAS-API - 市区町村一覧
地域経済分析システム(RESAS:リーサス)のデータがAPI提供されます。API提供されることにより、従来よりも深く・自由に分析することが可能となります。今までRESASでは見えなかった各地域における真の課題の抽出や地域資源の再発見をサポートし、地域ビジネスに通じるサービスを地域自らが創り上げることが可能となります。

サンプルプログラム

ソースコード

ファイル名はcsv_sample.phpとしました。

<?php
//DB接続情報
$dsn = "mysql:host=localhost;dbname=resas;charset=utf8mb4;port=22";
$id = "userName";
$pw = "passwd";

if (empty($argv[1]) === true) {
    print("コマンドライン引数が空です。");
    exit();
}

//DB接続
$pdo = new PDO($dsn, $id, $pw,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
$sql = "SELECT * FROM cities WHERE prefCode = :prefCode ORDER BY cityCode ASC";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":prefCode", $argv[1], PDO::PARAM_STR);
$stmt->execute();
$res = $stmt->fetchAll();

if (empty($res) === true) {
    print("該当データはありませんでした。");
    exit();
}

//CSVヘッダ
$csvstr = "市区町村コード,市区町村名,特別区/行政区フラグ \r\n";

//CSV中身
foreach ($res as $v) {
    $csvstr .= $v["cityCode"] . ",";
    $csvstr .= $v["cityName"] . ",";
    $csvstr .= $v["bigCityFlag"] . "\r\n";
}

// CSVファイルの吐き出し先 + ファイル名を指定
$filepath = "./cities.csv";
// csvファイルを作成
$file_handle = fopen($filepath, "w");

// ファイルへデータを書き込み
$csvstr = mb_convert_encoding($csvstr, "UTF-8", "UTF-8");
fwrite( $file_handle, $csvstr);
chmod($filepath, 0777);
fclose($file_handle);

実行方法

任意のディレクトリに配置して引数付きでコマンドラインから実行します。

「都道府県コード」を引数で指定
# php /var/www/sampletasks/csv_sample.php 都道府県コード

例) 
# php /var/www/sampletasks/csv_sample.php 1

実行結果

都道府県コードを「1」で実行して出力されたCSVの中身。

市区町村コード,市区町村名,特別区/行政区フラグ 
01100,札幌市,2
01101,札幌市中央区,1
01102,札幌市北区,1
01103,札幌市東区,1
01104,札幌市白石区,1

・・・省略・・・

01696,国後郡泊村,0
01697,留夜別村,0
01698,留別村,0
01699,紗那村,0
01700,蘂取村,0

補足

サンプルプログラムの補足事項です。

コマンドライン引数

コマンドライン引数で指定された値は$argv変数(配列)に格納され、プログラム側で使用することができます。

PDO

PDO接続

以下は読み替えて適宜値で指定してください。

$dsn = "mysql:host=ホスト名;dbname=データベース名;charset=文字コード;port=ポート番号";
$id = "userName";
$pw = "passwd";

$pdo = new PDO($dsn, $id, $pw,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

バインド

インジェクション対策として、外部から入力された値を使用する場合は必ずバインドするようにしましょう。
補足ですが、バインドには「名前つきプレースホルダー」「疑問符プレースホルダー」2つの指定方法があります。

名前つきプレースホルダー

サンプルブログラム内のバンドは「名前つきプレースホルダー」です。

$sql = "SELECT * FROM cities WHERE prefCode = :prefCode ORDER BY cityCode ASC";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(":prefCode", $argv[1], PDO::PARAM_STR);
疑問符プレースホルダー

以下のように「疑問符プレースホルダー」で記述もできます。

$sql = "SELECT * FROM cities WHERE prefCode = ? ORDER BY cityCode ASC";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $argv[1], PDO::PARAM_STR);

bindValue引数でSQL内の「?」の位置を指定します。
サンプルプログラム内ではバインド箇所が1つしかなく分かりにくいですが、複数ある場合は以下のようになります。

$sql = "SELECT * FROM cities WHERE prefCode = ? AND cityCode = ? ORDER BY cityCode ASC";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(1, $argv[1], PDO::PARAM_STR); //prefCodeの位置
$stmt->bindValue(2, $argv[2], PDO::PARAM_STR); //cityCodeの位置

ファイル保存

今回サンプルではfopen ~ fcloseしてファイル操作してますがfile_put_contentsを使用することで同等の処理をする事もできます。

fopen ~ fclose

// CSVファイルの吐き出し先 + ファイル名を指定
$filepath = "./cities.csv";
// csvファイルを作成
$file_handle = fopen($filepath, "w");

// ファイルへデータを書き込み
$csvstr = mb_convert_encoding($csvstr, "UTF-8", "UTF-8");
fwrite( $file_handle, $csvstr);
chmod($filepath, 0777);
fclose($file_handle);

file_put_contents

// CSVファイルの吐き出し先 + ファイル名を指定
$filepath = "./cities.csv";

// ファイルへデータを書き込み
$csvstr = mb_convert_encoding($csvstr, "UTF-8", "UTF-8");
file_put_contents($filepath, $csvstr);
chmod($filepath, 0777);
タイトルとURLをコピーしました