我有一个表单,我希望在同一页面上调用和显示计算功能。如果出现错误,则应显示在同一页面的span标记中。
这就是我现在所拥有的,而且我遇到了问题:
index.php [已更新] :
<?php
if (isset($_POST['submit'])) {
$bdmm = $_POST['bdmm'];
$sdmm = $_POST['sdmm'];
$strings = array(
$bdmm,
$sdmm,
$lgpm
);
if(!$bdmm){
$error = "Error";
exit();
}
elseif(!$sdmm){
$error = "Error";
exit();
}
//check whether the string is numeric
foreach ($string as $string) {
if (!preg_match("/^-?([0-9])+\.?([0-9])+$/", $string))
{
echo "Invalid entry. Please enter a number.";
}
}
$calc = new Calc();
if (isset($bdmm)) {
$calc->calculateMet($bdmm,$sdmm);
}
}
// Defining the "calc" class
class Calc {
private $vs = 0;
private $nob = 0;
private $tw = 0;
public function calculateMet($b,$s)
{
//code to calculate
//display nbnm in textbox
$nbnm = $nobr;
//display twkg in textbox
$tw = $nob * 25;
$twr = round($tw);
$twkg = $tw;
exit;
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Calculator</title>
<link rel="stylesheet" type="text/css" href="main.css" />
</head>
<body>
<!-- Begin Wrapper -->
<div id="wrapper">
<div id="column">
<form id="deps" name="deps" action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST">
<?php
if (isset($_REQUEST['error'])){
$err = $_REQUEST['error'];
?>
<div id="er"> <span class="er" > <?php echo $err; ?></span></div>
<?php } ?>
<table class="table">
<tr>
<td class="field head"> </td>
<td class="field cv"><label for="met">Metric</label></td>
<td class="field cv"><label for="eng">English</label></td>
</tr>
<tr>
<td class="field head"><label for="bd">Bore Dia.</label></td>
<td class="field"><input type="text" name="bdmm" id="bdmm" /><label for="bdmm">MM</label></td>
</tr>
<tr>
<td class="field head"><label for="sd">Screen Dia.</label></td>
<td class="field"><input type="text" name="sdmm" id="sdmm" /> <label for="sdmm">MM</label></td>
</tr>
<tr>
<td class="field head"><label for="nbn">No. of Bags needed</label></td>
<td class="field"><input type="text" name="nbnm" id="nbnm" value="<?php echo $nbnm; ?>" /></td>
</tr>
<tr>
<td class="field head"><label for="tw">Total Weight</label></td>
<td class="field"><input type="text" name="twkg" id="twkg" value="<?php echo $twkg; ?>" /> <label for="twkg">KG</label></td>
</tr>
</table>
<input type="submit" id="submit" value="Calculate" />
</form>
</div>
</div>
<!-- End Wrapper -->
</body>
</html>
我希望在表单中显示两件事:
1-如果出现错误,则应在span标记中显示错误 -
<?php
if (isset($_REQUEST['error'])){
$err = $_REQUEST['error'];
?>
<div id="er"> <span class="er" > <?php echo $err; ?></span></div>
<?php } ?>
我做了这个^,但即使文本框为空,它也不会抛出任何错误。
2-我想在表单中的文本框中显示计算结果:
<td class="field"><input type="text" name="nbnm" id="nbnm" value="<?php echo $nbnm; ?>" /></td>
<td class="field"><input type="text" name="twkg" id="twkg" value="<?php echo $twkg; ?>" />
^这会引发错误:Undefined variable nbnm and twkg
我哪里错了?
答案 0 :(得分:1)
您的代码存在一些问题。
首先,Calc
类中建立的变量不会被类声明之外的代码直接访问。您的代码<?php echo $twkg; ?>
因范围不起作用 - 变量twkg
在您输出HTML的全局范围内不存在。
您可以在Calc
课程中访问这些变量,但您已将其设为私有。如果这些变量保持私有(因此<?php echo $calc->getTwkg(); ?>
),则必须为这些变量创建一个getter方法,或者使它们公开并使用箭头运算符访问它们(因此<?php echo $calc->twkg; ?>
)。
至于错误消息,正如已经指出的那样,后处理代码需要在表单呈现代码之上,否则表单将在较低代码有机会确定是否存在错误之前呈现或不。其次,我不确定$_REQUEST['error']
的用途是什么:将$error
设置为false,检查错误,如果有错误,请将错误消息添加到其中。然后你的if看起来像这样:
if ($error !== false)
echo '<div id="er"><span class="er"> '.$error.'</span></div>';
以下是一些一般编辑...你在那里有很多令人困惑的东西,我不知道你在做什么,所以我只是把它放在一起提示的方式。我建议您使用更具描述性的变量名称:而不是$nob
和$bdmn
,使用$bore_diameter_minimum
- 这样就可以很容易地看到变量应包含的内容。
// Defining the "calc" class
class Calc {
private $vs = 0;
public $nob = 0; // note that this is public
private $tw = 0;
public function calculateMet($b,$s) {
// do your calculations here
$this->vs = $b * $s;
// use $this->vs, $this->nob to change the private variables declared above
if ($this->vs < $v)
return false;
// return true if the calculation worked
return true;
}
// use public getters to return variables that are private
public function getVs() {
return $this->vs;
}
}
$calc = new Calc();
$error = false;
if (isset($_POST['submit'])) {
$bdmm = isset($_POST['bdmm']) ? $_POST['bdmm'] : false;
$sdmm = isset($_POST['sdmm']) ? $_POST['sdmm'] : false;
if(
$bdmm == false ||
strlen($bdmm) < 1 ||
preg_match("/^-?([0-9])+\.?([0-9])+$/", $bdmm) == false
){
$error = "Invalid Bore Dia.";
}
if(
$sdmm == false ||
strlen($sdmm) < 1 ||
preg_match("/^-?([0-9])+\.?([0-9])+$/", $bdmm) == false
){
$error = "Invalid Screen Dia.";
}
if ($error !== false) {
$result = $calc->calculateMet($bdmm,$sdmm);
if ($result === false)
$error = 'Calculation failed';
}
}
// output an error message
if ($error !== false)
echo '<div class="error">'.$error.'</div>';
echo 'Private test: '.$calc->getVs();
echo 'Public test: '.$calc->nob;
答案 1 :(得分:0)
你需要在页面顶部移动php代码,因为你在创建变量之前就是在访问它们。
答案 2 :(得分:0)
您需要以某种方式将$ error放入$ _REQUEST(因为您尝试从那里获取它并且它不会自动存在)。您应该使用$ _SESSION ['error']而不是$ error =“Error!” if(isset($ _ SESSION ['error'])){而不是if(isset($ _ REQUEST ['error'])){。
将所有代码从底部移到顶部。我没有仔细研究过代码,但似乎脚本没有机会在变量设置之前设置它们。