2014-10-31 55 views
1

我是一名PHP新手,我嘗試在PHP(HTML)中設置計算器。程序計算器使用PHP進行計算和HTML輸入表格

問題:

我想讓php腳本調用自己來處理輸入值。 我的目標是避免php會話緩存值。具體來說,我有兩個不同的字段 - 一個是隻讀的輸出字段和一個可以輸入數字值的輸入字段。除此之外,還有5個不同的按鈕可用於計算輸入字段中的加法,減法,乘法,除法和賦值。 我只能像下面的例子一樣解決會話變量的問題。我使用自定義的會話,我嘗試用普通的PHP變量替換,並且我想在每次按下其中一個操作按鈕時更新它們。另外,應該保存輸入值以及輸出,以便能夠再次使用相同的值,而不需要將其重新輸入到表單中。

基本上,我想通過php變量(如「$ output」)替換所有會話變量,如「$ _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> 

什麼是最簡單的方法來解決這個問題?

+0

什麼是 「每次」。用F5鍵重新加載頁面? – alu 2014-10-31 00:48:36

+0

爲什麼不使用$ _POST變量從窗體中獲取值,處理它們然後輸出結果? – Chausser 2014-10-31 00:52:13

+0

另一個問題.. 是否有一種方法,以便輸出字段中的0.0真的是「0.0」(逗號)而不是「0」?我可以用%f強制它,但是當我這樣做的時候,如果我使用除法操作,我不能獲得更高的精度。 – byebb 2014-10-31 04:30:03

回答

0

一個簡單的解決方案將是使用$_POST變量:

通過

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

更換

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

然後通過$output變量在你的代碼替換$_SESSION['output']

0

這裏沒有會話相同的腳本,同時保持「會話」超時工作(只要你不關閉/刷新頁面)

<!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> 
0

如果是正常的用javascript(JQuery的)在你的解決方案中,我會避​​免使用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; 
} 

<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> 
+0

其實我真的試圖做到沒有javascript :-)但謝謝 – byebb 2014-10-31 04:20:50