【问题标题】:HTML form PHP post to self to validate or submit to new pageHTML 表单 PHP 发布到自己以验证或提交到新页面
【发布时间】:2013-09-20 03:07:54
【问题描述】:

先道歉。今天是我使用 php 的第一天,我终于想出了如何让我的页面发回给自己(我的页面是 .html,而不是 .php),但现在我无法弄清楚如何在验证表单后将数据带到新页面。我已经为此工作了很长一段时间,而且我很生气。这是一个简单的例子:

<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>

<?php
// Initialize variables and set to empty strings
$firstName=$lastName="";
$firstNameErr=$lastNameErr="";

// Validate input and sanitize
if ($_SERVER['REQUEST_METHOD']== "POST") {
   if (empty($_POST["firstName"])) {
      $firstNameErr = "First name is required";
   }
   else {
      $firstName = test_input($_POST["firstName"]);
   }
   if (empty($_POST["lastName"])) {
      $lastNameErr = "Last name is required";
   }
   else {
      $lastName = test_input($_POST["lastName"]);
   }
}

// Sanitize data
function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>

<h2>Find Customer</h2>
<p><span class="error">* required</span></p>
<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
First Name: <input type="text" name="firstName" value="<?php echo $firstName; ?>"><span class="error">* <?php echo $firstNameErr; ?></span><br><br>
Last Name: <input type="text" name="lastName" value="<?php echo $lastName; ?>"><span class="error">* <?php echo $lastNameErr; ?><br><br>
<input type="submit">
</form>

</body>
</html>

好的。所以在上面,您会看到表单回发给自己,以便它可以验证。好的。现在,考虑到所有事情都是有效的,我如何发布到另一个脚本(action="otherAction.php",也许?)以便实际处理数据?

此外,我们感谢任何安全建议。我尽力考虑到安全性。谢谢。

【问题讨论】:

    标签: php html forms


    【解决方案1】:

    满足所有条件后,您可以使用header('Location: http:mywebsite.com/otherAction.php')

    // Validate input and sanitize
    if ($_SERVER['REQUEST_METHOD']== "POST") {
       $valid = true; //Your indicator for your condition, actually it depends on what you need. I am just used to this method.
    
       if (empty($_POST["firstName"])) {
          $firstNameErr = "First name is required";
          $valid = false; //false
       }
       else {
          $firstName = test_input($_POST["firstName"]);
       }
       if (empty($_POST["lastName"])) {
          $lastNameErr = "Last name is required";
          $valid = false;
       }
       else {
          $lastName = test_input($_POST["lastName"]);
       }
    
      //if valid then redirect
      if($valid){
       header('Location: http://mywebsite.com/otherAction.php');
       exit();
      }
    }
    

    在我的一些作品中,我的设置是这样的,但我在这里学到了一些不好的东西。那是当您在提交表单后刷新页面时,POST 值仍然存在并且可能用于重复条目。这不是好的 IMO。

    【讨论】:

    • 请注意,出于安全原因,您应该在重定向后立即使用exit()
    • 嗨@invisal,你介意分享一些链接吗?所以我可以更多地了解它。谢谢!
    • @DrixsonOseña 这个header('Location: http:mywebsite.com/otherAction.php') 应该是header('Location: http://mywebsite.com/otherAction.php'); - 你错过了// 并以分号结尾。最好把它放在那里。
    • @Jaikrat 你在重定向时丢失了 $_POST .. 有两种方法可以解决这个问题.. 1.) 将 id 存储在 cookie 中或 2.) 使用 $_GET 在 URL 中添加查询字符串,例如 @ 987654328@
    【解决方案2】:

    使用 javascript 进行验证,然后将 post 表单发送到它自己或另一个可以处理数据的页面。

    <!DOCTYPE html>
    <html>
    <head>
    <script>
    function validateForm()
    {
    var x=document.forms["myForm"]["fname"].value;
    if (x==null || x=="")
      {
      alert("First name must be filled out");
      return false;
      }
    }
    </script>
    </head>
    
    <body>
    <form name="myForm" action="demo_form.php" onsubmit="return validateForm()" method="post">
    First name: <input type="text" name="fname">
    <input type="submit" value="Submit">
    </form>
    </body>
    
    </html>
    

    来源:http://www.w3schools.com/js/js_form_validation.asp

    <!DOCTYPE HTML>
    <html>
    <head>
    <style>
    .error {color: #FF0000;}
    </style>
    </head>
    <body>
    
    <?php
    // Initialize variables and set to empty strings
    $firstName=$lastName="";
    $firstNameErr=$lastNameErr="";
    
    // Control variables
    $app_state = "empty";  //empty, processed, logged in
    $valid = 0;
    
    // Validate input and sanitize
    if ($_SERVER['REQUEST_METHOD']== "POST") {
       if (empty($_POST["firstName"])) {
          $firstNameErr = "First name is required";
       }
       else {
          $firstName = test_input($_POST["firstName"]);
          $valid++;
       }
       if (empty($_POST["lastName"])) {
          $lastNameErr = "Last name is required";
       }
       else {
          $lastName = test_input($_POST["lastName"]);
          $valid++;
       }
    
       if ($valid >= 2) {
          $app_state = "processed";
       }
    }
    
    // Sanitize data
    function test_input($data) {
       $data = trim($data);
       $data = stripslashes($data);
       $data = htmlspecialchars($data);
       return $data;
    }
    
    if ($app_state == "empty") {
    ?>
    <h2>Find Customer</h2>
    <p><span class="error">* required</span></p>
    <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>" method="post">
    First Name: <input type="text" name="firstName" value="<?php echo $firstName; ?>"><span class="error">* <?php echo $firstNameErr; ?></span><br><br>
    Last Name: <input type="text" name="lastName" value="<?php echo $lastName; ?>"><span class="error">* <?php echo $lastNameErr; ?><br><br>
    <input type="submit">
    </form>
    
    </body>
    </html>
    <?php
    }
    elseif ($app_state == "processed") {
        if ($firstName == "Vincent") {
            $app_state = "Logged in";
        }
    }
    
    if ($app_state == "Logged in") {
        echo("Logged in<br> Hello Vincent</body></html>");
    }
    ?>
    

    【讨论】:

    • 所以我应该只用 javascript 而不是 php 来验证表单数据?
    • 这样更好,如果用户的输入有问题,用户不必重新加载页面。您仍然可以在表单登录页面上进行额外的 php 验证/清理。
    • 好的。我从 w3 link 获得了大部分内容,所以也许我对用法感到困惑?如果表单需要在提交之前进行验证 - 例如,到数据库进行查询或插入 - 应该使用 javascript,因为额外的 php 操作/方向是无效/不正确/多余的?只是想了解。
    • @vincent,Javascript 是一个不错的功能,但它只是可选的。 PHP 是必须的,因为它是你抵御糟糕数据的最后一道防线。通常,可以禁用 Javascript。人们可以轻松绕过 Javascript 验证。
    • 不需要重定向,所有逻辑都可以在登陆的php页面上进行。
    【解决方案3】:

    您可以检查是否有无效数据,如果没有无效数据,则处理,然后重定向。例如

     if (empty($firstNameErr) && empty($lastNameErr)) {
           // process the data
    
           // redirect to other page.
           header('LOCATION: index.php');
           exit();
     }
    

    请注意,您需要在输出任何 HTML 之前执行这些代码,否则您无法执行重定向。例如:

    <?php
          // validate the data
          // no error, proccess, then, redirect
    ?>
    html code here.
    

    【讨论】:

    • 这应该在我其余的 if/else 处理之下,对吧?这是一种更有效的做事方式,因为不必实例化新变量吗? (假设性能提升可以忽略不计)@Drixson 的答案还有其他好处吗?
    • @vincent,Drixson 的回答和我的回答基本上是使用相同的概念,但方法略有不同。通常,如果要验证的字段很多,Drixson 的答案会更快。由于只有两个字段,因此性能差异太小以至于没有什么不同。 (即使有很多场,性能差异仍然太小)
    • @vincent,但是,您应该在标头重定向之后添加exit();,因为标头重定向只是将标头发送到用户的浏览器以请求重定向。恶意用户可以忽略重定向请求。
    • 感谢您的解释 - 这是有道理的。此外,我添加了“退出;”,根据您链接的页面。感谢您就开放安全漏洞提供建议。
    【解决方案4】:

    如果您对这些东西感兴趣,那么依赖这样的重定向对 SEO 不利。 对 SEO 来说,您的表单自然发布到另一个页面会更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-11
      • 2014-10-04
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2014-03-10
      • 2023-03-07
      相关资源
      最近更新 更多