簡単なPHPの計算構文(初学者)

このQ&Aのポイント
  • フォームから数字入力、演算子を選択して計算をする構文に関する質問です。
  • if条件分岐をシンプルにする方法について質問しています。
  • $keisanに演算子が入らない問題について質問しています。
回答を見る
  • ベストアンサー

簡単なPHPの計算構文(初学者)

以下はフォームから数字入力、演算子を選択して計算をする構文になります。 ------------------------------------------ <form action="" method="post"> <input type="text" name="saki"> <select name="select"> <option value="+">+ <option value="-">- <option value="*">X <option value="/">÷ <input type="text" name="ato"> <input type="submit" value="計算"> </form> <?php $saki = htmlspecialchars(@$_POST["saki"], ENT_QUOTES); $ato = htmlspecialchars(@$_POST["ato"], ENT_QUOTES); $keisan = @$_POST["select"]; if($keisan == "+"){ //←この部分から入れ替える $ans = $saki + $ato; echo "$saki + $ato = $ans"; }elseif($keisan == "-"){ $ans = $saki - $ato; echo "$saki - $ato = $ans"; }elseif($keisan == "*"){ $ans = $saki * $ato; echo "$saki x $ato = $ans"; }elseif($keisan == "/"){ $ans = $saki / $ato; echo "$saki ÷ $ato = $ans"; }else{ } ?> ---------------------------------------------------- この部分のif条件分岐を以下のシンプルな構文に変えたら 同じ結果が得られると思ったのですが上手くいきません。 ---------------------------------------------------- $kotae = "$saki $keisan $ato"; // ←※$keisanにはselectから選択された演算子が入っても計算されない? echo "$saki.$keisan.$ato ="; echo "$kotae"; ---------------------------------------------------- フォームで「+」を選択すれば「$keisan」に演算子「+」がそのまま入るので 自動的に「$saki+$ato」というような計算式になり「$kotae」に 計算結果が出ると思ったのですが 「$kotae = "$saki $keisan $ato"」は構文的に間違っているのでしょうか? ifを使わないシンプルな方法はないのでしょうか? よろしくお願いいたいます。

  • PHP
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • JaneDue
  • ベストアンサー率75% (263/350)
回答No.4

発想はとても良いと思います。期待通りに動作しない理由は $a = 2 + 3;  // 計算結果の 5 が代入される $a = "2 + 3"; // 2 + 3 という「文章」が代入される もうお分かりかと思いますが、 $kotae = "$saki $keisan $ato"; としても、構文としては間違いではありませんが、数字や演算子をくっつけただけの「文字列」ですから、そのままでは計算してはくれません。 単なる文字列を「文字列ではなくコードとみなして実行させる」のが 既出のeval()なので $kotae = eval("return $saki $keisan $ato;"); とすれば期待通りに動作するはずです。あるいは直接出力してしまうなら eval("echo $saki $keisan $ato;"); とか。 ※皆さんお書きの通り evalは大変危険です。 数字を入れろと言っているのに、それ以外を記入してくる けしからん人たちが沢山います。 ( phpinfo();とか `ls`; とか記入してみると・・・) evalはどんなPHP関数やコマンドも実行できてしまうので、私のサーバを自由に使ってね、と言っているようなもの。想定した数字や演算子以外が紛れ込んでいないか必ず検証してください。 ただ、初学とのことですから、ローカルで学習中に限り、あまり神経質にならずに自分の書いたプログラムが思い通りに動く楽しさを味わうのもよいとは思います。 もし公開する場合は、evalの使用は避けて下さい。

okdayook
質問者

お礼

式としてではなく文字列として扱われるんですね。 また一つ勉強になりました。 ありがとうございました!!

その他の回答 (3)

noname#244856
noname#244856
回答No.3

一応外部サイトにも置いておきます。 【ソースコード】  http://pastebin.com/rqyTUa0e 【動作確認】 http://codepad.viper-7.com/zNrk4I/55dev

okdayook
質問者

お礼

ご返答ありがとうございます。 単純に「$kotae = "$saki $keisan $ato"; 」のように 変数にはいっている演算子を使って計算できるかという質問の つもりでしたが、 アドバイスしていただいた構文はまだとても 解読できるようなレベルではありません。 教えていただいた構文であればサンプルのほうが初心者にとっては 分かりやすいことは間違いありません。 evalも調べてみたのですが 現段階では全く理解できないので いつかまた必要になった時にでも勉強しようと思います。

noname#244856
noname#244856
回答No.2

検証してからevalを使ってもいいですが、PHPの基本演算だと -2147483648 ~ +2147483647 の範囲の整数しか扱えないので、どうせなら任意の自然数に対応させようってことで今回はBC関数を利用して実装してみました。OKWaveの表示で崩れないように全角スペースでインデントしているので適宜タブや半角スペースに直してください。 <?php function h($str) {   return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } $operators = array(   'bcadd' => '+',   'bcsub' => '-',   'bcmul' => '×',   'bcdiv' => '÷', ); foreach (array('left', 'right', 'operator') as $name) {   $$name = isset($_POST[$name]) && is_string($_POST[$name]) ? $_POST[$name] : ''; } if (isset($_POST['calc'])) {   if (!ctype_digit($left)) {     $msgs[] = '左オペランドを正しく入力してください';   }   if (!ctype_digit($right)) {     $msgs[] = '右オペランドを正しく入力してください';   }   if (!$function = array_search($operator, $operators, true)) {     $msgs[] = '演算子を正しく選択してください';   }   if ($operator === '÷' and !(int)$right) {     $msgs[] = 'ゼロ除算は出来ません';   }   if (empty($msgs)) {     $result = rtrim(rtrim($function($left, $right, 10), '0'), '.');     $msgs[] = "{$left}{$operator}{$right}の計算結果は{$result}です";   } } if (empty($function)) {   $function = 'bcadd'; } header('Content-Type: application/xhtml+xml; charset=utf-8'); ?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head>  <title>10進自然数の四則演算</title> </head> <body>  <h1>10進自然数の四則演算</h1> <?php if (!empty($msgs)): ?>  <ul> <?php foreach ($msgs as $msg): ?>   <li><?=h($msg)?></li> <?php endforeach; ?>  </ul> <?php endif; ?>  <form action="" method="post">   <input type="text" name="left" value="<?=h($left)?>" />   <select name="operator"> <?php foreach ($operators as $key => $value): ?> <?php $selected = $key === $function ? ' selected="selected"' : ''; ?>    <option<?=$selected?>><?=$value?></option> <?php endforeach; ?>   </select>   <input type="text" name="right" value="<?=h($right)?>" />   <input type="submit" name="calc" value="計算" />  </form> </body> </html>

noname#244856
noname#244856
回答No.1

多分求めているのはこれでしょう。 PHP Manual - eval http://php.net/manual/ja/function.eval.php 但し、マニュアルでも警告されている通り、ユーザー入力に対して何の検証も行わないままevalを使用することは危険行為以外いの何者でもありません。少々めんどくさくてもif文で場合分けすべきだと思います。 関連 http://qiita.com/mpyw/items/2f9955db1c02eeef43ea

関連するQ&A

  • PHPのシンプルな構文(初心者)

    ランダムに出る掛け算の答えを入力して 別ファイルで正解か不正解という表示をする構文なのですが 「input type="hidden"」部分の値の出力・受取りができず 正しく実行がされません。 どこが間違っているのでしょうか? よろしくお願いいたします。 in.php -------------------------------------- <?php $saki = rand(1,9); $ato = rand(1,9); echo "$saki X $ato"; $seikai = $saki*$ato; ?> <html> <body> <form method="post" action="out.php"> <input type="text" name="kotae"> <input type="hidden" name="hid" value="<?php $seikai ?>"> ←※ <input type="submit" value="回答"> </form> </body> </html> -------------------------------------- out.php -------------------------------------- <?php $kotae = $_POST["kotae"]; $seikai = $_POST["hid"];     ←※ if($kotae == $seikai){ echo "正解です"; }else{ echo "間違っています。"; } echo "<hr>正解は{$seikai}です。"; ?> --------------------------------------

    • ベストアンサー
    • PHP
  • シンプルなPHPのフォームテスト

    ランダムにでた計算の答えの値を フォームによって送信して正解か間違っているかを表示する PHPプログラムを考えてみたのですが上手くいきません。 in.php ------------------------------------------ <html> <body> <?php $saki = rand(1,9); $ato = rand(1,9); echo "計算:{$saki}X{$ato}="; $seikai = $saki*$ato; echo '<form action="out.php" method="post">'; echo '<input type="text" name="kotae">'; echo '<input type="hidden" name="hidden" value="$seikai">'; echo '<input type="submit" value="回答"></form>'; ?> </body> </html> ------------------------------------------ out.php ------------------------------------------ <html> <body> <?php $kotae = $_POST["kotae"]; $seikai = $_POST["hidden"]; if($kotae == $seikai){ echo "正解です"; }else{ echo "間違いです"; } ?> </body> </html> ------------------------------------------ in.phpファイルのインプットタグhiddenの所と out.phpファイルでの$_POST["hidden"]の受け取り部分が 間違っているのだと思いますが 正しくはどのようにしたらいいのでしょうか? もっとシンプルで分かりやすい書き方もあれば お教えください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPの構文

    名前と年齢をフォームページから入力して 名前・年齢、そして成人・未成年の表示をするPHPのサンプルがあります。 初学者で無駄な部分が多く複雑になってしまったのですが ここをもっとこうしたほうが良いなど もっとシンプルで分かりやすい構文にできるのでしょうか? よろしくお願いいたします。 in.php ----------------------------------------------- <html> <body> <form action="out.php" method="post"> <table><tr><td>名前入力: <input type="text" name="name"></td></tr> <tr><td>年齢入力: <input type="text" name="age"></td></tr> </table> <input type="submit" value="ボタン"> </form> </body> </html> ----------------------------------------------- out.php ----------------------------------------------- <html> <body> <?php $name = htmlspecialchars($_POST["name"], ENT_QUOTES); $agen = mb_convert_kana($_POST["age"], "a"); $age = htmlspecialchars($agen, ENT_QUOTES); If($name == ""){ if($age == ""){ echo "名前、年齢の入力がありません。"; }else{ echo "名前を入力してください。"; } }else{ if($age == ""){ echo "年齢を入力してください。"; }else{ echo "あなたの名前は{$name}、年齢は{$age}です。"; if($age<20){ echo "あなたは未成年です。"; }else{ echo "あなたは成人です。"; } } } echo "<p><a href='in.php'>フォームに戻る</a>"; ?> </body> </html> -----------------------------------------------

    • ベストアンサー
    • PHP
  • PHP

    PHPで質問があります。funに「無し」を選択すると結果が?になり文字化けします。なぜでしょうか? <select name="fun"> <option vaue="*">無し</option> <option value="1">01</option> <option value="2">02</option> <option value="3">03</option> <option value="4">04</option> <option value="5">05</option> <option value="0">00</option> </select> </p> <input type="submit" value="設定" /> </form> </body> </html> <?php echo $_POST['fun']; echo " "; echo $_POST['jikan']; echo " "; ?>

    • ベストアンサー
    • PHP
  • phpがうまく動きません。

    phpで4択のクイズを作りたいのですが 正解のラジオボタンを選んでもカウントされないのと 答え合わせを押すと正解だった箇所を赤く表示したいのですがなんて書けばよいのか どこにそのコードを入れるのかよくわかりません <状態> ・5つのデータがmyadminに保存されています ・データベースの内容は表示されます。 ・答え合わせを押すと正解のラジオボタンを選んだ数が表示されるようにしたいです ・保存ボタンは閉じても答えを保存するためにあります ・q_noは8ケタ固定であり、左から5つ目までは固定であと3桁は999問入れられるよう設定してあります ・q_ansはデータベースに答えの値(1~4)が入れてあります ・データベース名はproblemです <省略> $res_set = mysql_query($sql); while ($row=mysql_fetch_array($res_set)){ ?> <form method="POST" action="H2102.php"> <?php echo $row['q_no'] . " "; ?> <br> <?php echo $row['q_text'] . " "; ?><br><br> <br> <?php echo "ア"; ?> <input type="radio" name="q_ans" value="1"> <?php echo $row['q_point1'] . " "; ?> <br><br><br> <?php echo "イ"; ?> <input type="radio" name="q_ans" value="2"> <?php echo $row['q_point2'] . " "; ?> <br> <br><br> <?php echo "ウ"; ?> <input type="radio" name="q_ans" value="3"> <?php echo $row['q_point3'] . " "; ?> <br><br><br> <?php echo "エ"; ?> <input type="radio" name="q_ans" value="4"> <?php echo $row['q_point4'] . " "; ?> <br><br><br> <br> <input type = "submit" name="save" value="保存"> <?php if(isset($_POST['save'])){ $_SESSION['save'] = $_POST['q_ans']; //保存すると選んだ回答を保存 } ?> <?php } ?> </form> <form method="POST" action="H2102.php"> <input type = "submit" name="ans" value="答え合わせ"> <?php //正解かどうかをチェック if(isset($_POST['ans'])){ $a = $_SESSION['a']; if($row['q_no'] == $_POST['q_no'] && $_POST['q_ans'] || $_SESSION['save'] == $row['q_ans'] ){ $_SESSION['a'] = $a + 1; //q_noが一致かつ保存した値または選んだ解答(値)が一致していれば1問につき1つカウントする $a = $_SESSION['a']; } echo $a; //カウントされているかをチェック } ?> <input type = "submit" name="del" value="カウント初期化"> <?php if(isset($_POST['del'])){ session_unset(); } ?> </form> <br> <?php } ?> 足りない情報があれば追記します

    • 締切済み
    • PHP
  • ボタンを押して計算結果を出したい

    下記のもの、うまくいきません。 どのようにしたらよいのでしょうか? 教えてください。よろしくお願いします。 <HTML> <HEAD> <TITLE>Calculator</TITLE> <SCRIPT language = "JavaScript"> function calc(Submit){ Num1 = document.foam1.Num1; Num2 = document.foam1.Num2; Ans = document.foam1.Ans; document.foam1.Ans.value = s1 Ans s2; } </SCRIPT> </HEAD> <PRE> 数値1 演算子 数値2 答え</PRE> <FORM METHOD=GET ACTION="/calc/calc.exe"> <INPUT NAME="Num1" VALUE="" onChange="calc()"> <SELECT NAME="Opr" SIZE=1 VALUE="" onChange="calc()"> <OPTION>+<OPTION>-<OPTION>*<OPTION>/</SELECT> <INPUT NAME="Num2" VALUE="" onChange="calc()"> = <INPUT NAME="Ans" VALUE="" onChange="calc()"> <INPUT TYPE="Submit" VALUE="計算"> </FORM> <H2></H2> </HTML>

  • PHPとhtmlについて

    初心者なりに下のようなプログラムを作ってみましたが、「注文画面へ」のボタンを押しても反応がありません。どうしたらいいでしょうか?教えてください。 あと、注文画面へ行くとボールの個数を選んだ後に出る合計金額を次のページに反映させたいのですが、それもわかりません。もしよければ、こちらも教えてください。 よろしくお願いします。 <html> <head> <title> 商品確認 </title> <script language ="JavaScript"> <!-- function calc(amount){ document.ball.total.value = 4095 * eval(amount); }//--> </script> </head> <body> <form name=ball> V4SLBL ソフトタッチ鈴入り4号球<br> <hr> 個数: <select name ="num" onchange = "javascript:calc(this.value)"> <option value =0>0 <option value =1>1 <option value =2>2 <option value =3>3 <option value =4>4 <option value =5>5 </select> 小計: <input type="text" size="8" name="total">円<br> <hr> <?php $go['V4SLBL ソフトタッチ鈴入り4号球'] = "4,095円"; echo " 商品確認"; echo "<table border=\"1\">"; foreach($go as $key=>$value) echo '<tr><td>'."$key</td><td>$value</td></tr>"; echo '</table>'; echo"<form action=\"m4.php\" method = \"post\"> <input type = \"submit\" value = \"注文画面へ\"></form>"; echo"<form action=\"m1.php\" method = \"post\"> <input type = \"submit\" value = \"戻る\"></form>"; ?> </form> </body> </html>

    • 締切済み
    • PHP
  • php初心者です。クイズについて

     phpでランダムに問題が表示され、それに答えると「正解!」、 「不正解!」となるようにしたいのですが。(単語カードみたいな)  問題をランダムに表示することは出来たのですが、問題に 対しての答えをどの様に記述すればいいのでしょうか? (下記のソースに追加・修正をして頂くか、参考となるサイト があれば教えて頂けないでしょうか?)  当方、phpをかじり始めたばかりなので、わかりやすく 教えて頂けると助かります。  どなたか、ご教授宜しくお願い致します。 <?php $quiz = array("りんごを英語で?", "いちごを英語で?", "とまとを英語で?"); shuffle($quiz); error_reporting(E_ALL & ~E_NOTICE); $kotae=$_POST["kotae"]; if ($_SERVER['REQUEST_METHOD']=="POST") { $message = ($quiz['answer'] == $_POST['kotae']) ? "正解!" : "不正解!"; echo $message; exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> </head> <body> <form action="" method="post"> <p>Q. <?echo current($quiz); ?> </p> <input type="text" name="kotae" size="50"><br><br> <input type="submit" value="回答する!"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • phpでのselect値の取得・表記について

    php初心者です。 自動計算する見積ページを独学で作っているのですが、どうしてもわからなかったので、質問させてください。 htmlページでセレクトタグから選択してもらった結果(値)を、phpページに送信し、phpページでvalueとname両方を別々の場所に表記するには、どのようなコードを書けば良いでしょうか? valueの値をphpページで表記させたり計算させる事はなんとか独学でもできたんですが、nameを表記させる事がどうしてもできませんでした。 お詳しい方、何卒ご教授ください。 途中までなんとかできたタグを下記に記載します。 <例>input.html → output.php (1)input.html (細かいタグは端折ります) <html> <body> <form action="output.php" method="post"> <tr> <th>生菓子</th> <td> <select name="goods1" onChange="keisan()" style="padding:5px; border:1px solid #dcdcdc;" /> <option value="0" name="未選択">お選びください</option> <option value="500" name="フルーツケーキ">フルーツケーキ</option> <option value="3000" name="チーズケーキ">チーズケーキ</option> <option value="5000" name="チョコレートケーキ">チョコレートケーキ</option> <option value="※別途見積" name="おまかせ">おまかせ</option> </td> </tr> <tr> <tr>焼き菓子</th> <td> <select name="goods2" onChange="keisan()" style="padding:5px; border:1px solid #dcdcdc;" /> <option value="0" name="未選択">お選びください</option> <option value="500" name="クッキー">クッキー</option> <option value="3000" name="パウンドケーキ">パウンドケーキ</option> <option value="5000" name="パイ">パイ</option> <option value="※別途見積" name="おまかせ">おまかせ</option> </td> </tr> <tr> <th><input type="submit" value="submit" /></th> </tr> </form> </body> </html> ↓上記で選択してもらった値を下記のoutput.phpにsubmit。 (2)output.php (細かいタグは端折ります) <html> <body> <tr> <th>生菓子</th> <td>ここに選択されたnameの値を表記したい!</td> <td><?php echo htmlspecialchars($_POST["goods1"]); ?></td> </tr> <tr> <th>焼き菓子</th> <td>ここに選択されたnameの値を表記したい!</td> <td><?php echo htmlspecialchars($_POST["goods2"]); ?></td> </tr> <tr> <td colspan="2">Total </td> <td><?php echo htmlspecialchars( $_POST["goods1"] + $_POST["goods2"]); ?><td> </tr> </body> </html> 以上。 ぜひ、ぜひぜひご教授よろしくお願いいたします。

    • 締切済み
    • PHP
  • セレクトボックスを使った計算式

    テキストボックスに文字を入力してセレクトボックスで四則計算 をプルダウンメニューで選択し、3つ目のテキストボックスに 計算結果を表示するにはどのようにしたらよいのでしょうか? とりあえず途中まで作ってみました。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>スクリプト練習</title> <script type="text/javascript"> <!-- function keisan(){     if(option value="+"){     document.f1.t3.value(document.f1.t1.value + document.f1.t2.value); } } //--> </script> </head> <body> <form name="f1"> <input type="text" size="5" name="t1"> <select name="color2"> <option value="+">+</option> <option value="-">-</option> <option value="×">×</option> <option value="÷">÷</option> </select> <input type="text" size="5" name="t2"> <input type="button" value="=" onClick="keisan()"> <input type="text" size="5" name="t3"> </form> </body> </html> if文を作るところが特にわからず止まっています。 どうかよろしくお願いします。

専門家に質問してみよう