程序计算器使用PHP进行计算和HTML输入表单
我是一个PHP新手,我试着用PHP HTML设置一个计算器 问题: 我想用php脚本调用自己来处理输入值。 我的目标是避免php会话缓存这些值。具体来说,我有两个不同的字段-一个输出字段(只读)和一个输入字段(可以输入数值)。除此之外,还有5个不同的按钮用于计算输入字段中的加法、减法、乘法、除法和赋值。 我只能用会话变量解决这个问题,如下面的示例所示。我使用一个自己定义的会话,我尝试用普通的PHP变量替换它,并且每次按下一个操作按钮时都要更新它们。此外,应保存输入值和输出,以便能够再次使用相同的值,而无需将其重新输入表单 基本上,我想用php变量(如$output)替换所有会话变量(如$_session['output'))。我已经尝试过的所有方法都不起作用,因为每次我调用脚本或调用自身时,这些值都会被覆盖程序计算器使用PHP进行计算和HTML输入表单,php,html,variables,Php,Html,Variables,我是一个PHP新手,我试着用PHP HTML设置一个计算器 问题: 我想用php脚本调用自己来处理输入值。 我的目标是避免php会话缓存这些值。具体来说,我有两个不同的字段-一个输出字段(只读)和一个输入字段(可以输入数值)。除此之外,还有5个不同的按钮用于计算输入字段中的加法、减法、乘法、除法和赋值。 我只能用会话变量解决这个问题,如下面的示例所示。我使用一个自己定义的会话,我尝试用普通的PHP变量替换它,并且每次按下一个操作按钮时都要更新它们。此外,应保存输入值和输出,以便能够再次使用相同的
<?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>
最简单的解决方法是什么?一个简单的解决方法是使用$\u POST变量: 替换
if (is_null($_SESSION['output'])){
$_SESSION['output'] = "0.0";
}
借
然后用$output变量替换代码中的$_SESSION['output'.这里是没有SESSION的相同脚本,只要不关闭/刷新页面,就可以保持会话超时
<!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>
如果可以在解决方案中使用javascriptJQuery,我将避免使用php收集用户输入。它更适合服务器端处理。下面是重新构造的代码,以使用javascript 我从您的输入文本元素大小属性中删除了px,它不是必需的,也不会正确验证 我希望有帮助 -拉里
<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;
}
每次都是什么。使用F5键重新加载页面?为什么不使用$\u POST变量从表单中获取值,处理它们,然后输出结果?另一个问题。。有没有办法使输出字段中的0.0实际上是0.0逗号而不是0?我可以用%f强制它,但是当我这样做的时候,如果我使用除法运算,我就无法获得更高的精度。实际上,我确实尝试在没有javascript的情况下使用它:-但是谢谢
<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>