【问题标题】:Why the zero value still can submit even I already add some display error message there?为什么即使我已经在那里添加了一些显示错误消息,零值仍然可以提交?
【发布时间】:2016-08-18 02:07:47
【问题描述】:

这是我的代码。我已经在 PHP 代码中设置了显示错误消息。但是当所有元素为空时,显示错误消息似乎不起作用。它可以提交数据库中的空值。

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

<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}

if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
}

if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
}

if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}

if (empty($_POST["gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
}
}

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


<p><span class="error">* required field.</span></p>
<form method="post" action="add.php<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
Name: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail: <input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
Website: <input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">  
</form>

</body>
</html>

这是我的表单操作代码 add.php

<?php

mysql_connect("localhost","root","") or die("Cannot connect");
mysql_select_db("testingdb");


$name= $_POST['name'];
$email = $_POST['email'];
$website =$_POST['website'];
$comment=$_POST['comment'];
$gender=$_POST['gender'];

$result=mysql_query("INSERT INTO information (name , email, website, comment, gender) VALUES ('$name' , '$email' , '$website' , '$comment' , '$gender')");


if($result){
echo ("<SCRIPT LANGUAGE='JavaScript'>
window.alert('SUCCESSFULLY ADD!') 
</SCRIPT>");
}
else {
    echo ("<SCRIPT LANGUAGE='JavaScript'>
window.alert('FAILED TO ADD!')
</SCRIPT>");
}

?>

【问题讨论】:

  • 您需要验证add.php中的请求数据。 (您的其他 PHP 验证发生在 浏览器甚至接收到 HTML 之前,因此不会验证用户输入的内容。)
  • 您的问题是您在错误的位置验证表单。看我的回答。

标签: javascript php mysql css forms


【解决方案1】:

即使您向其添加自定义错误消息,也不会阻止提交表单。 HTML 不够先进,无法识别您添加的错误消息,因此表单将正常提交。

【讨论】:

    【解决方案2】:

    您正在测试$result 是否为真。如果是,则显示成功消息。

    是什么让您相信空值会将$result 设置为错误值?您是否希望数据库返回 false 值?

    如果要避免传递空值,您需要在传递它们之前在传递它们之前添加更多验证。

    【讨论】:

      【解决方案3】:

      好吧,您永远不会验证您的表单,因为您的表单将提交给add.php,而不是包含它自己的验证规则的页面。所以下面显示了你应该做什么:

      <?php
      // define variables and set to empty values
      $nameErr = $emailErr = $genderErr = $websiteErr = "";
      $name = $email = $gender = $comment = $website = "";
      $error=false; // set error state to false
      
      //if its a post request
      if ($_SERVER["REQUEST_METHOD"] == "POST") {
      
          function test_input($data) {
              $data = trim($data);
              $data = stripslashes($data);
              $data = htmlspecialchars($data);
              return $data;
          }
      
      
          //validation rules
          if (empty($_POST["name"])) {
              $error=true;
              $nameErr = "Name is required";
          } else {
              $name = test_input($_POST["name"]);
          }
      
          if (empty($_POST["email"])) {
              $error=true;
              $emailErr = "Email is required";
          } else {
              $email = test_input($_POST["email"]);
          }
      
          if (empty($_POST["website"])) {
              $website = "";
          } else {
              $website = test_input($_POST["website"]);
          }
      
          if (empty($_POST["comment"])) {
              $comment = "";
          } else {
              $comment = test_input($_POST["comment"]);
          }
      
          if (empty($_POST["gender"])) {
              $error=true;
              $genderErr = "Gender is required";
          } else {
              $gender = test_input($_POST["gender"]);
          }
      
          //eof of validation rules
      
      
          //if there is no errors
          if(!$error){
              // connect to database and do your stuffs
              mysql_connect("localhost","root","") or die("Cannot connect");
              mysql_select_db("testingdb");
      
      
              $name= $_POST['name'];
              $email = $_POST['email'];
              $website =$_POST['website'];
              $comment=$_POST['comment'];
              $gender=$_POST['gender'];
      
              $result=mysql_query("INSERT INTO information (name , email, website,comment, gender) VALUES ('$name' , '$email' , '$website' , '$comment' , '$gender')");
      
      
              if($result){
                  echo ("<SCRIPT LANGUAGE='JavaScript'>window.alert('SUCCESSFULLY ADD!')</SCRIPT>");
              }
              else {
                  echo ("<SCRIPT LANGUAGE='JavaScript'>window.alert('FAILED TO ADD!')</SCRIPT>");
              }
          }else{  
          //show the forms with errors 
      ?>
      <!DOCTYPE HTML>  
      <html>
          <head>
              <style>
                  .error {color: #FF0000;}
              </style>
          </head>
          <body> 
              <p><span class="error">* required field.</span></p>
              <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
              Name: <input type="text" name="name">
              <span class="error">* <?php echo $nameErr;?></span>
              <br><br>
              E-mail: <input type="text" name="email">
              <span class="error">* <?php echo $emailErr;?></span>
              <br><br>
              Website: <input type="text" name="website">
              <span class="error"><?php echo $websiteErr;?></span>
              <br><br>
              Comment: <textarea name="comment" rows="5" cols="40"></textarea>
              <br><br>
              Gender:
              <input type="radio" name="gender" value="female">Female
              <input type="radio" name="gender" value="male">Male
              <span class="error">* <?php echo $genderErr;?></span>
              <br><br>
              <input type="submit" name="submit" value="Submit">  
          </form>
      
      </body>
      </html>
      <?php
          }
      }
      ?>
      

      【讨论】:

      • 缺少一些大括号。
      • 你使用什么框架?我使用 Adboe dreamweaver,它说那里出错了
      • 好的。我已经复制了。错误消息正在运行,但是,如果我想提交(在元素中获取值),则会出现错误。就这个。致命错误:在第 11 行调用 C:\xampp\htdocs\SPKPKG\testfile\test2.php 中未定义的函数 test_input()
      • 答案应该有解释。
      • 好吧 @WilsonEntering 错误很明显,它说函数 test_input 尚未定义,所以将函数 test_input 粘贴到验证的顶部,就像我所做的那样..
      【解决方案4】:

      您尝试插入数据的方式存在许多问题,但我相信您没有 any 输出的原因是因为标准 mysql 命令自 PHP 5.5 起已弃用,自 PHP 7.0 起删除。相反,您应该使用 MySQLi,或者最好使用 PDO。您需要重新构建代码以使用其中任何一个,我建议您先阅读一下它们。

      http://php.net/manual/en/mysqli.query.phphttp://php.net/manual/en/class.pdo.php 以获取有关如何使用它们的进一步说明。 PDO 更安全,但更难学习,而且并非所有网络主机都支持它 - 请务必咨询您的主机提供商!

      两种方法都大力推动的一件事是准备好的查询。如果不使用准备好的查询,您将容易受到 SQL 注入的攻击。准备好的查询绑定了正在传递的参数,因此它们不能被操纵。

      这是一个 MySQLi 准备好的语句示例:

       if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password) VALUES (?, ?, ?)")) {
           $insert_stmt->bind_param('sss', $username, $email, $password);
           if (!$insert_stmt->execute()) {
               // Insert failed
           }
           // Insert was successful
       }
      

      【讨论】:

      • 有人能准确解释为什么我的回答被否决了吗?我相信我的回答会有所帮助,并且与手头的问题有关。如果不是,请告诉我为什么?
      • 我不懂 PDO 语法。还不是专家。嗯
      • 这不是 PDO @WilsonEntering,使用过时的函数/代码只会伤害你的未来。应使用准备好的语句。我认为这个答案被否决了,因为它没有解决 OP 询问的验证问题(尽管应该解决 SQL 注入问题)。
      • 因为你描述的问题与问题无关,用户不想知道mysqli
      • @ASK - 提问者表示他们没有从使用 MySQL 命令的查询中获得任何输出。我说这可能是由于 MySQL 命令自 5.5 以来已被弃用并自 7.0 以来已被删除。如果他们使用的是 PHP 7,则不会有任何输出。我的回答为提问者的问题存在提供了一个直接的可能原因。请向我解释这怎么不相关?另外,如果你能告诉我提问者在哪里明确表示他们对 MySQLi 不利?
      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2020-03-16
      相关资源
      最近更新 更多