@ってなに?

実際に計算の機能を付けましょう。

<?php 
@$number1 = $_GET['number1'];
@$number2 = $_GET['number2'];
@$operator = $_GET['operator'];
$result = 0;

switch ($operator) {
    case 'add':
        $result = $number1 + $number2;
        break;
    case 'minus':
        $result = $number1 - $number2;
        break;
    case 'multiply':
        $result = $number1 * $number2;
        break;
    case 'divide':
        $result = $number1 / $number2;
        break;
    default:
        break;
}

?>
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
    <form action="#">
        <input type="text" name="number1" placeholder="数字1">
        <select name="operator">
            <option value="add">+</option>
            <option value="minus">-</option>
            <option value="multiply">×</option>
            <option value="divide">÷</option>
        </select>
        <input type="text" name="number2" placeholder="数字2">
        <input type="submit" value="送信">
    </form>
    結果:<?php echo htmlspecialchars($result,ENT_QUOTES); ?>
</body>
</html>

分析すると、まず変数にフォームに入る値を持つ変数を代入します。

@$number1 = $_GET['number1'];
@$number2 = $_GET['number2'];
@$operator = $_GET['operator'];

そして計算を行います。

switch ($operator) {
    case 'add':
        $result = $number1 + $number2;
        break;
    case 'minus':
        $result = $number1 - $number2;
        break;
    case 'multiply':
        $result = $number1 * $number2;
        break;
    case 'divide':
        $result = $number1 / $number2;
        break;
    default:
        break;
}

そしてHTMLの中に結果を表示します。

結果:<?php echo htmlspecialchars($result,ENT_QUOTES); ?>

*ちなみに、htmlspecialcharsは、xss(cross site scripting)を防ぐための機能です。

このまま実行すれば、なんも問題はありません。数字を入力すればですね。しかしいたずらで文字とかの入力は十分可能なので、仮に文字を入れられたとして、

switch ($operator) {
    case 'add':
        @$result = $number1 + $number2;
        break;
    case 'minus':
        @$result = $number1 - $number2;
        break;
    case 'multiply':
        @$result = $number1 * $number2;
        break;
    case 'divide':
        @$result = $number1 / $number2;
        break;
    default:
        break;
}

のようにresult変数に@を付けてエラーを隠しても、処理されたとは言えません。

ならどうしたらいい?

Leave a Reply

Create your own website, free on WordPress.com.Create your own website.
Start free