【问题标题】:Cant run response无法运行响应
【发布时间】:2021-08-07 10:29:29
【问题描述】:

我有一个表单,我正在使用jquery.ajax 在后台运行PHP 代码。问题是当我收到脚本的响应时,我的Javascript 代码并不能很好地处理它。

如果我使用 if (status == "success") 它可以工作(但这不是处理此操作的正确方法),但如果我使用 if (response == "allok"),它不会工作并且提交表单停止工作。 (no messages in Console)

使用alertecho,我可以看到“response”的正确值,但由于某种原因,如果我在if 中使用此值,整个script 将停止运行。这是为什么呢?

HTML 代码:

<form id="form" class="registrazione" action="ajax/verifica.php" method="POST">
    <input type="text" id="username" name="username" class="username" placeholder="Nome utente..." autocomplete="off" autofocus>
    <input type="text" id="email" name="email" class="email" placeholder="Email..." autocomplete="off">
    <input type="password" id="password" name="password" class="password" placeholder="Password..." autocomplete="off">
    <input type="password" id="conferma_password" name="conferma_password" class="password" placeholder="Riscrivi la password..." autocomplete="off">
    <p id="risultato"></p>
    <input type="submit" id="form_button" name="form_button" class="form_button" value="Continua">
</form>

JS代码:

$(document).ready(function() {

  $("#form").submit(function(event) {

    event.preventDefault();
    var username=$("#username").val();
    var email=$("#email").val();
    var password=$("#password").val();
    var conferma_password=$("#conferma_password").val();
    var submit=$("#form_button").val();

    $.ajax({
      url: "ajax/verifica.php",
      method: "POST",
      data: {
        username: username,
        email: email,
        password: password,
        conferma_password: conferma_password,
        submit: submit
      },
      dataType: "text",
      success: function(response,status){
        if (response == "allok") {
          $("#risultato").html('Risposta='+risposta+' Status='+status);
          // alert('Account creato!');
        }
        if (status == "error") {
          alert("Ops! Si è verificato un errore interno momentaneo. Riprova più tardi, grazie.");
        }
      },
      error: function() {
        alert("Ops! Generic error.");
      }      
    })

  })

});

PHP 代码:

if (isset($_POST['submit'])) {

  $username=$_POST['username'];
  $email=$_POST['email'];
  $password=$_POST['password'];
  $conferma_password=$_POST['conferma_password'];

  $errorMessage=false;
  $errorUsername=false;
  $errorEmail=false;
  $errorPassword=false;
  $errorConfermaPassword=false;

  $username_regex="/^[a-z0-9._-]{2,35}$/i";
  $password_regex="/^(?=.*\d.*\d)[0-9A-Za-z!@#$%*]{8,}$/";

  if (empty($username)) {
    echo "Write a username.";
    $errorUsername=true;
    $errorMessage=true;
  }

  if (empty($email)) {
    echo "Write a email.";
    $errorEmail=true;
    $errorMessage=true;
  }

  if (empty($password)) {
    echo "Write a password.";
    $errorPassword=true;
    $errorMessage=true;
  }

  if (empty($conferma_password)) {
    echo "Password check again.";
    $errorConfermaPassword=true;
    $errorMessage=true;
  }

  if ($password!=$conferma_password) {
    echo "Password check.";
    $errorPassword=true;
    $errorMessage=true;
  }

  if (!preg_match($username_regex, $username)) {
    echo "Not a valid username.";
    $errorUsername=true;
    $errorMessage=true;
  }

  if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Not a valid email address.";
    $errorEmail=true;
    $errorMessage=true;
  }

  if (!preg_match($password_regex, $password)) {
    echo "Not a valid password.";
    $errorPassword=true;
    $errorMessage=true;
  }

  $query="SELECT id,nome,cognome FROM test WHERE username='$username'";
  $result=mysqli_query($connessione, $query);

  if ($result->num_rows > 0) {
    echo "Username not available.";
    $errorUsername=true;
    $errorMessage=true;
  }

  if ($errorMessage==false) {
    echo "allok";
  }

}
else {
  echo "Generic error.";
}

【问题讨论】:

  • 我已经使用了带有 json、html、text 的 dataType 但它不起作用。
  • 响应如何。也许您可以检查实际响应的内容。因此,console.log(响应)。
  • 您显示的代码没有明显问题,但我猜输出周围有空格(这就是为什么将输出编码为 JSON 然后在客户端解析它是好方法:除了允许更复杂的数据结构外,它还规范了空白)。
  • 旁注:在您的成功处理程序中,您将接收参数命名为response,但随后您尝试在.html() 中使用risposta
  • @El_Vanja 你是对的。发表这篇文章,我只是忘了把“risposta”翻译成“response”。

标签: php jquery ajax submit


【解决方案1】:

您只是在 AJAX 脚本中回显一个字符串。 它正在接收以下字符串之一:

  • 写一个用户名
  • 写一封电子邮件
  • 输入密码
  • (等你所有的回声)

这些都将直接返回到您的 AJAX 脚本的成功处理程序,但在该处理程序中您需要两个参数。这些将由您从 PHP 脚本回显的任何内容填充,在您的情况下是上述之一。

此外,在这种情况下,第二个参数是“状态”,如果 AJAX 调用被引导到“成功”处理程序,它应该总是“成功”。因此,您的“成功”处理程序中有关“错误”的 if 语句将永远无法到达。

您可能想在您的 PHP 文件中尝试以下操作:

$response = new StdClass;
$response->status = 'success';
$response->message = <any of the above statements>;

$response = json_encode($response);

echo $response;

然后在您的 AJAX 脚本中,您可以使用以下内容:

success: function(response){

              if (response.status == "allok") {
              $("#risultato").html('Risposta='+risposta+' Status='+status);
              //alert('Account creato!');
              }
              if (response.status == "error") {
              alert("Ops! Si è verificato un errore interno momentaneo. Riprova più tardi, grazie.");
              }

此外,我不鼓励在您的代码中使用除英语之外的任何其他语言。混合意大利语和英语变量名会使您的代码更难阅读。我在经验不足的程序员编写的代码中经常遇到这种情况。

【讨论】:

  • "...但是在那个处理程序中,您需要两个参数。这些将按照回显响应的顺序填充..." - 我不知道跟随。 status 由 AJAX 自动填充,它是 AJAX 状态的字符串表示形式。它不会填充脚本返回的任何信息。
  • @El_Vanja 你是对的,我的错。我会改变我的答案。
【解决方案2】:

对于未来的读者,PHP 文件中有一个 JS 代码,它会自动包含在响应字符串中。所以这就是问题所在。我修复了它,删除了 JS 代码并将其发布在正确的位置(例如在 HTML 代码中)。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2018-08-21
    • 2018-03-18
    • 2019-04-24
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    相关资源
    最近更新 更多