仕事で何故かPHPを少し触る事になった。
で、その中でPHPで作られたコマンドラインツールでクエリの結果(複数行・複数列)をそのまま出力させたい箇所があり、以下のように多次元連想配列を利用すると簡単に書けたので備忘として残しておく。
※以下の例では、PDOを使用してSQLiteに接続している。
●test.php
/*
==== 変数 ====
*/
$dbfile = 'test.db'; // 使用するDBファイル
$dbtable = 'TEST'; // SQLを実行するテーブル名
$dbwhere = 'AAA'; // SQLで検索する文字列
$dbcolum = 3; // 取得するカラム数(列数)
/*
==== 関数 ====
*/
// DB接続処理
function SQLite_Connect($sqlite_dbfile)
{
$dsn = 'sqlite:'. $sqlite_dbfile;
return new PDO($dsn);
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
return new PDO($dsn,'','', $opt);
}
/*
==== Main ====
*/
// DB接続
$pdo=SQLite_Connect($dbfile);
// 実行するクエリの定義
$query = "SELECT `ID`
,`NAME`
,`DATE`
FROM `". $dbtable ."`
WHERE `NAME` LIKE '%" . $dbwhere ."%';";
// SQLの実行
$stmt = $pdo->query($query);
// SQLの実行結果を多次元連想配列で処理する
$result = $stmt->fetchAll();
foreach ($result as $key=>$val) {
$k=0;
while ($k <= ( $dbcolum - 1)) {
print $val[$k] ;
$k=$k+1;
if ($k < $dbcolum){
print ",";
}
}
print "\n";
}
[root@localhost ~]# sqlite3 ./test.db --batch 'SELECT * FROM TEST WHERE NAME LIKE "AAA"; '
1|AAA|2016-04-17 04:01:16
2|AAA|2016-04-17 04:01:17
12|AAA|2016-04-17 04:02:05
13|AAA|2016-04-17 04:02:06
14|AAA|2016-04-17 04:02:06
[root@localhost ~]# php test.php
1,AAA,2016-04-17 04:01:16
2,AAA,2016-04-17 04:01:17
12,AAA,2016-04-17 04:02:05
13,AAA,2016-04-17 04:02:06
14,AAA,2016-04-17 04:02:06