首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP + MySQL + AJAX 實現線上科學計算器:利用 MySQL 直接計算運算式

     編輯:PHP 綜合知識

核心創意

發現 MySQL 可直接計算字串運算式 (SELECT 1+2*3),避開 PHP 複雜解析器實作,支援數學函數、三角函數、對數指數等高級運算。

架構圖解


前端 (jQuery AJAX) 
    → 後端 PHP (jsq1.php) 
        → MySQL (SELECT 運算式) 
            → 返回結果 → 前端顯示

後端核心代碼 (jsq1.php)

<?php
$db = mysql_connect("localhost", "root", "123");
header("Content-Type: text/html; charset=GB2312");

$str = iconv('utf-8', 'gbk', trim($_POST['t_ask']));
$str = str_replace([" ", "\r\n", "(", ")"], ["", "", "(", ")"], $str);

// 三角函數轉換:MySQL 使用弧度,前端輸入角度
$str = preg_replace("/sin\((.*)\)/is", "sin(\${1}*pi()/180)", $str);
$str = preg_replace("/cos\((.*)\)/is", "cos(\${1}*pi()/180)", $str);
$str = preg_replace("/tan\((.*)\)/is", "tan(\${1}*pi()/180)", $str);
$str = preg_replace("/cot\((.*)\)/is", "1/tan(\${1}*pi()/180)", $str);
$str = preg_replace("/asin\((.*)\)/is", "asin(\${1})*180/pi()", $str);
$str = preg_replace("/acos\((.*)\)/is", "acos(\${1})*180/pi()", $str);
$str = preg_replace("/atan\((.*)\)/is", "atan(\${1})*180/pi()", $str);

$sql = "SELECT " . $str;
$res = mysql_query($sql, $db) or die('運算式錯誤');
$rs = mysql_fetch_array($res);
echo $rs[0];
?>

前端頁面 (jsq.php)

<html>
<head>
<title>手寫輸入計算器</title>
<script src="jquery.js"></script>
<script>
$(function(){
    $("#t_ask").keyup(function(){
        $.post("jsq1.php", { t_ask: $("#t_ask").val() }, function(data){
            $("#res").html(data);
        });
    });
});
</script>
</head>
<body>
<h2>手寫輸入計算器</h2>
<textarea id="t_ask" cols="60" rows="6"></textarea>
<div id="res" style="font-size:24px; color:#006600;"></div>
<table>
<tr><td>支援函數:</td></tr>
<tr><td>sin/cos/tan/cot (角度)</td></tr>
<tr><td>asin/acos/atan (返回角度)</td></tr>
<tr><td>abs/ceil/floor/round</td></tr>
<tr><td>exp/log/pow/sqrt</td></tr>
<tr><td>pi()/rand()</td></tr>
</table>
</body>
</html>

支援的 MySQL 數學函數

分類函數範例
三角SIN, COS, TAN, COT, ASIN, ACOS, ATANSIN(PI()/2)=1
絕對/取整ABS, CEIL, FLOOR, ROUNDCEIL(1.1)=2
指數對數EXP, LOG, LOG10, LOG2, POW, SQRTPOW(2,10)=1024
常數PI()PI()=3.14159...
其他RAND, SIGN, MOD, DEGREES, RADIANSDEGREES(PI())=180

安全與擴展建議

  • SQL 注入風險:直接拼接運算式極度危險!生產環境必須:
    • 建立運算式白名單解析器 (Shunting-yard 算法)
    • 或用 eval() 但嚴格過濾字符白名單
    • 或引入專用數學解析庫 (如 evalmath)
  • 改用 PDO 預處理 (雖然此場景難預處理運算式本身)
  • 前端加入按鈕面板、歷史記錄、鍵盤快捷鍵
  • 支援變數儲存 (M+/M-/MR/MC)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved