程序计算器使用PHP进行计算和HTML输入表单

时间:2014-10-31 00:38:31

标签: php html variables

我是一个PHP新手,我试图用PHP(HTML)设置一个计算器。

问题:

我想让php脚本调用自己来处理输入值。 我的目标是避免php会话缓存值。具体来说,我有两个不同的字段 - 一个是readonly的输出字段和一个输入字段,可以输入数值。除此之外,还有5个不同的按钮用于计算输入字段中的加法,减法,乘法,除法和赋值。 我只能通过以下示例解决会话变量的问题。我使用自己定义的会话,我尝试用普通的PHP变量替换它,我想在每次按下一个操作按钮时更新它们。此外,应保存输入值以及输出,以便能够再次使用相同的值,而无需将其重新输入到表单中。

基本上,我想用“$ output”之类的php变量替换所有会话变量,如“$ _SESSION ['output']”。我已经尝试过的所有功能都无法正常工作,因为每次我回忆起脚本时(或通过调用自身)都会覆盖这些值。

<?php session_start(); 

// Session Timeout:
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 60)) {
    // last request was more than 1 minute ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP Calculator</title>
<style type="text/css">
#add {
    color:black;
    background-color:#F55;
}
#subtract {
    color:black;
    background-color:#55f;
}
#multiply {
    color:black;
    background-color:#5f5;
}
#divide {
    color:black;
    background-color:#ff5;
}
#exp {
    color:black;
    background-color:#fa2;
}
#equal {
    color: black;
    background-color:#ccc;
}
.res {
    color: black;
    font-style: italic;
    background-color:#eee;
    border: none;
}
</style>
</head>

<body>

<?php 
    if (is_null($_SESSION['output'])){
        $_SESSION['output'] = "0.0"; 
    }

// Operations to execute via form.
$_SESSION['input'] = $_POST['input'];

if(isset($_REQUEST['add'])){
    $_SESSION['output'] += $_POST['input']; 
} else if (isset($_REQUEST['subtract'])) {
    $_SESSION['output'] -= $_POST['input']; 
} else if (isset($_REQUEST['multiply'])) {
    $_SESSION['output'] *= $_POST['input']; 
} else if (isset($_REQUEST['divide'])) {
    if($_POST['input'] == 0) {
        $_SESSION['output'] = $_POST['input'];  
    } else {
        $_SESSION['output'] /= $_POST['input']; 
    }
} else if (isset($_REQUEST['exp'])) {
    $_SESSION['output'] = pow($_SESSION['output'], $_POST['input']);    
} else if (isset($_REQUEST['equal'])) {
    $_SESSION['output'] = $_POST['input'];  
} else {
    $_SESSION['input'] = 0.0;
}
?>

<form name="calculator" action="index.php" method="post">
<input class="res" type="text" readonly="readonly" size="23px" value="Result:" />
<input class="res" type="text" readonly="readonly" size="20px" value="Input:" />
<input class="res" type="text" readonly="readonly" size="10px" value="Operations:" /><br>
<input name="output" type="text" readonly="readonly"  value="<?php print ($_SESSION['output'])?    >"/>
<input name="input" type="text" onfocus="this.value=''" value="<?php print ($_SESSION['input'])?    >" />
<input id="add" name="add" type="submit" value="+" />
<input id="subtract" name="subtract" type="submit" value="-" />
<input id="multiply" name="multiply" type="submit" value="*" />
<input id="divide" name="divide" type="submit" value="/" />
<input id="exp" name="exp" type="submit" value="^" />
<input id="equal" name="equal" type="submit" value="=" />
</form>
</center>
</body>
</html>

解决这个问题最简单的方法是什么?

3 个答案:

答案 0 :(得分:0)

一个简单的解决方案是使用$_POST变量:

替换

if (is_null($_SESSION['output'])){
    $_SESSION['output'] = "0.0"; 
}

通过

$output = (isset($_POST['output'])) ? floatval($_POST['output']) : 0.0;

然后用$_SESSION['output']变量替换代码中的$output

答案 1 :(得分:0)

这里是没有会话的相同脚本,同时保持&#34;会话&#34;超时工作(只要你不关闭/刷新页面)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP Calculator</title>
<style type="text/css">
#add {
    color:black;
    background-color:#F55;
}
#subtract {
    color:black;
    background-color:#55f;
}
#multiply {
    color:black;
    background-color:#5f5;
}
#divide {
    color:black;
    background-color:#ff5;
}
#exp {
    color:black;
    background-color:#fa2;
}
#equal {
    color: black;
    background-color:#ccc;
}
.res {
    color: black;
    font-style: italic;
    background-color:#eee;
    border: none;
}
</style>
</head>

<body>

<?php
$lastActivity = (int)(isset($_REQUEST['last_activity']))?$_REQUEST['last_activity']:time();
$output = (float)(isset($_REQUEST['output']))?$_REQUEST['output']:0;
$input = (float)(isset($_REQUEST['input']))?$_REQUEST['input']:0;


// "Session" timeout
if(time() - $lastActivity > 60){
    $output = 0;
}

if(isset($_REQUEST['add'])){
    $output += $input; 
} else if (isset($_REQUEST['subtract'])) {
    $output -= $input; 
} else if (isset($_REQUEST['multiply'])) {
    $output *= $input; 
} else if (isset($_REQUEST['divide'])) {
    if($input == 0) {
        $output = $input;  
    } else {
        $output /= $input; 
    }
} else if (isset($_REQUEST['exp'])) {
    $output = pow($output, $input);    
} else if (isset($_REQUEST['equal'])) {
    $output = $input;  
} else {
    $input = 0.0;
}

?>
<form name="calculator" action="index.php" method="post">
    <input type="hidden" name="last_activity" value="<?php echo $lastActivity?>" />
    <input class="res" type="text" readonly="readonly" size="23px" value="Result:" />
    <input class="res" type="text" readonly="readonly" size="20px" value="Input:" />
    <input class="res" type="text" readonly="readonly" size="10px" value="Operations:" /><br>
    <input name="output" type="text" readonly="readonly"  value="<?php echo $output?>"/>
    <input name="input" type="text" onfocus="this.value=''" value="<?php echo $input?>" />
    <input id="add" name="add" type="submit" value="+" />
    <input id="subtract" name="subtract" type="submit" value="-" />
    <input id="multiply" name="multiply" type="submit" value="*" />
    <input id="divide" name="divide" type="submit" value="/" />
    <input id="exp" name="exp" type="submit" value="^" />
    <input id="equal" name="equal" type="submit" value="=" />
</form>
</body>
</html>

答案 2 :(得分:0)

如果在你的解决方案中使用javascript(JQuery)是可以的,我会避免使用php来收集用户输入。它更适合服务器端处理。以下是重新构建为使用javascript的代码。

我从输入文本元素大小属性中删除了px(没有必要,也不会正确验证)。

我希望它有所帮助。

-Larry

                  <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>PHP Calculator</title>
 <style type="text/css">
#add {
color:black;
background-color:#F55;
}
#subtract {
color:black;
background-color:#55f;
}
#multiply {
color:black;
background-color:#5f5;
}
#divide {
color:black;
background-color:#ff5;
}
#exp {
color:black;
background-color:#fa2;
}
#equal {
color: black;
background-color:#ccc;
}
.res {
color: black;
font-style: italic;
background-color:#eee;
border: none;
}

   

  <form id="calculator" name="calculator" action="index.php" method= "GET">
  <input class="res" type="text" readonly="readonly" size="23" value="Result:" />
  <input class="res" type="text" readonly="readonly" size="20" value="Input:" />
  <input class="res" type="text" readonly="readonly" size="10" value="Operations:" /><br/>
  <input id="output" name="output" type="text" readonly="readonly"  value=""/>
  <input id="input" name="input" type="text" value="" />
  <input id="add" name="add" type="button" value="+" />
  <input id="subtract" name="subtract" type="button" value="-" />
  <input id="multiply" name="multiply" type="button" value="*" />
  <input id="divide" name="divide" type="button" value="/" />
  <input id="exp" name="exp" type="button" value="^" />
  <input id="equal" name="equal" type="submit" value="=" />
  </form>

 <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 <script>
 $("input").on("click",function(){//begin on click function

  //if the input elements value is not equal to "="
  if($(this).attr("value") !== "="){//begin if then

  //set the #input element to its current value plus the new value
  $("#input").val($("#input").val() + $(this).attr("value"));

  }//end if then

 });//end on click function

 $("#equal").on("click",function(e){//begin on click function

  //prevent form from submitting
  e.preventDefault();

  //evaluate the expression and store the result
  //todo:escape input if it could cause a security threat
  var expression = eval($("#input").val());

  //display the result in the #output input element
  $("#output").val(expression);

  });//end on click function

  </script>

 </body>
 </html>