PHP 数学-运算符

3

我有一个简单的网站,使用php进行一些简单的数学计算,代码如下:

<form action="" method="POST">
<input type="text" name="first" />
<select name="method">
    <option>+</option>
    <option>_</option>
    <option>*</option>
    <option>/</option>
</select>
<input type="text" name="second" />
<input type="submit" value="Equals" />

该网站允许用户输入两个数字,然后选择一个数学运算符来对它们进行操作。例如,在第一个输入框中,用户可以输入数字3,选择减法运算符,在下一个输入框中输入数字1,然后提交。我会按照如下方式处理这些信息:
if (isset($_POST['first']) && isset($_POST['second'])) {
   $first = $_POST['first'];
   $second = $_POST['second'];
   $method = $_POST['method'];
} 

然而,在提交后,我想要在网页上显示数学问题的答案。该如何做呢?简单地回显所有变量只会给我(在这种情况下)"3-1",而不是实际的答案 "2"。

有什么好的想法可以实现吗?


2
可能是重复的问题:如何在 PHP 中评估作为字符串传递的公式? - Ben Lee
我不确定我真正理解如何将那个解决方案应用到我的答案中。 - codedude
4个回答

6
if (isset($_POST['first']) && isset($_POST['second'])) {
    $first = $_POST['first'];
    $second = $_POST['second'];
    $method = $_POST['method'];
    switch($method)
    {
        case '+':
            $result = $first + $second;
            break;
        case '-':
            $result = $first - $second;
            break;
        case '*':
            $result = $first * $second;
            break;
        case '/':
            // check for division by 0 (wouldn't want to blow anything up)
            $result = $first / $second;
            break;
        default:
            $result = 'undefined operation';
            break;
    }
    printf("%.5f %s %.5f = %s", $first, $method, $second, $result);
}

$second 是一个整数,因此您可能希望使用 %d 而不是第二个 %s - Arjan
@Arjan:你怎么知道这是整数?他从来没有说过这些值是整数。我可能会在两个参数上都加入 is_numeric 检查。 - Aleks G
Tims 代码的第 2 和第 3 行将数字输入转换为整数。 - Arjan

2
你可以使用 switch case。
switch($method){

case "+":
    $result = $first + $second;
    break;
case "-":
    $result = $first - $second;
    break;
case "*":
    $result = $first * $second;
    break;
case "/":
    $result = $first/$second;
    break;
}

echo $result;

请格式化您的回答?这对于大多数查看您的答案的人来说非常难以阅读。 - Mathieu Dumoulin
我提前提交了,我已经完成了。 - Laurence Burke

2
您需要在$method上使用switch语句,如下所示:
switch($method){

    case '+':
        $result = $first + $second;
        break;

    case '-':
        $result = $first - $second;
        break;

    case '*':
        $result = $first * $second;
        break;

    case '/':
        $result = $first / $second;
        break;

}
var_dump($result);

或者,您也可以对操作进行评估:

$code = '$result = '.$first.$method.$second.';';
exec($code);
var_dump($result);

请注意,您不应该对输入内容进行检查,这可能会导致安全问题:
if(!isset($_POST['first']) || !is_numeric($_POST['first'])){ exit('Bad number in #1'); }

请对其他输入进行相同的操作,例如 first、second 和 method :)

1

仅仅评估表达式是危险的,因为它可能包含恶意内容,您永远不应该信任用户输入(即使您使用了 select 标签,某人也可以注入任何内容)。

首先对输入进行清理,然后再进行评估(例如,检查两个数字是否实际上是数字,方法是否只是可接受列表中的一个),或者在方法变量上使用 switch 语句,并在 PHP 中编写每个方法。

或者,您可以查看 PHP 内部的脚本语言,如 LUA。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接