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

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

ただいまの
回答率

87.60%

jqueryからのpost形式での送信

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 701

score 33

計算機的なものを作っておりますが、jquery側で定義した変数$selectedを<?php /略/ ?>で計算処理させたいのですがうまく行きません。何かいい方法はありますでしょうか?

<?php

require_once(__DIR__ . '/functions.php');

$text1 ='';
$text2='';

if ($_SERVER['REQUEST_METHOD'] === 'POST'){
  $text1 = $_POST['text1'];
  $text2 = $_POST['text2'];
}
switch ($selected){
  case "plus";
    $result = $text1 + $text2;
    break;
  case "mainasu";
    $result = $text1 - $text2;
    break;
  case "kakeru";
    $result = $text1 * $text2;
    break;
  case "waru";
    $result = $text1 / $text2;
    break;
}
 ?>

<!DOCTYPE html>
<html lang = "ja">
<head>
  <meta charset = "utf-8">
  <title>calculator</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
<div id ="container">
  <h1>計算</h1>
  <form action="" method="POST">
    <div id="container-1">
      <input type="text" id="text1" name="text1" placeholder="text1" value="<?= h($text1); ?>"  onKeyup="this.value=this.value.replace(/[^0-9]+/,'')">
      <ul>
        <li data-id="plus" class="btn">+</li>
        <li data-id="mainasu" class="btn"></li>
        <li data-id="kakeru" class="btn">×</li>
        <li data-id="waru" class="btn">÷</li>
        <input type="hidden" id="answer" name="answer" value="">
      </ul>
      <input type="text"  id="text2" name="text2" placeholder="text2" value="<?= h($text2); ?>" onKeyup="this.value=this.value.replace(/[^0-9]+/,'')">
    </div>
  <div id="result">result</div>
  <div id="cal_result"><?= h($result); ?></div>
</form>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(function(){
  'use strict';
  var $selected;
  $('.btn').on('click', function(){
    $('.btn').removeClass('selected');
    $(this).addClass('selected');

    $selected = $('#answer').val($(this).data('id'));
    console.log($selected);

    });
  $('#result').on('click', function(){
    if ($('#text1').val() === '' || $('#text2').val() === ''){
      alert('Choose One!');
    } else {
      $('form').submit();
    }
  });
});
</script>
</body>
</html>
body {
  font-size: 16px;
  font-family: Arial, sans-serif;
}

#container {
  text-align: center;
  width: 500px;
  margin: 15px auto;
}
h1{
  font-size: 20px;
  line-height:50px;
  padding: 10px;
}
h1 ,ul > li {
  border: 1px solid #ddd;
  border-radius: 5px;
}
#container-1{
  display: flex;
}
ul{
margin:auto;
  list-style: none;
  padding: 0;
}
li{
  width:20px;
  margin: auto;
  cursor: pointer;
}
#text1{
  height: 10px;
  margin-top: 25px;
}
#text2{
  height: 10px;
  margin-top: 25px;
}
#result{
  margin-top: 0px;
  float:right;
  cursor: pointer;
  box-shadow: 0 4px 0 #0088cc;
  border-radius: 5px;
  background: #00aaff;
  width: 100px;
  color: #fff;
}
#cal_result{
    float:right;
    margin-top: 30px;
}
.btn{
    opacity: 0.5;
    font-weight: bold;
}
.btn + .btn{
  margin-top: 5px;
}
.selected{
  opacity: 1.0;
}
<?php

function h($s){
  return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

jQuery、というかJavaScriptの変数の頭に$をつけたからって、あくまで変数に使える文字列のひとつでしかないので、phpの変数と全く意味が異なります。

サーバーサイドであるphpにとってはクライアントサイドで起きている出来事は何も知らないのでクライアントサイドから送信されていなければ(今回はPOSTですかね)、未定義のものに他なりません。

「うまくいきません」は今後はなるべく控えられた方が良い表現ですね。他人には何も伝わらない表現です。あなたが何を目的に何を作ろうとしていて何が起きているか誰も知らないわけですから。

phpのエラーが表示されていませんか?
されていないのでしたら、必ずエラー設定をonにしておいてください。
つまり「うまくいかない」のではなく、「○○しようとして××してみたが△△という現象が起きる」という部分で、必ずエラーが出ているはずです(変数未定義なのでNoticeかな)

ではどうするか。
サーバーサイドであるphpに情報を届けるのであれば、form送信すれば良いです。
$('#answer').val($(this).data('id'))ということはhidden#answerに値を設定してるはずなので、$_POSTでそのhiddenのname属性で受けとればいいですね。受け取った値をswitchに設置します。


蛇足。
今のところ初期時点では$selectedは未定義なので問題が起きてないように見えますが、POSTの時しか計算させないはずなので、switchもREQUEST_METHODの中に入れた方が良いです。
$resultも初期値必要ですね。

switchに設置する値もform送信するので、caseで判定しようとしている値以外が送られる可能性もあります。
現に、選択せずに送信できませんか?そうでなくてもブラウザデベロッパーツールを使えば値を改竄して送信できます。
switchにdefault:を設置して想定以外の場合の処理を追加してください。

今回は四則演算を行わせるようですが、必ず数値が送られるとは限りません。
JavaScriptだけの空のチェックではなく、必ずサーバーサイドであるphpで数値かどうかまでチェックするようにしてください。
placeholderがtext1とかだと更に数値が送られる保証は下がりますしね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/10 13:43

    御回答有難うございます。ご指摘頂いた点も今後は気をつけます。
    php側で変数の初期値設定と $selected = $_POST['answer'];としたところ、うまくいきました。
    またswitchもREQUEST_METHODの中に入れました。

    switchにdefault:を設置して想定以外の場合の処理を追加してください。
    この点ですが、サーバー側ではなく、javascriptで制御したいと考えております。
    今後、検討します。


    今回は四則演算を行わせるようですが、必ず数値が送られるとは限りません。
    JavaScriptだけの空のチェックではなく、必ずサーバーサイドであるphpで数値かどうかまでチェックするようにしてください。
    この点に関してはonKeyup="this.value=this.value.replace(/[^0-9]+/,'' で制御しております。

    キャンセル

  • 2019/03/10 14:01

    サーバーサイドでのチェックはセキュリティ上、省略はできませんよ。
    回html、css、JavaScriptの記述は回答にも書きましたが、ブラウザデベロッパーツールで書き換えが可能です。

    キャンセル

  • 2019/03/10 21:58

    そうですか。では、JSでなくサーバー側で制御するコードを考えたいと思います。
    デベロッパーツールはデザインの参考になるのでよく使うのですが、コードを書き換えることができるとは知りませんでした。

    キャンセル

  • 2019/03/10 22:15

    もちろん本来の使い方はコードを画面上で疑似的に調整して確認したうえで実際のコードに反映させるというものですが、悪用も可能という意味です。
    システム側(今回はPHPですかね)はどんな値が送信されるかは知らないという大前提があります。
    HTMLから送信されているということすら知らないので、サーバー側での対応は必須ということになります。

    キャンセル

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

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

関連した質問

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