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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

17810閲覧

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

earnest_gay

総合スコア615

PHP

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2016/06/15 13:34

編集2016/06/15 15:24

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

<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の個数ってのはどうやって出したらいいんでしょか?

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

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

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

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

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

guest

回答4

0

こうします。

html

1<form action="" method="post"> 2 <input type="text" name="skill[]"> 3 <input type="text" name="skill[]"> 4 <input type="text" name="skill[]"> 5 <input type="text" name="skill[]"> 6 <input type="text" name="skill[]"> 7</form>

投稿2016/06/15 13:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

earnest_gay

2016/06/15 13:49 編集

ありがとうございます! ちょっと試してみます!
earnest_gay

2016/06/15 14:07

下記で試してみるとArray to string conversionと出ます... 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="submit" name="submit" value="プレビュ"> </form> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー aa.php <?php session_start(); echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; ?>
退会済みユーザー

退会済みユーザー

2016/06/15 14:09

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

2016/06/15 14:36

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

退会済みユーザー

2016/06/15 14:38

配列の意味です。
guest

0

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

投稿2016/06/15 13:38

masaya_ohashi

総合スコア9206

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

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

earnest_gay

2016/06/15 13:51

回答の内容で試してみましたがArray to string conversionと出ます... 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="submit" name="submit" value="プレビュ"> </form> ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー aa.php <?php session_start(); echo $_SESSION['join']['skill'].'<br />'; echo $_SESSION['join']['skill'].'<br />'; echo $_SESSION['join']['skill'].'<br />'; echo $_SESSION['join']['skill'].'<br />'; echo $_SESSION['join']['skill'].'<br />'; ?>
masaya_ohashi

2016/06/15 13:53

echo $_SESSION['join']['skill'].の最後のドットが余計かと思います
earnest_gay

2016/06/15 13:57

.で結合しないと<br />でエラーになるんじゃないでしょうか...? <?php session_start(); echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; echo $_SESSION['join']['skill']; ?> で試してみましたが同じエラーです...
kei344

2016/06/15 14:06

$_SESSION['join']['skill']に入っているのが配列だからではないですか? var_dump( $_SESSION['join']['skill'] ); として中身を確認してみてください。
earnest_gay

2016/06/15 14:10

回答ありがとうございます。 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 Arrayarray(5) { [0]=> string(3) "あ" [1]=> string(3) "い" [2]=> string(3) "う" [3]=> string(3) "え" [4]=> string(3) "お" } 中身は入っていますが echo $_SESSION['join']['skill']; でアクセスっできないのは何故なのでしょうか...?
earnest_gay

2016/06/15 14:30 編集

文字列でもダメみたいなんですが... 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) { }
kei344

2016/06/15 14:37 編集

> 文字列でもダメみたいなんですが... 配列が入っているのにどうやって文字列化したのですか?何かしたとしたらその方法が間違っています。 > print()で出力しようとしてもダメでした... print は文字列を出力する為の物だからです。 【PHP: print - Manual】 http://php.net/manual/ja/function.print.php この辺を全種類読んである程度理解できるまで勉強されたほうが良いと思います。できれば書籍で体系的に勉強されることをお勧めします。 【PHP: 型 - Manual】 http://php.net/manual/ja/language.types.php
guest

0

ベストアンサー

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

php

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

投稿2016/06/15 14:28

編集2016/06/15 14:30
erika.m

総合スコア46

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

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

earnest_gay

2016/06/15 15:01 編集

回答ありがとうございます。 言っている意味はなんとなくですが分かるのですが inputのnameで[]にしてるから $_SESSION['join'] = $_POST;の時点で配列化されている為 $_SESSION['join']['skill'];のようなキーとしてはとしては呼び出せず 添字で呼び出す必要があるから $arr[0]としている ということでしょうか?
earnest_gay

2016/06/15 15:32

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

2016/06/15 15:46

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

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属性に[]を加えるだけで解決した。

投稿2016/06/15 15:54

earnest_gay

総合スコア615

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問