• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:冗長なコードの添削のお願い・・・)

冗長なコードの添削のお願い

このQ&Aのポイント
  • 月刊誌の過去記事の目録を構築するため、プルダウンメニューの作成方法を教えてください。
  • 現在のコードは冗長でスマートではないため、より効率的なコードに書き換えたいです。
  • MySQL関数の非推奨について教えていただき、対応についても考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

以前回答したように、処理部分と出力部分をわけることです。 だらだらと出力しながらフローが書けるのがPHPの良いところではありますが むしろそれによって煩雑なコードになりがちです 処理部分については関数化し、出力部分は変数にためたのちまとめて printするほうが見やすいコードになります たとえばselectタグを得るところはgetSelect()的な関数を作るとよいでしょう (関数名は競合を考えると命名法はもうすこし工夫が必要です) PHPの使用もだいぶ長くなってきているのでそろそろ classを利用することを考えた方がよいころだと思いますよ

litton101
質問者

お礼

yambejpさん、毎度お世話になりますm(_ _)m 考え方、非常に参考になります。大方針が拙いから、こんなぐちゃぐちゃになって しまうのでしょうね・・・ Classというのは、書籍などでちらっとは承知しているのですが、 敷居が高そうで勉強に踏み込めずにいます。 ステップアップには不可欠なのかもしれませんが。 少し出力方法、関数化などについて検討してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

>>素人の私がみてもいかにも冗長であることは明白です。 どこらへんが冗長なのでしょうか? まずそれを理由と・場所・ロジック等 明記しましょう。

litton101
質問者

お礼

muuming2001さんコメントをありがとうございました。 2つ3つ特集がある号さえなければシンプルなのですが、 それがあるゆえに、いろいろ書き足した行が増えています。 少し見直してみます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • WHILE中で前と重複したら間引くコードの書き方

    http://okwave.jp/qa/q8277847.html で、No2のagunuz様にご教示いただいたサンプルを以下のように組み込みました。 (当方コメントは■です) $sv_magazine = ''; while ($col = mysql_fetch_array($rst)) { $magazine = $col['magazinecode']; if ($magazine !== $sv_magazine) { if ($sv_magazine !== '') { // 前のマガジン番号($sv_magazine)のフッタ(必要があれば) $body .= "</ul>\n"; //■この行を加筆しました } // 今読んだマガジン番号($magazine)のヘッダ $body .= "<h1>【" . $col['yyyymm'] . "】</h1>\n"; //■この行を加筆しました $body .= "<ul>\n"; //■この行を加筆しました $sv_magazine = $magazine; } // $col から明細を出力 $body .= "<li>". $col["category"] ; //■ここから・・・・ $body .= "<ul>\n"; $body .= "<li>" . $col["title"]; $body .= "<ul>\n"; $body .= "<li>" . $col["author"]; $body .= "</ul>\n"; $body .= "</ul>\n"; //■・・・ここまでの行を加筆しました } // ループ終了 if ($sv_magazine !== '') { // 最後のマガジン番号($sv_magazine)のフッタ(必要があれば) $body .= "</ul>\n"; //■この行を加筆しました } 上記を実行し、元質問にお示ししたサンプルレコードを読み込むと、以下のように出力されます。 (箇条書きインデントのポツのレベルは、1は●、2は◇、3は◎と仮定します) ただ、当前ですが、同じ号の同じ「分類(『特集』、『連載』などの文言)」が2回目以降にもでてくるのはスマートでないので、注記した行は間引いて、以下のようにスッキリHTMLに出力表示させたいと思います。 【2013年5月号】 ●特集:折り紙  ◇作成法1   ◎山本 ●特集:折り紙  【←この行は2度目なので間引いて表示しない】  ◇作成法2   ◎佐藤 ●特集:折り紙  【←この行も3度目なので間引く】  ◇作成法3   ◎岩田 ●連載  ◇はさみ研ぎ方   ◎伊藤 ●連載     【←この行は2度目なので間引く】  ◇のりの選び方   ◎野口 当方での想像として、ループ中、もし$col["category"]の文字列が前に出てきたのと同一ならスキップ(非表示)でいいよ、というスイッチを加筆すれば良さそうですが、どのように記述したらよろしいでしょうか。 (質問とぜんぜん関係ないですが、冒頭のコードで、$sv_magazine = '';と初期化?させているのは理解できますが、WHILEの外側でなぜ効くのか、悩んでます(^_^;)

    • ベストアンサー
    • PHP
  • select文

    こんばんは。PHPでデータベースからレコードとフィールドを表として取り出そうとしてますが、うまく行きません。 MySQLへの接続はうまくいってると思うので、while文が間違ってるのでしょうか?PHPのバージョンはPHP Version 4.4.2です。 よろしくお願いしますm(__)m <?php require_once("dbini.php"); $con = mysql_connect($server, $user, $pass); $select = mysql_select_db($dbname, $con); $sql = "select * from book"; $rst = mysql_query($sql, $con); $body = "<table border='0' cellpadding='5' cellspacing='5' width='500'><tr><td>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<b><font size='+2'>".$col["title"]."</font></b>" $body .= "</td></tr>"; $body .= "<tr><td colspan='2'>".$col["article"]."</td></tr></table>"; } mysql_free_result($rst); $con = mysql_close($con); ?> <html> <body> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP+MYSQLで直近3件のデータ表示

    直近のデータを3件表示するのに $sql =" select * from テーブル order by フィールド(date型) desc limit 3" ; だとうまくいくのですが DATETIME形に変えるとうまくいかないのは、何か変な事してますでしょうか? $sql =" select * from テーブル order by フィールド(datetime型) desc limit 3" ; 他の箇所は両方とも全く一緒です。 データは入れてあります。 宜しくお願いいたします。 全文は書けなかったので <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql =" select * from mem order by rupdate desc limit 3" ; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 件のデータがみつかりました。</B>"; $body .= "<TABLE border='1' cellpadding='2' cellspacing='0'> <TR> <TH bgcolor='#00CCCC'>会員ID</TH> <TH bgcolor='#00CCCC'>会員名</TH> <TH bgcolor='#00CCCC'>性別</TH> <TH bgcolor='#00CCCC'>ジャンル</TH> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["id"] . "</TD>\n"; $body .= "<TD>" . $col["name"] . "</TD>\n"; $body .= "<TD>" . $col"seibetu"] . "</TD>\n"; $body .= "<TD>" . $col["cate"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> 以下 <?= $body ?> を貼り付けています

    • ベストアンサー
    • PHP
  • 検索結果の表示をもっと早くしたい

    次のように、200人の「MYID」諸氏に対応する登録年月(6桁)を リストアップしたところ、SQLを人数分解釈するためか、 表示までに異常に時間がかかってしまうのですが、 改善案をご教示いただけますと幸いです。 リストアップのイメージ (1001氏) 200409 200410 200411 (1002氏) 200501 200402   :(略) <?php $con = mysql_connect(SERV, USR, PASS); $selectdb = mysql_select_db(MYDV, $con); $numfrom = "1001"; $numto = "1200"; for ($i = $numfrom ; $i <= $numto; $i++) { $sql = "SELECT * FROM MYTABLE"; $sql .= "WHERE MYID = " . $i; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body .= "<table border='1'>\n"; for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body .= "<tr>\n"; $body .= "<td>" . $col["YYMM"] . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table><br>\n"; } mysql_free_result($rst); $con = mysql_close($con); ?> <html><body> <?= $body ?> </body></html>

    • ベストアンサー
    • PHP
  • forで書き出した値を条件付で合計したい

    PHPファイルで、以下のような成績表が出力されます。 ------------ 国語  算数 ------------ 89   NULL 90   78 NULL  45 60   99   :略 ------------- 150  177 ←こういう風に合計行を付けたしたいのですが、 事情があり、国語も算数も受験した者だけを合計したいのです。 for文とかmysql_fetch_arraytとか、使ってる関係で、 どういうにすればよいのかさっぱり見当つきません。 記述につき、アドバイスいただけますと幸いです。 <?php $con = mysql_connect(SERV, USR, PASS); $selectdb = mysql_select_db(MYDV, $con); $sql = "SELECT KOKUGO,SANSU FROM MYTABLE"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body .= "<table border='1'>\n"; for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body .= "<tr>\n"; $body .= "<td>" . $col["KOKUGO"] . "</td>\n"; $body .= "<td>" . $col["SANSU"] . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table><br>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <html><body> <?= $body ?> </body></html> ■ 環境 PHP 5.0.4 Win MySQL mysql 4.0.14b Win ■知識レベル: HTMLタグ打ち、初歩的なSQLを理解できる程度、PHP他プログラミング知識ほとんどなし

    • ベストアンサー
    • PHP
  • 縦に長い<table>でなく横に長い<table>を組むためのfor文の書き方

    文末のコードを実行すると、下記のような結果が得られますが、 番号 名前 性別   1 阿藤 男   2 江藤 男   3 加藤 女   4 木藤 女   5 工藤 男 行列を入れ替えた表をつくりにはどういうロジックになりますか。 番号   1   2   3   4   5 名前  阿藤  江藤  加藤  木藤  工藤 性別   男   男   女   女   女 おそらく、for文を改造するのでしょうが・・・ よろしくお願い致します。 <?php $con = mysql_connect(SERVER, USER, PASS); $selectdb = mysql_select_db(DB, $con); $sql = "select * from mytable"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<table border='1'><tr><th>番号</th><th>名前</th><th>年齢</th><tr>\n"; for ($i = 0; $i < $recmax; $i++) { $col = mysql_fetch_array($rst); $body .= "<tr>\n"; $body .= "<td>" . ($i + 1) . "</td>\n"; $body .= "<td>" . $col["name"] . "</td>\n"; $body .= "<td>" . $col["age"] . "</td>\n"; $body .= "</tr>\n"; } $body .= "</table>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <HTML><BODY> <?= $body ?> </BODY></HTML>

    • ベストアンサー
    • PHP
  • DBからの値をリストアップするとき目印別にテーブルを組みたい

    ■ 環境 PHP 5.0.4 Win、MySQL mysql 4.0.14b Win ■知識レベル HTMLタグ打ち、初歩SQLは理解可、PHP他プログラミング知識なし 文末のソースで以下のようなリストを作ることはできたのですが: n冊みつかりました。 ―――――― 価格 書名 ―――――― 1000 ○○○ 2000 △△△   : ―――――― テーブルに含まれるpublisherというフィールドを目印に出版社別にテーブルを 組んで表示したいのですが、どのように書き換えたらよいでしょうか。 n冊みつかりました。出版社が n社 ありますので出版社別に分けて表示します。 ×社 ―――――― 価格 書名 ―――――― 1000 ○○   : ―――――― □出版 ―――――― 価格 書名 ―――――― 2000 △△   : ―――――― : <?php $con = mysql_connect(SERVER, USER, PASS); $selectdb = mysql_select_db(MYDB, $con); $sql = "select * from book"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 冊みつかりました。</B>"; $body .= "<TABLE> <TR> <TD>価格</TD> <TD>書名</TD> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["price"] . "</TD>\n"; $body .= "<TD>" . $col["title"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <HTML><BODY> <?= $body ?> </BODY></HTML>

    • ベストアンサー
    • PHP
  • 同じ構造の2テーブルをつき合わせて対比表を作成したい

    同じ構造の2テーブルをつき合わせて対比表を作成したい 去年テーブル(kyonen)に、氏名(simei)、生年月日(seinen)社名(syamei)、電話番号(denwa)と4項目×300人分のレコードがあります。 今年テーブル(kotosi)にも、まったく同じ氏名(simei)、生年月日(seinen)、社名(syamei)、電話番号(denwa)と4項目×150人分のレコードがあります。 去年、今年のテーブルつき合わせ、氏名と生年月日が一致したら同一人物と判定するとします。去年と今年で重複人物は70名いるので、今年テーブルを基準に以下のような表を9項目×70名の表を作成したいです。 1.去年テーブルにも存在いるか(○|×) 2.氏名 3.生年月日 4.去年社名 5.今年社名 6.去年と今年の社名は一致するか(○|×) 7.去年電話 8.今年電話 9.去年と今年の電話は一致するか(○|×) これら、PHP側で強引に対処する以下のような方法は考えましたが、MySQL側で凝ったSQLを作成するなどして、もっとスマートかつ効率よく工夫できませんか? <?php $body = "<table>"; $sql = "select * from kotosi"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $sql2 = "select * from kyonen where simei = $col['simei'] and seinen = $col['seinen']"; $rst2 = mysql_query($sql2, $con); $col2 = mysql_fetch_array($rst2); if (mysql_num_rows($rst2) > 0 ) { $Flg = "○" } else { $Flg = "×" }; if ($col["syamei"] == $col2["syamei"]) { $syameiFlg = "○" } else { $syameiFlg = "×" }; if ($col["denwa"] == $col2["denwa"]) { $denwaFlg = "○" } else { $denwaFlg = "×" }; $body .= "<tr>\n"; $body .= "<td>" . $Flg . "</td>\n"; //去年テーブルにも存在いるか $body .= "<td>" . $col["simei"] . "</td>\n"; //氏名 $body .= "<td>" . $col["seinen"] . "</td>\n"; //生年月日 $body .= "<td>" . $col2["syamei"] . "</td>\n"; //去年社名 $body .= "<td>" . $col["syamei"] . "</td>\n"; //今年社名 $body .= "<td>" . $syameiFlg . "</td>\n"; //去年と今年の社名は一致するか $body .= "<td>" . $col2["denwa"] . "</td>\n"; //去年電話 $body .= "<td>" . $col["denwa"] . "</td>\n"; //今年電話 $body .= "<td>" . $denwaFlg . "</td>\n"; //去年と今年の電話は一致するか $body .= "</tr>\n"; } $body = "</table>"; ?> よろしくお願い致します。 環境:(MySQL 5.0.24a: PHP 5.2.2)

    • ベストアンサー
    • PHP
  • 入門書のPHPサンプル内で、MySQL関数を使いたい

    環境:PHP5.0.3+MySQL4.0.14です。PHPどころか、プログラムも素人です。 検索結果をHTML表に一覧化する仕組みを作っているのですが WHERE条件に合致した数値データを平均化したり、 WHERE条件合致した日付データの書式を【MySQL関数によって】加工したいです。 それぞれ、mysql.exe(DOS窓上)での書き方はわかったものの (SELECT AVG(HOGE1) WHERE (HOGE <= 1) のように)、 これをPHPに組み込んだ際ににどう使えばわからないです。 今回使っているPHP入門書のサンプルは以下の通りです。ここで mysql_fetch_arrayに格納されたテーブル(カラム)を取り出しているらしい ことはわかりますが、以下のサンプルで加工したい対象である $col["DATE1"]、$col["HOGE1"]を $col["date_format(DATE1, '%y/%m/%d')"] や $col["AVG(HOGE1)"]などと してもだめみたいです。 以下の例で、これらを取り出すにはどのように記述したらいいでしょうか。 よろしくお願い致します。 <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql = "select * from mytable"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "結果: $recmax 件"; $body .= "<table>"; for ($recnum = 0; $recnum < $recmax; $recnum++) { $col = mysql_fetch_array($rst); $body .= "<td>" . $col["DATE1"] . "</td>"; $body .= "<td>" . $col["HOGE1"] . "</td>"; $body .= "</tr>"; } $body .= "</table>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <html> <head></head> <body> <?= $body ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHP+MYSQLでレコードの表示させ方

    いつも初心者の質問でスミマセン。 PHP MYSQL で 会員制ページを作っています。 このような時にはどういう風にしたらいいか教えてください。 1件のレコードに 名前 出身県 性別 がある時に 下記のようにその個人のページにリンクしたいのですが ひとつの県だけなら出来るのですが、 このように条件を色々と設定するにはどうしたらいいか ヒントだけでもお願いいたします。 沖縄県出身者 男 A B C 女 D E F 東京出身者 男 G H I 女 J K L このようにしていました。 <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql = "select * from mem where seibetu = 1 and area = 1 " ; $rst = mysql_query($sql, $con); $body1 .= ""; while($col = mysql_fetch_array($rst)) { $body1 .= "⇒" . "<A href='" . $col["id"] . "j.html'>" . $col["name"] . "</A>"; $body1 .= "<br>\n"; } mysql_free_result($rst); $con = mysql_close($con); ?> これでボディに<?= $body1 ?> を張っていました。 これを<?= $body2 ?> と繰り返したらいいのかと思い色々していましたが どうしてもうまくいきません。 宜しくお願いいたします。

    • ベストアンサー
    • PHP