質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

コードの説明をお願いします。

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 758

YukaSaku

score 43

見ずらくてすみません。
1は、私がネットから引っ張ってきて試行錯誤で作ったものになります。
2が友人が作ってくれたものになります。現在どちらも同じように表示されていますが、最初はどちらも動かなくて、最後にmysqli_data_seek($result, 0);を入れたら、DBのデータがセレクトボックスに入ってくれました。

聞きたいのが、2の友人が作ったコードですが、DBにあるデータを引っ張ってきてただ用意されたセレクトボックスに入れたかっただけなので、まだPOSTはないはずなのですが(これからセレクトボックスで選択されたそれぞれの項目によって、それぞれのページに飛ばす予定です)なぜPOSTがあるのでしょうか?
1と2は同じように表示されているのですが、中身は同じ内容でしょうか?2がなんだかちゃんと解読できません。説明していただけませんか?

---1---
<select name="category">
  <option value="NULL">Choose One</option>
    <?php
    //select box
    $categorybox = array();
    $i = 1;
    mysqli_data_seek($result, 0);
    while ($row = $result->fetch_assoc()) {
  // 一応データをパースする
    $categorybox[$i] = htmlspecialchars(trim(urldecode(mb_convert_encoding($value, 'UTF-8', 'auto'))));
    $i++;
      echo "<OPTION value='". $row['category_id']."' >" . $row['category'] . "</OPTION>\n";
  }  ?>
  </select>
---2---
  <select name="category">
  <option value="NULL">Choose One</option>
  <?php
  mysqli_data_seek($result, 0);
        $categorybox = isset($_POST['category_id'])? $_POST['category']: '';
        while ($row = $result->fetch_assoc()) {
            echo "<option value='" .$row['category_id']."'".($row['category'] == $categorybox?'selected':'') .">".$row['category']."</option>";
    ?>
 </select>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

    // 何に利用するか不明
    $categorybox = array();
    // 1から始めたら0番目の要素が未定義になるのでは
    $i = 1;
    // DBから取得したデータが $result に入っていると仮定
  // 取得したデータのデータの 0番目にポインタを移動する
    mysqli_data_seek($result, 0);
    // $result で取得できたデータ数分 OPTION タグを生成
    while ($row = $result->fetch_assoc()) {
    // ????? 何のために利用するのか不明
  // whileの中で行っているので、1~DBで取得できた要素分同一データが配列に投入される
  // 利用目的、利用箇所がないので無駄な処理
    $categorybox[$i] = htmlspecialchars(trim(urldecode(mb_convert_encoding($value, 'UTF-8', 'auto'))));
    $i++;
    // OPTIONタグを生成
    // OPTIONタグの属性valueに対して、当該ループ時のDBに登録されていたcategoryIDをセット
    // OPTIONタグのテキストノードに、当該ループ時のDBに登録されていたカテゴリをセット
      echo "<OPTION value='". $row['category_id']."' >" . $row['category'] . "</OPTION>\n";
  }  ?>
    // DBから取得したデータが $result に入っていると仮定
  // 取得したデータのデータの 0番目にポインタを移動する
  mysqli_data_seek($result, 0);
    // 当該ページを別ページ(同一ページ含む)から遷移してきた際に、POSTデータとして
    // category_id が存在するかを判定し、存在した場合はPOSTデータのcategoryを
  // 存在しなければ、空文字を $categorybox へ代入
        $categorybox = isset($_POST['category_id'])? $_POST['category']: '';
    // $result で取得できたデータ数分 OPTION タグを生成
        while ($row = $result->fetch_assoc()) {
    // OPTIONタグを生成
    // OPTIONタグの属性valueに対して、当該ループ時のDBに登録されていた$rowのデータcategoryIDをセット
  // もし、$categoryboxのデータと当該ループ時のDB登録されていた$rowのデータcategoryが一致した場合は、当該OPTIONタグを選択状態へ
  // 
    // OPTIONタグのテキストノードに、当該ループ時のDBに登録されていた$rowのデータcategoryをセット
            echo "<option value='" .$row['category_id']."'".($row['category'] == $categorybox?'selected':'') .">".$row['category']."</option>";
    ?>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/31 13:14

    mysqli_data_seek($result, 0);を入れたことで、 $categorybox = array();は何もしてないなぁとは思ってましたが、やっぱりそうだったんですね。どうにかして配列に入れないと、セレクトボックスの表示ができないと思って、配列に入れることばかり考えてたのですがうまくいかなくて。
    一つ一つコメントを入れていただきまして、ありがとうございました。
    手に取るように違いがわかりました。

    キャンセル

  • 2017/05/31 13:24

    matsu1006さんがおっしゃっているように、

    >厳しいことを言うようですが、なぜデータが入ったかなど、関数の意味を含めてきちんと理解されないと成長できないと思いますよ。
    もしかしたらもっと良い書き方があるかもしれないという可能性があるかもしれないのに「動いたからいっか」と可能性を潰してしまっているような気がしてなりません。

    ここが重要です。その場限りか次回につながるか。恐らく勉強のために行っていらっしゃるのでコメント付けだけにしました。しかし、必ずその意味や関数を自力で1つ1つ調べる癖をつけてください。それが未来の自分の力となります。関数の理解もですが、「調べる方法」が身につくので他でも生かせます。

    がんばってください~

    キャンセル

  • 2017/05/31 13:36

    ありがとうございます。本当にmatsuさんのいう通りですね。PHPマニュアルなんて見ても日本語なのに何が書いてあるのかわからなくて、一つ一つ苦労してますが、調べる癖をつけて行こうと思います。
    またお世話になると思いますが、よろしくお願いします。

    キャンセル

+2

「その友人に聞けば早いのでは」と思いますが・・・

ご友人のコードのこの部分ですよね

$categorybox = isset($_POST['category_id'])? $_POST['category']: '';

僕はこの友人ではないしコードを全て提示されているわけではないので、このコードを見た限りでしか答えられませんが、
POSTした結果を同じPHPで受け取るような想定であれば、ありえる書き方と思います。

さて、
1.のコードについてですが$categoryboxに値を設定していてどこにも使ってませんね。
htmlspecialchars()を利用するのは出力する情報に対して行わなければならないので、その1行は意味がありません。どこから持ってきたのか分からない$valueを使ってますし。
他にもurldecode()なども含めて、本当に必要な処理かどうかは検討の必要があります。

あと、
<option value="NULL">Choose One</option>
の部分ですがあくまで「文字列」がなので「NULL」と入れるのはどうかと・・・。
よくある「選択してください」という意味ならvalue=""で十分かと。

最後にmysqli_data_seek($result, 0);を入れたら、DBのデータがセレクトボックスに入ってくれました。

厳しいことを言うようですが、なぜデータが入ったかなど、関数の意味を含めてきちんと理解されないと成長できないと思いますよ。
もしかしたらもっと良い書き方があるかもしれないという可能性があるかもしれないのに「動いたからいっか」と可能性を潰してしまっているような気がしてなりません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/31 14:06

    理解ができなくて、調べても回答が見つからなくて、理解してない状態でここで質問させていただいているので、理解してないと思われて当然だとは思いますが、きっと私の調べ方が悪いのだと思います。今回の1のネットから引っ張ってきたコードについても1日かけてこんな感じです。時間ではないと思いますが、もうラチがあかない!って思うとこちらを利用させて頂いてます。どれが不要なコードなのか気づけない自分が情けないですが、もしよろしければ、調べ方のコツなどを教えていただけると嬉しいです。
    たくさんのコメントをいただき、ありがとうございます。
    NULLの件、その時は配列で利用し、文字列でした。その時と同じような配列にしたく、今回は配列に入れることばかり考えていたのですが、今回は配列ではないので、その辺に違いがあるかもしれません。調べてみます。

    キャンセル

  • 2017/05/31 14:34 編集

    ついアツくなって長文投下してしまう癖をなおしたいです(涙

    > 今回の1のネットから引っ張ってきたコードについても1日かけてこんな感じです
    最初はそんなもんです。何時間も悩んだ結果、実は1文字(とか1単語とか)変更すれば良かっただけとか、ざらにあります。
    特に焦ってる時ほど大事なところが見えなくなって、全く関係ない場所をこねくりまわして時間を浪費したり、今でもないわけではないですね(苦笑

    > どれが不要なコードなのか
    一連の流れの中で使われていないと不要なコード、というのが基本です。kanimaruさんの回答にコメントが書かれていますが、「不明」とか「無駄な処理」とか書かれている部分は今後参考になると思います(僕も回答見ながら同じことを同じ場所で思っていました)
    「不要な処理」「無駄な処理」に気づけるようになるには、色んなコードを書いて、人が書いたコードを見て、経験を積むことでしょう。
    幸い今回のようにPHPを書いて比べっこができるご友人がいるようですし、課題を出し合って書いてみて切磋琢磨していくと良いと思いますよ。そのうち「これは勉強になるな」とか「もっとこう書いたほうがいいな」とか感じることができるようになるはず。
    僕がよくやっていたのは「結果は単純だけど、あえて超複雑に色んなやり方で書いてみる」ってやつですね。例えば「Hello」とだけ画面に出力するとして、何種類も色んなやり方をして書いてみる。PHPの色々な関数を使ってみたり、結構実践的で楽しいですよ。機会があったらやってみてください。
    今回のセレクトボックスを画面出力するプログラムなんて課題にはうってつけだと思いますよ。色んなやり方をやってみて、ご友人と「より複雑に書いたほうが勝ち」とか「より美しく・効率的に書けたほうが勝ち」とか競争してみてはどうでしょうか。

    > もしよろしければ、調べ方のコツなどを教えていただけると嬉しいです
    ある程度基本的な考え方ができないと中々欲しい答えに辿り着けないと思うので、まずは色んな情報を頭に入れておくことですね。物事を分解して考えられるようになると、自然と必要なキーワードが出てきます。検索する際は文章ではなく単語のキーワードを組み合わせてする癖をつけると良いです。
    あとはteratailには膨大な量の質問と回答が日々投稿されていきます。自分が興味を持っている項目のタグを設定していると思いますが、そのタグの質問や回答などを読んでみると良いと思いますよ。それもいつか役に立つときはあるでしょう。
    回答書くかどうかは別として未解決の質問に回答するつもりで調べてみるとかもいい経験になります。

    ああ、また長くなってしまった・・・。

    キャンセル

  • 2017/05/31 22:41

    長文wありがとうございます。とても嬉しいです。最後の質問なんてあまりに抽象的な質問で、答えてもらえるかなとドキドキしてましたが、ひとつひとつわかりやすく初心者の私にもわかるように書いていただいて、ありがとうございます。とても、かなり、参考になります。多分これが全てと言えるほど、基本的なことですよね。だけど難しいんですよね。実は私、大学卒業して間もない頃、汎用系のプログラマーを3年やったことがありますが、この辺のことがさっぱりわからなくて、辞めてしまいました。ですが、プログラミングの楽しさは知っているので、アプリとかを見ると、こういうのを作ってみたいなぁと思うようになり、15年ぶりに勉強を再開しました。最近はいろんな環境が整っていて、わからなくて辛いですが楽しいです。今回は絶対に逃げられないので、matsuさんに頂いたアドバイスを念頭に頑張ります。
    本当にありがとうございますっっ涙

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る