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

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

ただいまの
回答率

88.83%

PHPで<select><option>タグをデータがあるだけ繰り返し表示したい

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,914

narutomo

score 13

前提・実現したいこと

PHPで入力フォームを作っています。
その中で、<select><option>タグを利用してMySQLにあるデータを取り出したい考えています。
ですが、一つ目の<select><option>タグの中ではデータを一覧で表示することはできたのですが、<select>タグをデータがあるだけ繰り返して複数選択でき、繰り返し表示されるような仕組みを作りたいです。

発生している問題・エラーメッセージ

<select>タグはデータの数だけ表示されますが、<option>の中身は、一番上の行は<option>の中だけ置き換え文字でループしているのは確認取れたのですが、下の行にいくに従って中のデータが一つずつ増えていくようになっており、全ての<select>文にデータが全て表示されないです。

該当のソースコード

test.html


<form method="post" action="test2.php">

<tr>
<td>
<select name="name">
<option value="">選択してください</option>
   <#NAMELINE1#>//置き換え文字
</select>
  <#NAMELINE2#>//置き換え文字
<input type="submit" value="送信">
</td>
</tr>
test.php

$link = mysqli_connect(DB_SERVER,DB_ACCOUNT_ID,DB_ACCOUNT_PW,DB_NAME);


$line = "";
$line_more = "";

$query = 'select name from meibo_list';

if($result = mysqli_query($link,$query)){
        $i=0;
        while($row = mysqli_fetch_assoc($result)){
        $name[$i] = $row['name'];


        $line .= "<option value=".$name[$i].">".$name[$i]."</option>";
//一行目のこの文はデータが全て入っていて、プルダウンにて表示されます

        $line_more .= "<select name='name'><option value=''>選択してください</option>".$line."</select>";
//これが二行目以降に繰り返し表示したい項目。

        $i++;

}
mysqli_free_result($result);
}
mysqli_close($link);


$fp = fopen('test.html','r');

while(!feof($fp)){

  $line = fgets($fp);
  $line1 = str_replace('<#NAMELINE1#>',$line,$line1);
  $line2 = str_replace('<#NAMELINE2#>',$line_more,$line2);

  $lines = $line2;
  echo $lines;

}

fclose($fp);
exit();

?>

試したこと

$line[$i]としてみたりしましたが、効果なく全ての<select>タブにデータが反映されていません、表現方法に悩んでおります。

ただ、この方法だとデータが膨大になった時に、入力フォームとして利用する時に見づらくなるとも思い、追加のようなボタンを押すと、<select>文が一つ追加されるようなのも調べていると見受けられました。
ただ、Javascriptがまだ自分では勉強中であるため、PHPやCSSで代用できないか模索しております。

初心者で申し訳ないのですが、どなたかご教授いただけると助かります。

補足情報(言語/FW/ツール等のバージョンなど)

Mac OS

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2017/06/11 05:09

    同じSELECTボックスをたくさん作りたい(数は無限)ということでしょうか?そうするとやはり1つだけSELECTを置き「追加」ボタンを置いてクリック時にJavaScriptでコピーしつつnameだけ変更していく方法しかないと思います。

    キャンセル

  • narutomo

    2017/06/12 00:12

    ご回答ありがとうございます。確かに、想像するとあまり自分がご質問したやり方だと効果的ではないと感じました。Javascriptによる追加ボタンを押して行を追加してといった表現をなんとか試して見ようと思います。

    キャンセル

回答 1

+1

そもそも論としては、存在するデータの中から任意のデータを取得する
ということであれば、セレクトボックスでは無くチェックボックスを使うのが適しています。

チェックボックスであれば、現在のコードの一つ目のセレクトボックスと同じ要領で実装できると思いますが、いかがでしょうか?

どうしてもセレクトボックスが必要
(データの数だけセレクトボックスが必要で、かつ同じデータを最大でデータ数と同じだけ取得したいケース)なのであれば、現状の問題点としては、

一つ目の処理と二つ目以降の処理を分けてしまっていること
です。
やりたいことは「データ数だけ同じセレクトボックスを増やしたい」なので、一つ目と二つ目以降の処理を分けてはいけません。

多分、こんな感じで出来ると思います。
*コードのチェックはしていないので、エラーが出たら直してください。
*コメント部分はご自身で実装してみてください。

置き換え文字を一つにして、

<form method="post" action="test2.php">

<tr>
<td>
<#NAMELINE#>//置き換え文字
<input type="submit" value="送信">
</td>
</tr>

PHPでの処理は一行目とそれ以降を統一して

if($result = mysqli_query($link,$query)){

     
        //optionの中身だけ先に作る   
        while($row = mysqli_fetch_assoc($result)){
           $option_line .= //optionの中身を連結していく
        }


        //データの数だけセレクトボックスを作る
        //データ数を取得する 参考→ http://php.net/manual/ja/mysqli-result.num-rows.php
 
        for(//データの数だけループさせる){
      $line .= "<select name='name'>";
     $line .= $option_line;
         $line .= "</select>";
        }
}

あとは$lineを置き換え文字と置き換えば完成

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/06/12 00:17

    ご回答ありがとうございます。こちらのコードを参考にして試してみました。
    一覧が出てきましたが利用しようとするとおしゃっていただいたチェックボックスの方法か、Javascriptを利用した行を追加するような方法がやりやすいのかと感じました。
    ですが、ご質問させていただいた方法をご教授いただき、ありがとうございました。

    キャンセル

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

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

関連した質問

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