• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:簡単なPHPの計算構文(初学者))

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

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

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

  • ベストアンサー
  • 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

専門家に質問してみよう