在同一页面的表单中提交并显示结果

时间:2011-11-01 18:29:14

标签: php

我有一个表单,我希望在同一页面上调用和显示计算功能。如果出现错误,则应显示在同一页面的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" >&nbsp;<?php echo $err; ?></span></div>  
                <?php  } ?>
                <table class="table">
                    <tr>
                        <td class="field head">&nbsp;</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" >&nbsp;<?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

我哪里错了?

3 个答案:

答案 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">&nbsp;'.$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)

  1. 您需要以某种方式将$ error放入$ _REQUEST(因为您尝试从那里获取它并且它不会自动存在)。您应该使用$ _SESSION ['error']而不是$ error =“Error!” if(isset($ _ SESSION ['error'])){而不是if(isset($ _ REQUEST ['error'])){。

  2. 将所有代码从底部移到顶部。我没有仔细研究过代码,但似乎脚本没有机会在变量设置之前设置它们。