質問: javascriptでチェックを付けたものを合計を出すシステムを作っています さらにそこに、チェックを付けたものをテキストで出力したいのですが上手くいきません。 (具体例)国語(74)算数(50)理科(75) phpでinputタグを生成してjavascritでチェックが入ったものの合計値を出しています。 問題箇所はまたこれとは別にチェックをいれたものを送信して同ページ内でテキスト化するときに Notice: Undefined index: 理科 in..... と表示されます。 その際にこちらの記事を参考にしました。 また、調べたりないのかもしれないですが フォームの書き方を調べてみてもhtmlで書かれており、ネーム属性が同じものしか見当たらず あまり参考になりませんでした。 ``` てすと ``` ``` 75, "社会" => 58, "国語" => 74, "算数" => 50, "理科" => 75, ); foreach($array as $key => $value){ echo ''.$key.'('.$value.')'; echo ''; } ?> 合計点数: ``` phpのバージョンは7.2.1です。
回答: 前提があります。 **javascriptで全部やりきるか、phpで全部やりきるかを決めてください。** 今現在やろうとしていることは「javascriptで合計値を出して、phpで選択した教科と点数を表示する」とお見受けしましたが、**併用はできません。** 回答後半でも書いていますが、phpはサーバー側の言語、javascriptはクライアント側の言語だからです。 javascriptで合計を出した後に、送信ボタンで送信するとphp側で受け取るのはチェックボックスなどの情報ですが、サーバー側にリクエストを送信することとなるので、javascriptで出した合計値は画面表示時の状態に戻ります。 つまり、 点数合計計算をjavascriptで対応するのでしたら、選択教科と点数の表示までjavascriptで対応する必要がありますし、 選択教科と点数の表示をphpで対応するのでしたら、点数合計計算もphpで対応する必要があります。 という前提で、phpでやりきる場合の回答です。 エラーの理由。 ``` $subject = $_GET["$key"] ``` おそらくこれは**「画面アクセス時」またはチェックボックスで「理科」を選択していないとき** に出るのではと思います。 $_GETはクエリストリングという、URLにて渡されたパラメータを受け取るときに使います。 フォームの受け取り方は下記の記事が参考になると思います。 * PHPでフォームからデータを受け取る方法(GETとPOST) で、エラーが出るのは$keyという変数はforeachで使われているのですが、foreachを抜けた時点で持っているのは一番最後の情報のみです。 つまり、現在の指定 ``` $array = array( "体育" => 75, "社会" => 58, "国語" => 74, "算数" => 50, "理科" => 75, ); ``` ↑で最後は「理科」ですね。 phpでやりきりたい場合は、下記のように組みます。 ``` .score{ color:#000055; font-weight:bold; } ``` ``` 75, "社会" => 58, "国語" => 74, "算数" => 50, "理科" => 75, ); foreach($array as $key => $value){ $checked = ""; if(array_key_exists($key,$_GET)){ $total += $_GET[$key]; //チェックされた教科の点数を加算 $checked = " checked"; //チェックされた教科を初期チェック状態に } echo ''.$key.'('.$value.')'; echo ''; } ?> 合計点数: ``` ※fontタグ自体、html5で廃止された要素なので、変更しています。 te2jiさんが仰っているように今回の場合、form生成を簡略化したいためにphpを利用しているような形となっていますが、この要件だけだとjavascriptだけで完結できます。 (おそらく自身のjavascriptの記述もそうしているはず) 私の回答はあえてそこをphpだけでやりきった形となります。 > > チェックを付けたものをテキストで出力したい > > > チェックを送信したものを初期値checkedにしておけば不要かなと思い、コードを作ってみました。 それでも「別途テキスト表示したい」というのであれば、 foreachの中でチェックした情報を初期値としている箇所で下記のように拾うように組めばよいです。 ``` 75, "社会" => 58, "国語" => 74, "算数" => 50, "理科" => 75, ); foreach($array as $key => $value){ $checked = ""; if(array_key_exists($key,$_GET)){ $check_subject .= "{$key}({$_GET[$key]})"; //チェックされた教科と点数の画面出力用情報を保持 $total += $_GET[$key]; //チェックされた教科の点数を加算 $checked = " checked"; //チェックされた教科を初期チェック状態に } echo ''.$key.'('.$value.')'; echo ''; } ?> 合計点数: =$check_subject ?> ``` 補足 === ただ、チェックボックスというのは、おおよその場合、「同列の情報の中で複数選択するとき」に利用するものと思われます。 通常は「配列」の形で送信するように仕込みます。 そうすると「同列の項目の中でチェックしたものだけ送信される」ようにします。 * 【PHP】チェックボックスの値を受け取る なので、今回はチェックボックスでフォームを作るのではなく、 テキストボックスで点数を入力してそれぞれのnameに教科名を入れて送信する方が 汎用的で適切な使い方になるのでは?と思います。 蛇足: 下記気になったので。 > > phpで生成したフォームを使ってjavascriptによる処理が上手くいったのでそこまで考えていませんでした。 > > > phpで生成したフォーム はその時点でhtmlとして扱われるのでjavascript側は何で作ったとか関係なくあくまで今でているhtmlからのイベントを受け取って処理を行います。 あくまでphpはhtmlから送信された情報やDBの情報を処理するもので、画面出力についてはあくまで補足機能でしかない と思っておいて良いかと。