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

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

ただいまの
回答率

88.04%

動的にフォーム追加する場合、name属性の数は未知数なのにどうやって取り出せるのか?

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 11K+

score 403

例えば、会員登録ページを作ってるとします。

<form action="" method="post">
    <input type="text" name="skill1">
    <input type="text" name="skill2">
    <input type="text" name="skill3">
    <input type="text" name="skill4">
    <input type="text" name="skill5">
</form>


と5つのフォームを用意している場合

<?php $_SEESION['join'] = $_POST; ?>

という風にセッションに保存して

<?php echo h($_SESSION['join']['skill1']); ?>
<?php echo h($_SESSION['join']['skill2']); ?>
<?php echo h($_SESSION['join']['skill3']); ?>
<?php echo h($_SESSION['join']['skill4']); ?>
<?php echo h($_SESSION['join']['skill5']); ?>

という風に取り出せるので確認画面ページなどで使ったりできます。

しかし人によっては
スキルが2個だけかもしれないし、
スキルが10個あるかもしれません。

なので、フォームとかは動的に生成したいわけです。

<?php
<style>
[v-cloak] {
    visibility: hidden;
}
</style>
<h1>Sample</h1>
<form id="form" v-cloak action="submit.php" method="post">
    <div>
        言語:
        <div v-for="i in numbers.language">
            <select name="languages[{{i}}][name]">
                <option selected>選択してください▼</option>
                <option value="jp">日本語</option>
                <option value="en">英語</option>
                <option value="fr">フランス語</option>
                <option value="de">ドイツ語</option>
            </select>
            <select name="languages[{{i}}][level]">
                <option selected>選択してください▼</option>
                <option value="3">母語並みに話せる</option>
                <option value="2">ビジネスで困らない程度に話せる</option>
                <option value="1">日常会話で困らない程度に話せる</option>
            </select>
        </div>
        <a @click.prevent="++numbers.language" href="">追加する</a>
    </div>
</form>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.20/vue.min.js"></script>
<script>
'use strict';
new Vue({
    el: '#form',
    data: {
        numbers: {
            language: 1
        }
    }
});
</script>

上記記述はまだ分かってませんが、サンプルです。

知りたいのはここからで、
先ほどは5つのフォームがあることを分かってたから
セッションから取り出すときの記述もどう書けばいいかわかりました。

<?php echo h($_SESSION['join']['skill1']); ?>
<?php echo h($_SESSION['join']['skill2']); ?>
<?php echo h($_SESSION['join']['skill3']); ?>
<?php echo h($_SESSION['join']['skill4']); ?>
<?php echo h($_SESSION['join']['skill5']); ?>

しかし今回は、動的にセレクトボックス追加してるので
nameがどれだけの数でてくるのか未知数なので分かりません。

動的にセレクトボックスを追加する機能を実装したところまではいいです。
問題はそのあとで、
2個かもしれないし、10個あるかもしれない入力内容をどうやって取り出せるのかというところです。

joinにはskill以外にも様々なname属性が2次配列として入ってるわけですが

<?php echo h($_SESSION['join']['skill1']); ?>
['skill1']の部分はどうすればいいのでしょうか?

うまく言えないんですが
”もし、セッションの2次配列のname属性がskillの場合何個あるか数えてある分だけのname属性を2次配列に与える”みたいなif構文を作らないといけないんでしょうか?

【追記】
問題点は、動的に生成されたフォーム値をどうやって全部受け取るか、です。
説明下手なので上手く伝わらないかもしれませんが...

input.php

<form action="" method="post">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
</form>
check.php

<?php
session_start();
$arr = $_SESSION['join']['skill'];
echo $arr[0];
echo $arr[1]; 
echo $arr[2]; 
echo $arr[3]; 
echo $arr[4]; 
?>

この場合入力フォームが5個だからcheck.phpの記述もこれでいいかもしれませんが
input.phpの入力フォームはユーザーによって追加(増やすことが)できるので
入力フォームが10個だったら

check.php

<?php
session_start();
$arr = $_SESSION['join']['skill'];
echo $arr[0];
echo $arr[1]; 
echo $arr[2]; 
echo $arr[3]; 
echo $arr[4]; 
?>


では対応できません。
echo $arr[5];
echo $arr[6]; 
echo $arr[7]; 
echo $arr[8]; 
echo $arr[9];
と 追加で記述しなければ反映されません。

session_start();
$arr = $_SESSION['join']['skill'];
for($i=0,$i =< $arrの個数,$i++){
    echo $arr[$i]
}

みたいな感じにならないと動的とはいえないと思うのですが、
書いているうちに要点が分かってきましたが
$arrの個数ってのはどうやって出したらいいんでしょか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+3

こうします。

<form action="" method="post">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
</form>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/15 23:09

    var_dump($_POST); で値を確認してください。そもそもの基礎ができていませんよ。

    キャンセル

  • 2016/06/15 23:36

    ありがとうございます。
    name属性の[]がなにをしているのか少し解説頂けないでしょうか。

    キャンセル

  • 2016/06/15 23:38

    配列の意味です。

    キャンセル

+2

すべてのinputのnameをskill[]にすればPHP側で$_SESSION['join']['skill']で配列としてアクセスできますよ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/15 23:22

    echoは文字列を出力する為の物だからです。

    【PHP: echo - Manual】
    http://php.net/manual/ja/function.echo.php

    キャンセル

  • 2016/06/15 23:29 編集

    文字列でもダメみたいなんですが...
    print()で出力しようとしてもダメでした...

    Notice: Array to string conversion in C:\xampp\htdocs\xxx\aa.php on line 3
    Array
    Notice: Array to string conversion in C:\xampp\htdocs\xxx\aa.php on line 4
    Array
    Notice: Array to string conversion in C:\xampp\htdocs\xxx\aa.php on line 5
    Array
    Notice: Array to string conversion in C:\xampp\htdocs\xxx\aa.php on line 6
    Array
    Notice: Array to string conversion in C:\xampp\htdocs\xxx\aa.php on line 7
    Array


    array(5) {
    [0]=>
    string(6) "ぜろ"
    [1]=>
    string(6) "いち"
    [2]=>
    string(6) "にー"
    [3]=>
    string(6) "さん"
    [4]=>
    string(6) "よん"
    }



    array(1) {
    ["skill"]=>
    array(5) {
    [0]=>
    string(6) "ぜろ"
    [1]=>
    string(6) "いち"
    [2]=>
    string(6) "にー"
    [3]=>
    string(6) "さん"
    [4]=>
    string(6) "よん"
    }
    }



    array(0) { }

    キャンセル

  • 2016/06/15 23:36 編集

    > 文字列でもダメみたいなんですが...
    配列が入っているのにどうやって文字列化したのですか?何かしたとしたらその方法が間違っています。

    > print()で出力しようとしてもダメでした...
    print は文字列を出力する為の物だからです。

    【PHP: print - Manual】
    http://php.net/manual/ja/function.print.php

    この辺を全種類読んである程度理解できるまで勉強されたほうが良いと思います。できれば書籍で体系的に勉強されることをお勧めします。

    【PHP: 型 - Manual】
    http://php.net/manual/ja/language.types.php

    キャンセル

checkベストアンサー

+1

他の回答にもある通り配列が格納されるからです。

$arr = $_SESSION['join']['skill'];
echo $arr[0]; // スキル1
echo $arr[1]; // スキル2

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/16 00:00 編集

    回答ありがとうございます。

    言っている意味はなんとなくですが分かるのですが
    inputのnameで[]にしてるから
    $_SESSION['join'] = $_POST;の時点で配列化されている為
    $_SESSION['join']['skill'];のようなキーとしてはとしては呼び出せず

    添字で呼び出す必要があるから
    $arr[0]としている

    ということでしょうか?

    キャンセル

  • 2016/06/16 00:32

    一番ヒントになりました!
    ありがとうございます!

    キャンセル

  • 2016/06/16 00:46

    分からなければ$_POSTをvar_dumpで表示してそれぞれの値がどう格納されているのか見てみてください。
    それとPHPでの配列の扱い方を理解するべきかと

    キャンセル

0

【まとめ】
ファイル名:a.php

<?php
session_start();

if(!empty($_POST)){
    $_SESSION['join'] = $_POST;
    header('Location: aa.php');
}
?>

<form action="" method="post">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="skill[]">
    <input type="text" name="a">
    <input type="text" name="i">
    <input type="text" name="u">
    <input type="text" name="e">
    <input type="text" name="o">

    <input type="submit" value="プレビュー">
</form>


ファイル名:aa.php

<?php
session_start();
echo $_SESSION['join']['a'];
echo $_SESSION['join']['i'];
echo $_SESSION['join']['u'];
echo $_SESSION['join']['e'];
echo $_SESSION['join']['o'];
echo '<br />';
echo '<br />';
echo '<br />';
$arr = $_SESSION['join']['skill'];
for($i=0;$i < count($arr);$i++ ) {
echo $arr[$i];
}
echo '<br />';
echo '<br />';
echo '<br />';
echo '<pre>';
var_dump( $_SESSION['join'] );
echo '</pre>';
echo '<br />';
echo '<br />';
echo '<br />';
echo '<pre>';
var_dump( $_SESSION['join']['skill'] );
echo '</pre>';
?>

・<input type="text" name="skill[]">
のように同じname属性で[]を付ければ二次配列の添字として配列に渡される。
echo $arr[0];

$_SESSION['join']['skill'];は配列の中身ではなく配列そのものだから
echoなんてできるわけない。
一旦、変数に代入して添字で呼び出さないといけない。

・[]がないとエラーにはならないが文字化けする。

・<input type="text" name="a">
のようにそのまま二次配列に渡すならキーとして呼び出せる。
echo $_SESSION['join']['a'];

[]は便利だが、慣れないうちは
二次配列とキーが混同してしまいそう。

動的にフォーム生成したname属性に
skill1,skill2,skill3というようなフォーム毎に違うnameにしておかないと
後から呼び出せないかと心配していたが、

[]を使えば、配列として扱えるから同じname属性に[]を加えるだけで解決した。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • トップ
  • PHPに関する質問
  • 動的にフォーム追加する場合、name属性の数は未知数なのにどうやって取り出せるのか?