2007年11月11日

CodeIgniterで作り直す前の手続き型のスクリプト

今回からようやくCodeIgniterの構築記(メモ)を書こうとしているわけですが、その前にやはりこれまで散々ネタにしてきた 手続き型で書かれたぐちゃぐちゃの・汚い・見るに耐えないスクリプトを公開しておこうとおもいます。

<?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
posted by ciallost at 21:45| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック