<?php
//GETデータの処理
if (isset($_GET['disp'])) {
$max_disp = preg_replace("/[^0-9]/", "", $_GET['disp']);
} else {
$max_disp = 10;
}
$q['disp'] = $max_disp;
if (isset($_GET['p'])) {
$p = preg_replace("/[^0-9]/", "", $_GET['p']);
} else {
$p = 1;
}
//データベース
try {
$dbh = new PDO('sqlite:c:/gappei.db');
$sql = "SELECT newcity.n_id NID,
pref,
newcity.city NC,
oldcity.o_id OID,
oldcity.city OC,
birth
FROM newcity, oldcity, joined
WHERE NID = joined.n_id AND oldcity.o_id = joined.o_id";
if ($_GET['snc'] != "") {
$sql .= " AND NC LIKE :ncity";
$exec_array[":ncity"] = "%".$_GET['snc']."%";
$q['snc'] = $_GET['snc'];
}
if ($_GET['soc'] != "") {
$sql .= " AND OC LIKE :ocity";
$exec_array[":ocity"] = "%".$_GET['soc']."%";
$q['soc'] = $_GET['soc'];
}
$stmt = $dbh->prepare($sql);
if ($stmt->execute($exec_array)) {
while ($row = $stmt->fetch()) {
$data[$row['NID']]['ID'] = $row['NID'];
$data[$row['NID']]['PREF'] = $row['pref'];
$data[$row['NID']]['NCITY'] = $row['NC'];
$data[$row['NID']]['OCITY'][$row['OID']] = $row['OC'];
$data[$row['NID']]['BIRTH'] = $row['birth'];
}
}
$dbh = null;
} catch (PDOException $e) {
print "エラー!: " . $e->getMessage() . "<br/>";
die();
}
//添字配列に変換
$data = array_values($data);
//件数
$hits = count($data);
//最終ページ
$lastpage = ceil($hits / $max_disp);
//表示ページ
if ($p != "") {
$disp_page = (0<$p && $p<=$lastpage)?$p:1;
} else {
$disp_page = 1;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>平成市町村合併</title>
</head>
<body>
<h1>平成市町村合併</h1>
<form id="search" action="<?=$_SERVER['PHP_SELF']?>" method="get">
新市町村:<input type="text" name="snc" size="20" value="<?=htmlspecialchars($_GET['snc'])?>" /><br />
旧市町村:<input type="text" name="soc" size="20" value="<?=htmlspecialchars($_GET['soc'])?>" /><br />
<select name="disp" onChange="submit();">
<option value="10" <?=$max_disp==10?'selected="selected"':''?>>10</option>
<option value="20" <?=$max_disp==20?'selected="selected"':''?>>20</option>
<option value="30" <?=$max_disp==30?'selected="selected"':''?>>30</option>
</select>
<input type="submit" value="検索" />
</form>
<hr />
<table border="1" cellpadding="2" cellspacing="0" width="600">
<tbody>
<th>都道府県</th><th>新市町村</th><th>旧市町村</th><th>合併日</th>
<?php
$cnt = 0;
//データ出力用カウンタ
$index = $max_disp * ($disp_page - 1);
while (isset($data[$index]['NCITY']) && ($cnt < $max_disp)) {
$cnt++;
$rspan=count($data[$index]['OCITY']);
?>
<tr>
<td<?=$rspan>1?' rowspan="'.$rspan.'"':''?>><?=$data[$index]['PREF']?></td>
<td<?=$rspan>1?' rowspan="'.$rspan.'"':''?>><?=$data[$index]['NCITY']?></td>
<td><?=array_shift($data[$index]['OCITY'])?></td>
<td<?=$rspan>1?' rowspan="'.$rspan.'"':''?>><?=$data[$index]['BIRTH']?></td>
</tr>
<?php
if($rspan>1){
foreach($data[$index]['OCITY'] as $ocity){
echo "<tr><td>$ocity</td></tr>";
}
}
$index++;
}
?>
</tbody>
</table>
<hr />
<?php
//ページングリンク出力
if (isset($q)) {
//GETクエリ文字列生成
$common_q = http_build_query($q, '', '&');
}
echo "<p>\n";
//前ページリンク
if (1 < $disp_page) {
$prev = $disp_page - 1;
echo "<a href=\"".$_SERVER['PHP_SELF']."?".$common_q."&p=".$prev."\">< 前の".$max_disp."件</a> \n";
}
//他ページリンク
for ($j=1; $j<=$lastpage; $j++) {
if ($disp_page == $j) {
echo "<strong>$j</strong>\n";
} else {
echo "<a href=\"".$_SERVER['PHP_SELF']."?".$common_q."&p=".$j."\">".$j."</a> \n";
}
}
//次ページリンク
if ($disp_page < $lastpage) {
$next = $disp_page + 1;
$next_disp = min($max_disp, $hits - ($max_disp * $disp_page));
echo "<a href=\"".$_SERVER['PHP_SELF']."?".$common_q."&p=".$next."\">次の".$next_disp."件 ></a> \n";
}
echo "</p>\n";
?>
</body>
</html>
この時点ではデータベースがSQLiteだったのでPDOを使っています。その関係でDB接続〜クエリ送信〜データ取得あたりの処理は意外とすっきり見えるかもしれませんが、ひとえにPDOのおかげです。
ページングも自前で実装しています。formからのデータはgetで受けています。$qという配列はページングのリンクに付け足すクエリ文字列の元?を連想配列で格納してあり、それを直前で展開して&でつなげています。
あとはとり立てて見るべきところもない、ごく一般的なしょーもないスクリプトです。次回からはこれをCodeIgniterで書き直していく過程をメモっていきます。
ラベル:PHP