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

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

ただいまの
回答率

90.32%

  • PHP

    21372questions

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

  • JavaScript

    17569questions

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

  • HTML5

    4311questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

フォームで受け取った値をテキストとして出力したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 218

Azulily

score 9

javascriptでチェックを付けたものを合計を出すシステムを作っています
さらにそこに、チェックを付けたものをテキストで出力したいのですが上手くいきません。
(具体例)国語(74)算数(50)理科(75)
phpでinputタグを生成してjavascritでチェックが入ったものの合計値を出しています。
問題箇所はまたこれとは別にチェックをいれたものを送信して同ページ内でテキスト化するときに
Notice: Undefined index: 理科 in.....
と表示されます。
その際にこちらの記事を参考にしました。

また、調べたりないのかもしれないですが
フォームの書き方を調べてみてもhtmlで書かれており、ネーム属性が同じものしか見当たらず
あまり参考になりませんでした。

<!DOCTYPE html>
<html>
  <head>
    <title>てすと</title>
      <script language="JavaScript">
function total() {
yen = 0;
for (i=0; i< document.A_Form.length-1; i++) {
if (document.A_Form.elements[i].checked) {
yen += eval(document.A_Form.elements[i].value);
}
}
document.A_Form._total.value = yen;
}
</script>
   <div id="tab1" class="tab"> 
<form name="A_Form" action="index.php" method="get">
    <br><br>

    <?php

    $array = array(
        "体育"  => 75,
        "社会" => 58,
        "国語" => 74,
        "算数" => 50,
        "理科" => 75,


    );
    foreach($array as $key => $value){
        echo '<input type="checkbox" name="'.$key.'" value="'.$value.'" onclick="total()">'.$key.'(<font color="#000055"><b>'.$value.'</b></font>)';
        echo '<br>';
    }

    ?>
    合計点数:<input type="text" name="_total" size="5"> <input type="reset" value="やり直し">
<input type="submit" value="送信">
</form>
<?php
$subject = $_GET["$key"]
?>
   </div>

  </body>
</html>


phpのバージョンは7.2.1です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Azulily

    2018/05/05 02:56

    このような感じでよろしいのでしょうか。また不備があればお願い致します。

    キャンセル

  • mts10806

    2018/05/05 07:30

    回答は書いたんですが、質問内容に応えていない部分がありましたので、後ほど追記します。現時点の回答で参考になる部分はあると思うのでひとまずお目通しください。

    キャンセル

  • mts10806

    2018/05/05 08:09

    回答に追記しました。前提部分はしっかりと読んで理解しておいてください。

    キャンセル

回答 2

checkベストアンサー

+3

前提があります。
javascriptで全部やりきるか、phpで全部やりきるかを決めてください。

今現在やろうとしていることは「javascriptで合計値を出して、phpで選択した教科と点数を表示する」とお見受けしましたが、併用はできません。

回答後半でも書いていますが、phpはサーバー側の言語、javascriptはクライアント側の言語だからです。
javascriptで合計を出した後に、送信ボタンで送信するとphp側で受け取るのはチェックボックスなどの情報ですが、サーバー側にリクエストを送信することとなるので、javascriptで出した合計値は画面表示時の状態に戻ります。

つまり、
点数合計計算をjavascriptで対応するのでしたら、選択教科と点数の表示までjavascriptで対応する必要がありますし、
選択教科と点数の表示をphpで対応するのでしたら、点数合計計算もphpで対応する必要があります。

という前提で、phpでやりきる場合の回答です。

エラーの理由。

$subject = $_GET["$key"]

おそらくこれは「画面アクセス時」またはチェックボックスで「理科」を選択していないとき
に出るのではと思います。

$_GETはクエリストリングという、URLにて渡されたパラメータを受け取るときに使います。

フォームの受け取り方は下記の記事が参考になると思います。

で、エラーが出るのは$keyという変数はforeachで使われているのですが、foreachを抜けた時点で持っているのは一番最後の情報のみです。
つまり、現在の指定

    $array = array(
        "体育"  => 75,
        "社会" => 58,
        "国語" => 74,
        "算数" => 50,
        "理科" => 75,


    );


↑で最後は「理科」ですね。

phpでやりきりたい場合は、下記のように組みます。

.score{
 color:#000055;
 font-weight:bold;
}
<?php
$total = 0;

$array = array(
    "体育"  => 75,
    "社会" => 58,
    "国語" => 74,
    "算数" => 50,
    "理科" => 75,
);

foreach($array as $key => $value){
    $checked = "";
    if(array_key_exists($key,$_GET)){
        $total += $_GET[$key]; //チェックされた教科の点数を加算
        $checked = " checked"; //チェックされた教科を初期チェック状態に
    }
    echo '<input type="checkbox" name="'.$key.'" value="'.$value.'"'.$checked.'>'.$key.'(<span class="score">'.$value.'</span>)';
    echo '<br>';
}
?>
合計点数:<input type="text" name="_total" size="5" value="<?=$total ?>"> <input type="reset" value="やり直し">
<input type="submit" value="送信">

fontタグ自体、html5で廃止された要素なので、変更しています。

te2jiさんが仰っているように今回の場合、form生成を簡略化したいためにphpを利用しているような形となっていますが、この要件だけだとjavascriptだけで完結できます。
(おそらく自身のjavascriptの記述もそうしているはず)
私の回答はあえてそこをphpだけでやりきった形となります。

チェックを付けたものをテキストで出力したい

チェックを送信したものを初期値checkedにしておけば不要かなと思い、コードを作ってみました。
それでも「別途テキスト表示したい」というのであれば、
foreachの中でチェックした情報を初期値としている箇所で下記のように拾うように組めばよいです。

<?php
$total = 0;
$check_subject = "";

$array = array(
    "体育"  => 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 '<input type="checkbox" name="'.$key.'" value="'.$value.'"'.$checked.'>'.$key.'(<span class="score">'.$value.'</span>)';
    echo '<br>';
}
?>
合計点数:<input type="text" name="_total" size="5" value="<?=$total ?>"> <input type="reset" value="やり直し">
<input type="submit" value="送信">
<?=$check_subject ?>

 補足

ただ、チェックボックスというのは、おおよその場合、「同列の情報の中で複数選択するとき」に利用するものと思われます。
通常は「配列」の形で送信するように仕込みます。
そうすると「同列の項目の中でチェックしたものだけ送信される」ようにします。

なので、今回はチェックボックスでフォームを作るのではなく、
テキストボックスで点数を入力してそれぞれのnameに教科名を入れて送信する方が
汎用的で適切な使い方になるのでは?と思います。

蛇足:
下記気になったので。

phpで生成したフォームを使ってjavascriptによる処理が上手くいったのでそこまで考えていませんでした。

phpで生成したフォーム はその時点でhtmlとして扱われるのでjavascript側は何で作ったとか関係なくあくまで今でているhtmlからのイベントを受け取って処理を行います。
あくまでphpはhtmlから送信された情報やDBの情報を処理するもので、画面出力についてはあくまで補足機能でしかない と思っておいて良いかと。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/06 19:46

    無事できました。
    詳しく、細かいところまで教えて頂きありがとうございました。

    キャンセル

  • 2018/05/06 20:01

    自由入力で数値を決めたい時もあったので確かに汎用的ですよね
    テキストボックスにしてみたところ、チェックボックスでいうと全てにチェックをいれた状態になってしまいました。そこで、チェックを付けたものにだけ値の入力ができる仕様を考えているのですがダメでしょうか?

    キャンセル

  • 2018/05/06 20:40

    > チェックボックスでいうと全てにチェックをいれた状態になってしまいました。

    プログラムは組んだようにしか動かないので「そのように組んでしまった」というのが現実ですね。

    > チェックを付けたものにだけ値の入力ができる仕様を考えているのですがダメでしょうか?

    より複雑になった気がしないでもないですが、まずはやってみてください。
    既に当質問は解決済みになっているので、やってみた結果を以てつまずいたところを質問あげれば良いと思います。

    キャンセル

+2

php はサーバで動作し、質問に記載のある JavaScript はクライアント(ブラウザ)で動作することが期待されますが、理解していますか?
多分、根本的な動作を勘違いしているように思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/30 22:11

    なるほど、phpで生成したフォームを使ってjavascriptによる処理が上手くいったのでそこまで考えていませんでした。
    phpはxamppを使ってローカル環境を構築しています。
    ではどのようにすればよいでしょうか、お教えねがいますか?

    キャンセル

  • 2018/04/30 22:14

    何がやりたいのかちょっと理解できませんが、多分 JavaScript で全部処理できるんじゃないかと思います。

    キャンセル

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

  • PHP

    21372questions

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

  • JavaScript

    17569questions

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

  • HTML5

    4311questions

    HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。