冗長なコードの添削のお願い・・・
月刊誌の過去記事の目録を構築していて、プルダウンに発行年月と号数、特集スポーツ名を列記したショートカットメニューを構築したいのですが、月によって特集テーマが2つ、3つある号があり、これらもプルダウンに連記してセットしたいと思います。
以下のサンプルのように既に実現はできてはいるのですが、以下のコード、素人の私がみてもいかにも冗長であることは明白です。もっとスマートに書き換えられるならご教示いただければ幸いです。
なお、本件、別カテゴリでの質問での御礼に聞きかけた質問ですが(http://okwave.jp/qa/q8309533.html)、既に初期の目的が達せられたため締め切りました。恐縮ですが改めて伺います。
//元データ
CREATETABLE`mymagazine`(`myCode`int(5)unsignedNOTNULLauto_incrementCOMMENT'管理コード',`myPubYear`int(4)defaultNULLCOMMENT'発行年',`myPubMonth`int(2)defaultNULLCOMMENT'発行月',`mySequence`int(3)defaultNULLCOMMENT'号',`mySortNo`int(2)defaultNULLCOMMENT'巻毎のソート番号',`myCategoryCode`int(2)defaultNULLCOMMENT'分類コード',`myTheme`varchar(900)defaultNULLCOMMENT'テーマ',PRIMARYKEY(`myCode`)
)ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='テーブル'AUTO_INCREMENT=1;
INSERTINTO`mymagazine`(`myPubYear`,`myPubMonth`,`mySequence`,`mySortNo`,`myCategoryCode`,`myTheme`)VALUES(2005,7,138,1,99,''),(2005,7,138,2,1,'サッカー'),(2005,7,138,3,1,'サッカー'),(2005,7,138,14,16,''),(2005,7,138,15,15,''),(2005,8,139,4,1,'野球'),(2005,8,139,5,1,'野球'),(2005,8,139,17,17,''),(2005,8,139,18,17,''),(2005,9,140,1,99,''),(2005,9,140,2,1,'テニス'),(2005,9,140,3,1,'バスケ'),(2005,9,140,4,1,'バスケ'),(2005,9,140,5,1,'バスケ'),(2005,9,140,6,1,'水泳'),(2005,9,140,7,2,''),(2005,9,140,8,14,''),(2005,9,140,9,13,''),(2005,11,142,2,1,'柔道'),(2005,11,142,3,1,'剣道'),(2005,11,142,4,1,'剣道'),(2005,11,142,5,8,''),(2005,11,142,6,2,''),(2006,1,144,2,1,'卓球'),(2006,1,144,3,1,'卓球'),(2006,1,144,4,1,'バレー'),(2007,9,236,2,1,'陸上'),(2007,9,236,3,1,'陸上'),(2007,9,236,4,1,'陸上'),(2007,9,236,5,4,'ソフト'),(2007,9,236,6,5,'')
//コード
<?php
$con = mysql_connect(serv, user, pw);
$selectdb = mysql_select_db(DBNAME, $con);
$sql = "select *,";
$sql .= " (select if(max(mySortNo)=t1.mySortNo,1,null) from mymagazine where mySequence=t1.mySequence and myCategoryCode =1) as myflg"; // フラグ
$sql .= " from mymagazine as t1";
$sql .= " order by mySequence desc";
$rst = mysql_query($sql, $con);
$body = "<select name=\"myselect\"\">\n";
while ($col = mysql_fetch_array($rst)) {
// 発行年を見出しにセット
if ( $sv_myPubYear != $col["myPubYear"] ) {
if ( $sv_myPubYear != '' ) {
$body .= "</optgroup>\n";
}
$body .= "<optgroup label=\"" . $col["myPubYear"] . "年\">\n";
}
//号数(mySequence)と分類コード(myCategoryCode=特集、連載、投稿など各コーナー名で1だけを抽出する)
//が変わらないのに特集テーマが変わったらテーマの文言を追記する
if (($col["mySequence"] == $sv_mySequence) && ($col["myCategoryCode"] == $sv_myCategoryCode) && ( $col["myTheme"] != $sv_myTheme)) {
$selectStr = $selectStr . "◆" . $col["myTheme"];
} else {
$selectStr = $col["myTheme"];
}
//同じ号数で、直前のループと比較して文字数が減っていたら、前の方を採用
if (($col["mySequence"] == $sv_mySequence) && (mb_strlen($selectStr,"utf-8") < mb_strlen($sv_selectStr,"utf-8"))) {
$selectStr = $sv_selectStr;
}
//SQLで設置したフラグがたっている場合だけ、プルダウンメニューとして書き出す。
if ($col["myflg"] == '1') {
$body .= "<option>" . $col["myPubMonth"] . "月号(第" . $col["mySequence"] . "号) " . $selectStr . "</option>\n";
}
//次のループで比較検討用に各値の持ち越し
$sv_myPubYear = $col["myPubYear"];
$sv_mySequence = $col["mySequence"];
$sv_myCategoryCode = $col["myCategoryCode"];
$sv_myTheme = $col["myTheme"];
$sv_selectStr = $selectStr;
}
$body .= "</optgroup>\n";
$body .= "</select>\n";
?>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>
<body>
<?= $body ?>
</body>
</html>
なお先日、別質問でMySQL関数の非推奨を教わり、こちらには後日に取り組むつもりです(なかなか対応できなくてスミマセン)
http://okwave.jp/qa/q8277847.html
お礼
To_aru_Userさん、いつもお世話になります。また、早速のご回答ありがとうございました。 PDOですが、一度は前回もご教示いただいたサイトなどを確認しながら導入をやりかけたのですが、php.iniの編集などでつまづいていました。 とりあえず、今回の雑誌索引は、当面社内LAN内での運用にとどまる見込みで、対外的(WWW)に公開するとなればそのときでよいかと後回しになっていました。全て言い訳ですが。。。どうもすみません。いずれ必ず取り組む課題の筆頭にはなっております。 >このあたりが他の言語と実装が大きく異なります。PHP独特です。 詳しく教えていただき大変ありがとうございます。 やや難しい話ですが、事情がわかって非常にすっきりしました。