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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

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

Q&A

解決済

2回答

8248閲覧

PHPで電卓を作りたいのですが...

Karuma

総合スコア12

PHP

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

0グッド

1クリップ

投稿2016/12/12 14:30

編集2016/12/12 14:45

今回初めてteratailを使用します。何かおかしなところがありましたら指摘してください。タイトルでも書きましたが、javascriptではなくphpで電卓を作りたいのです。そこで、四則演算と、同じ画面で計算結果を出力することができたのですが、半角数字制限がどうしてもうまくいきません。google先生に伺ったところ
if (preg_match("/^[0-9]+$/", $num))
というコードが出てきたのですが、どこにどう利用してもうまくいきません。他にも色々試してみたのですが結果は同じです。最終的には半角数字以外で書かれたら、その下に吹き出しでエラーを出したいと思って

<?php $num = isset($_GET['num']) ? $_GET['num'] : null; $operator = isset($_GET['operator']) ? $_GET['operator'] : '+'; $num1 = isset($_GET['num1']) ? $_GET['num1'] : null; if (!is_null($num) && !is_null($num1)) { switch ($operator) { case '-': $answer = $num - $num1; break; case '*': $answer = $num * $num1; break; case '/': $answer = $num / $num1; break; case '+': default: $answer = $num + $num1; break; } $result = "{$num} {$operator} {$num1} = {$answer}"; } else { $result = '計算されていません。'; } ?> <!DOCTYPE html> <html lang = "ja"> <head> <meta charset = "utf-8"> <title>電卓を作ろう</title> <link rel="stylesheet" href="dentaku.css"> </head> <body> <form action="" method="get"> <h1>計算してみよう!</h1> <p><input name="num" style="width:110px;height:15px;" style="ime_mode:disabled" value="<?php echo $num; ?>" placeholder="半角数字のみ" required autofocus></p> <select name="operator"> <option value="+" <?php if ($operator === '+') { echo 'selected'; } ?>>+</option> <option value="-" <?php if ($operator === '-') { echo 'selected'; } ?>>-</option> <option value="*" <?php if ($operator === '*') { echo 'selected'; } ?>>*</option> <option value="/" <?php if ($operator === '/') { echo 'selected'; } ?>>/</option> </select> <p><input name="num1" style="width:110px;height:15px" name="num1" style="ime_mode:disabled" value="<?php echo $num1; ?>" placeholder="半角数字のみ" required></p> <input type="submit" id="btn" value="計算する"> <input type="button" onclick="location.href='http://localhost:8888/dentaku.php'" value="リセット"> </form> <p><?php echo $result; ?></p> </body> </html>

コードはこんな感じで書きました。調べて書いたのと自分で書いたのとで読みにくいとは思いますが、if (preg_match("/^[0-9]+$/", $num))はどこに書くのが正しいのでしょうか?そもそもが間違っているよというようなところなどありましたらご指摘ください。宜しくお願いします。

試したこと
このコードを書けばいいよという記事がありいろんなところにほりこんでみましたが、計算結果に+ = 0とでたり、そもそも何も変わらなかったりで、どこに書けばいいのかわからなくてここ3日間悩んでます。

補足情報
マシンはmac yosemiteです。
環境はgoogle chromeで、テキストエディタはATOMです。
あとMAMPも使っています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2016/12/12 14:37

質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
guest

回答2

0

ベストアンサー

初心者の方なようなので、簡潔に。

こうするのが正解です。
ifのところにpreg_match("/^[0-9]+$/", $num)を入れています。

php

1<?php 2$num = isset($_GET['num']) ? $_GET['num'] : null; 3$operator = isset($_GET['operator']) ? $_GET['operator'] : '+'; 4$num1 = isset($_GET['num1']) ? $_GET['num1'] : null; 5 6echo preg_match("/^[0-9]+$/", $num); 7echo preg_match("/^[0-9]+$/", $num1); 8 9if ( !is_null($num) && !is_null($num1) && preg_match("/^[0-9]+$/", $num) === 1 && preg_match("/^[0-9]+$/", $num1) === 1 ) { 10 switch ($operator) { 11 case '-': 12 $answer = $num - $num1; 13 break; 14 case '*': 15 $answer = $num * $num1; 16 break; 17 case '/': 18 $answer = $num / $num1; 19 break; 20 case '+': 21 default: 22 $answer = $num + $num1; 23 break; 24 } 25 $result = "{$num} {$operator} {$num1} = {$answer}"; 26} else { 27 $result = '計算されていません。'; 28} 29?> 30<!DOCTYPE html> 31<html lang = "ja"> 32<head> 33 <meta charset = "utf-8"> 34 <title>電卓を作ろう</title> 35 <link rel="stylesheet" href="dentaku.css"> 36</head> 37 38<body> 39 40 <form action="" method="get"> 41 <h1>計算してみよう!</h1> 42 <p><input name="num" style="width:110px;height:15px;" style="ime_mode:disabled" value="<?php echo $num; ?>" placeholder="半角数字のみ" required autofocus></p> 43 44 <select name="operator"> 45 <option value="+" <?php if ($operator === '+') { echo 'selected'; } ?>>+</option> 46 <option value="-" <?php if ($operator === '-') { echo 'selected'; } ?>>-</option> 47 <option value="*" <?php if ($operator === '*') { echo 'selected'; } ?>>*</option> 48 <option value="/" <?php if ($operator === '/') { echo 'selected'; } ?>>/</option> 49 </select> 50 51 <p><input name="num1" style="width:110px;height:15px" name="num1" style="ime_mode:disabled" value="<?php echo $num1; ?>" placeholder="半角数字のみ" required></p> 52 <input type="submit" id="btn" value="計算する"> 53 <input type="button" onclick="location.href='http://localhost:8888/dentaku.php'" value="リセット"> 54 </form> 55 <p><?php echo $result; ?></p> 56</body> 57</html> 58

解説

preg_match("/^[0-9]+$/", $num)
こいつは一体何なのか?というと、「正規表現」というもので、
文字列又は数列がマッチングしている否かを考えています。

あ、分かりにくい?
砕いて言いますと、

ある決まりごと通りに、値が変数に入っているかどうかを判別しているのです!

今回の場合、
/^[0-9]+$/
は、

/ → 正規表現の始まりと終わり
^ → 行の始まり
[0-9] → 0~9の数値
+ → 直前の文字の繰り返し
$ → 行の終わり

ということなので、
最初から最後まで全部数値の場合はマッチしている!(1を返す)という、法則を使っています。

なので、

preg_match("/^[0-9]+$/", $num)

と、

preg_match("/^[0-9]+$/", $num1)

が、両方1……つまり、$num$num1の両方が数値のみならば、計算を開始するというふうになります。

蛇足

PHPには、全角を半角に治すという、素晴らしい関数が用意されておりまして……

http://php.net/manual/ja/function.mb-convert-kana.php

$num = mb_convert_kana($num, "n", "UTF-8")

投稿2016/12/12 15:23

編集2016/12/12 15:28
nnahito

総合スコア2004

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karuma

2016/12/13 05:36

おっしゃる通りです。初心者です。とっても参考になりました!大助かりです!誠にありがとうございました。
guest

0

下記の流れを考えてください。
1-値の取得
2-値の検証
3-値の処理
4-処理結果の表示

今回の正規表現を使った判定処理は入力が数値であること確認するためなので値の検証をしている箇所に配置してしてください。

投稿2016/12/12 15:08

編集2016/12/12 15:08
yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karuma

2016/12/13 05:34

ご指摘ありがとうございます!僕の検索力不足でした。後から考えると確かにその通りです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問