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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

2298閲覧

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

YukaSaku

総合スコア52

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/05/31 03:39

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

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

php

1---1--- 2<select name="category"> 3 <option value="NULL">Choose One</option> 4 <?php 5 //select box 6 $categorybox = array(); 7 $i = 1; 8 mysqli_data_seek($result, 0); 9 while ($row = $result->fetch_assoc()) { 10 // 一応データをパースする 11 $categorybox[$i] = htmlspecialchars(trim(urldecode(mb_convert_encoding($value, 'UTF-8', 'auto')))); 12 $i++; 13 echo "<OPTION value='". $row['category_id']."' >" . $row['category'] . "</OPTION>\n"; 14 } ?> 15 </select>

php

1---2--- 2 <select name="category"> 3 <option value="NULL">Choose One</option> 4 <?php 5 mysqli_data_seek($result, 0); 6 $categorybox = isset($_POST['category_id'])? $_POST['category']: ''; 7 while ($row = $result->fetch_assoc()) { 8 echo "<option value='" .$row['category_id']."'".($row['category'] == $categorybox?'selected':'') .">".$row['category']."</option>"; 9 ?> 10 </select>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

php

1 // 何に利用するか不明 2 $categorybox = array(); 3 // 1から始めたら0番目の要素が未定義になるのでは 4 $i = 1; 5 // DBから取得したデータが $result に入っていると仮定 6 // 取得したデータのデータの 0番目にポインタを移動する 7 mysqli_data_seek($result, 0); 8 // $result で取得できたデータ数分 OPTION タグを生成 9 while ($row = $result->fetch_assoc()) { 10 // ????? 何のために利用するのか不明 11 // whileの中で行っているので、1~DBで取得できた要素分同一データが配列に投入される 12 // 利用目的、利用箇所がないので無駄な処理 13 $categorybox[$i] = htmlspecialchars(trim(urldecode(mb_convert_encoding($value, 'UTF-8', 'auto')))); 14 $i++; 15 // OPTIONタグを生成 16 // OPTIONタグの属性valueに対して、当該ループ時のDBに登録されていたcategoryIDをセット 17 // OPTIONタグのテキストノードに、当該ループ時のDBに登録されていたカテゴリをセット 18 echo "<OPTION value='". $row['category_id']."' >" . $row['category'] . "</OPTION>\n"; 19 } ?>

php

1 // DBから取得したデータが $result に入っていると仮定 2 // 取得したデータのデータの 0番目にポインタを移動する 3 mysqli_data_seek($result, 0); 4 // 当該ページを別ページ(同一ページ含む)から遷移してきた際に、POSTデータとして 5 // category_id が存在するかを判定し、存在した場合はPOSTデータのcategoryを 6  // 存在しなければ、空文字を $categorybox へ代入 7 $categorybox = isset($_POST['category_id'])? $_POST['category']: ''; 8 // $result で取得できたデータ数分 OPTION タグを生成 9 while ($row = $result->fetch_assoc()) { 10 // OPTIONタグを生成 11 // OPTIONタグの属性valueに対して、当該ループ時のDBに登録されていた$rowのデータcategoryIDをセット 12  // もし、$categoryboxのデータと当該ループ時のDB登録されていた$rowのデータcategoryが一致した場合は、当該OPTIONタグを選択状態へ 13  // 14 // OPTIONタグのテキストノードに、当該ループ時のDBに登録されていた$rowのデータcategoryをセット 15 echo "<option value='" .$row['category_id']."'".($row['category'] == $categorybox?'selected':'') .">".$row['category']."</option>"; 16 ?>

投稿2017/05/31 03:59

編集2017/05/31 04:02
kanimaru

総合スコア1013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YukaSaku

2017/05/31 04:14

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

2017/05/31 04:24

matsu1006さんがおっしゃっているように、 >厳しいことを言うようですが、なぜデータが入ったかなど、関数の意味を含めてきちんと理解されないと成長できないと思いますよ。 もしかしたらもっと良い書き方があるかもしれないという可能性があるかもしれないのに「動いたからいっか」と可能性を潰してしまっているような気がしてなりません。 ここが重要です。その場限りか次回につながるか。恐らく勉強のために行っていらっしゃるのでコメント付けだけにしました。しかし、必ずその意味や関数を自力で1つ1つ調べる癖をつけてください。それが未来の自分の力となります。関数の理解もですが、「調べる方法」が身につくので他でも生かせます。 がんばってください~
YukaSaku

2017/05/31 04:36

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

0

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

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

$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 04:09

m.ts10806

総合スコア80765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YukaSaku

2017/05/31 04:29

早速コメントありがとうございます。そして、すみません、最初にコメントいただいた方にベストアンサーをつけさせていただきました。 その友人は今寝ている時間なので、こちらで質問させていただきました。 確かにmatsuさんのいう通りかもしれないです。動いたからいっかというか、動いたから、これも正解のひとつかな。と思ったりしています。他にもっと良い書き方はあるとは思うけど、とりあえずデータが入ってエラーが出てないから大丈夫かなと。 以前optionでvalue=""にしたら、Choose Oneの上にブランクが来てNullを入れたら、トップにChoose Oneがきちんと表示されたことがあったのでNullを入れるものだと思っていました。 もっとデータの流れを見つめ直そうと思います。心のこもった意見をありがとうございます。
m.ts10806

2017/05/31 04:45

terateilでも「コピペです」「参考書からもってきました」という質問が散見されますが、回答者側の人たちには「こいつ絶対理解してないわ」と見られてる思ってください。もちろん質問者の理解レベル等を考えながら丁寧な回答を心がけるのは当然ですが、 回答者自身も同じ苦労をしているから回答ができる=余程テクニカルなことでない限り調べたら出てくる です。(回答者も回答の際に調べて回答しているケースも必ずあります) 確かに動くことは正解の1つという考え方は間違ってはいないですが、「不要なコードが入っている」「わからないけど動作に影響がないから置いておく」状態が入り混じったコードは、品質としては非常に低いものとなります。 プログラムはその場限りではなく恒久的なものです。あとでメンテナンスしようと思ったときのことを考えてコードを組んでいくと良いと思います。 > 以前optionでvalue=""にしたら、Choose Oneの上にブランクが来てNullを入れたら、トップにChoose Oneがきちんと表示されたことがあったのでNullを入れるものだと思っていました。 単なる文字列の"NULL"とプログラムで利用されるNULLは持つ意味が全く違います。なぜNULLを入れたらそう表示されたのか、調べて見ると良いですね。
YukaSaku

2017/05/31 05:06

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

2017/05/31 05:34 編集

ついアツくなって長文投下してしまう癖をなおしたいです(涙 > 今回の1のネットから引っ張ってきたコードについても1日かけてこんな感じです 最初はそんなもんです。何時間も悩んだ結果、実は1文字(とか1単語とか)変更すれば良かっただけとか、ざらにあります。 特に焦ってる時ほど大事なところが見えなくなって、全く関係ない場所をこねくりまわして時間を浪費したり、今でもないわけではないですね(苦笑 > どれが不要なコードなのか 一連の流れの中で使われていないと不要なコード、というのが基本です。kanimaruさんの回答にコメントが書かれていますが、「不明」とか「無駄な処理」とか書かれている部分は今後参考になると思います(僕も回答見ながら同じことを同じ場所で思っていました) 「不要な処理」「無駄な処理」に気づけるようになるには、色んなコードを書いて、人が書いたコードを見て、経験を積むことでしょう。 幸い今回のようにPHPを書いて比べっこができるご友人がいるようですし、課題を出し合って書いてみて切磋琢磨していくと良いと思いますよ。そのうち「これは勉強になるな」とか「もっとこう書いたほうがいいな」とか感じることができるようになるはず。 僕がよくやっていたのは「結果は単純だけど、あえて超複雑に色んなやり方で書いてみる」ってやつですね。例えば「Hello」とだけ画面に出力するとして、何種類も色んなやり方をして書いてみる。PHPの色々な関数を使ってみたり、結構実践的で楽しいですよ。機会があったらやってみてください。 今回のセレクトボックスを画面出力するプログラムなんて課題にはうってつけだと思いますよ。色んなやり方をやってみて、ご友人と「より複雑に書いたほうが勝ち」とか「より美しく・効率的に書けたほうが勝ち」とか競争してみてはどうでしょうか。 > もしよろしければ、調べ方のコツなどを教えていただけると嬉しいです ある程度基本的な考え方ができないと中々欲しい答えに辿り着けないと思うので、まずは色んな情報を頭に入れておくことですね。物事を分解して考えられるようになると、自然と必要なキーワードが出てきます。検索する際は文章ではなく単語のキーワードを組み合わせてする癖をつけると良いです。 あとはteratailには膨大な量の質問と回答が日々投稿されていきます。自分が興味を持っている項目のタグを設定していると思いますが、そのタグの質問や回答などを読んでみると良いと思いますよ。それもいつか役に立つときはあるでしょう。 回答書くかどうかは別として未解決の質問に回答するつもりで調べてみるとかもいい経験になります。 ああ、また長くなってしまった・・・。
YukaSaku

2017/05/31 13:41

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問