【问题标题】:Server Side Validation Show Success or Error message inline服务器端验证内联显示成功或错误消息
【发布时间】:2017-10-27 20:26:49
【问题描述】:

我为我的班级建立了一个表格(仅限私人访问),每个人都提交一个包含一些信息的表格。课程全名、主题、教师列表的选择选项和可用教室的复选框等信息。有些人可能喜欢大房间或小房间以及可供学习的配件。我努力在 bootstrap 和 php 中设计和构建表单。表单看起来没问题,并且验证是内联的,直到我需要在其中包含更多功能。每次我提交表单时,它都会被加载。我的意思是,该表单适用于 php 和 html 验证,但每次我单击提交时都会加载整个页面。我用谷歌搜索,知道这个目标应该由 Ajax 来实现。我在这里观看了 youtube 视频并关注了其他问题,但一无所获。内联验证或在同一页面上显示成功消息仍然不起作用。我想要的是当用户提交表单时,它将在同一页面上显示警报成功消息而不刷新,或者如果服务器端验证有任何错误,则内联错误消息。可在 Internet 上轻松获取代码。

html:

<?php 
    include('ajaxreturn.php');
    ?>
    <!DOCTYPE html>
    <html lang="en">
      <head>

        <title>Hello, world!</title>
        <!-- Required meta tags -->
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        <!-- Bootstrap CSS -->
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">

      <body>


         <form id="submit" onsubmit="submitForm(); return false;">
              <div class="row">
         <div class="col-md-12">
              <div class="form-group">
              <label class="form-control-label" for="Name">Name</label>
              <input class="form-control" id="name" type="text" name="name" value= "<?php if (isset($_POST["name"])) echo htmlspecialchars($_POST["name"]) ?>">
              <span class="text-danger"><?php echo $name_error;?></span>
                  </div>
                  </div>
                  </div>

                  <div class="row">
                    <div class="col-md-12">
                  <div class="form-group">
              <label class="form-control-label" for="subject">Subject</label>
              <input class="form-control form-control" type="text" name="subject" id="subject" value= "<?php if (isset($_POST["subject"])) echo htmlspecialchars($_POST["subject"]) ?>">
              <span class="text-danger"><?php echo $subject_error;?></span>
                  </div>
                      </div>
                  </div>

                  <div class="row">
                  <div class="col-md-12">
                  <div class="form-group">
                  <label for="Category">Category</label>
                  <select class="form-control pt-0 pb-0" id="category">
                    <option>...</option>
                    ?>
                  </select>
                </div>
                </div>
          </div>
          <div class="row">
                <div class="form-check pl-3 pt-1">
                  <label class="form-check-label">
                    <input name="classroom" id="classroom" class="form-check-input" type="checkbox" <?php if (isset($classroom) && $classroom=="classroom") echo "checked";?> value="classroom">
                    L-1
                  </label>
                </div>
                <span class="text-danger pl-3 pt-0"><?php echo $classroom_error;?></span>

                </div> 
                div class="row">
                <div class="form-check pl-3 pt-1">
                  <label class="form-check-label">
                    <input name="classroom" id="classroom" class="form-check-input" type="checkbox" <?php if (isset($classroom) && $classroom=="classroom") echo "checked";?> value="classroom">
                    L-2
                  </label>
                </div>
                <span class="text-danger pl-3 pt-0"><?php echo $classrooms_error;?></span>

                </div> 
          <div class="row">
            <button id="submit" name="submit" value="submit" type="submit" class="btn btn-success">submit</button>
<span class="text-danger"> Wrong!</span>
<span class="text-success"> Thanks!</span>
          </div>
          </form>


        <!-- Optional JavaScript -->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
        <!-- jQuery first, then Popper.js, then Bootstrap JS -->
        <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
        <!-- <script src="main.js"></script> -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>

      </body>
    </html>

php:

<?php

// Form Variables 
$name = "";
$subject = "";
$category = "";
$classroom="";

//Error Variables
$name_error ="";
$subject_error = "";
$category_error = "";
$classroom_error = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["name"])) {
    $name_error = "Your Name";
  } else {
    $name = validation($_POST["name"]);
    // Function calling and checking the letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
      $name_error = "Your name must contain Letters, Numbers and Spaces"; 
    }
  }

  if (empty($_POST["subject"])) {
    $subject_error = "Your Subject";
  } else {
    $website = validation($_POST["subject"]);
    // Function calling and checking the letters and whitespace
    if ((!preg_match("/^[a-zA-Z ]*$]/", $subject)) {
      $subject_error = "Subjets must contain Letters, Numbers and Spaces";
    }
  }

  if (empty($_POST["category"])) {
    $category_error = "Please select categoy";
  } else {
    $category = validation($_POST["category"]);
  }

  if (empty($_POST["classroom"])) {
    $classroom_error = "Select the Class Room";
  } else {
    $classroom = validation($_POST["classroom"]);
  }
}




function validation($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}

?>

阿贾克斯:

<script>
  function _(id){ return document.getElementById(id); }
  function submitForm(){
  _("submit").disabled = true;
  _("status").innerHTML = 'please wait ...';
  var formdata = new FormData();
  formdata.append( "name", _("name").value );
  formdata.append( "subject", _("subject").value );
  formdata.append( "category", _("category").value );
  formdata.append( "classroom", _("classroom").value );
  var ajax = new XMLHttpRequest();
  ajax.open( "POST", "ajaxreturn.php" );
  ajax.onreadystatechange = function() {
    if(ajax.readyState == 4 && ajax.status == 200) {
      if(ajax.responseText == "success"){
        _("submit").innerHTML = '<h2>Thanks '+_("name").value+', your message has been sent.</h2>';
      } else {
        _("status").innerHTML = ajax.responseText;
        _("submit").disabled = false;
      }
    }
  }
  ajax.send( formdata );
}
</script>

错误:

ajaxform.php?name=&website=&submit=submit:78 Uncaught TypeError: Cannot read property 'value' of null
    at submitForm (ajaxform.php?name=&website=&submit=submit:78)
    at HTMLButtonElement.onclick (ajaxform.php?name=&website=&submit=submit:58)
submitForm @ ajaxform.php?name=&website=&submit=submit:78
onclick @ ajaxform.php?name=&website=&submit=submit:58

ajaxform.php?name=&website=&submit=submit:78 
formdata.append( "category", _("category").value );

onclick @ ajaxform.php?name=&website=&submit=submit:58
        <button name="submit" id="submit" onclick="submitForm()" value="submit" type="submit" class="btn btn-success">submit</button>

带有选择选项标签的类别

   <option value=1>1</option>
<option value=1>1</option>
<option value=1>1</option><option value=1>1</option>

【问题讨论】:

  • 它没有读取类别值,您的
  • 我应该用 标签定义每个类别。我包括来自 php 服务器端的类别。我的意思是教室可以改变它不会在 html 中硬编码。
  • 去掉按钮上的 type="submit"。
  • 在html中定义每个类别时出现同样的错误..
  • 看起来完全一样的错误,你没有正确编辑吗?

标签: javascript php jquery html ajax


【解决方案1】:

试着把里面的ajax改成这个。

if (this.status == 200 && this.readyState == 4) {
   this.responseText;

上面的其余代码看起来是正确的。我从来没有见过 xmlhttprequest 里面有一个变量名,通常看起来像

var xhr1 = new XMLHttpRequest();
xhr1.open('POST', "ajaxreturn.php", true);
xhr1.onreadystatechange = function() {
    if (this.status == 200 && this.readyState == 4) {
        console.log(this.responseText);
        dostuff = this.responseText;
  };//end onreadystate
 xhr1.send();

我不知道足够的 php 来查看您的服务器端验证。我使用 NodeJs 来完成所有这些。您是否控制台记录了您的 this.responseText 以查看您的服务器发回的变量。也没有你的提交按钮提交,这也是你的问题,让它运行 onSubmit 函数。所以...

<button id="submit" name="submit" onclick="submitForm()" class="btn btn-success">submit</button>

并从您的表单标签中删除 onSubmit。我相信这会解决您的问题。

当您提交表单时,这就是打开一个新页面的内容,当您只是使用 ajax 运行该功能时,不会使浏览器打开一个新页面。它只是在后台发生。

【讨论】:

  • 不,它不能正常工作。我尝试使用带有关闭表单标签的 Onsubmit 也尝试了你刚刚定义的其他变量,之前也是一样的。无论如何谢谢你。
  • 控制台日志对 this.responseText 说了什么?
  • "Uncaught ReferenceError: OnSubmit is not ajaxform.php" 实际上它显示了一秒钟就消失了。我试图通过多次点击提交按钮来阅读它,但这是我能用不到一秒钟的时间阅读的最好的。它也只是说谢谢!那是我的状态

    谢谢

  • 它必须是附加到按钮的函数 submitForm(),因为这是您在脚本中定义的函数。然后它应该可以工作了,它引用了一个未知的函数。
  • 我编辑我的问题以显示错误和错误行。
猜你喜欢
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多