- ベストアンサー
冗長なコードの添削のお願い
- 月刊誌の過去記事の目録を構築するため、プルダウンメニューの作成方法を教えてください。
- 現在のコードは冗長でスマートではないため、より効率的なコードに書き換えたいです。
- MySQL関数の非推奨について教えていただき、対応についても考えています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- muuming2001
- ベストアンサー率23% (202/845)
関連する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
お礼
yambejpさん、毎度お世話になりますm(_ _)m 考え方、非常に参考になります。大方針が拙いから、こんなぐちゃぐちゃになって しまうのでしょうね・・・ Classというのは、書籍などでちらっとは承知しているのですが、 敷居が高そうで勉強に踏み込めずにいます。 ステップアップには不可欠なのかもしれませんが。 少し出力方法、関数化などについて検討してみます。