【问题标题】:AJAX request always return falseAJAX 请求总是返回 false
【发布时间】:2017-05-15 13:51:23
【问题描述】:

实际上,我正在用一些 AJAX 做一个简单的 php 表单。 我试图自己解决错误,但无法弄清楚我缺少什么。

结果总是假的,数据库中也没有记录

形式:

<form id="signUpForm" action="" method="POST"></div>
  <div><input type="text" name="lastname" placeholder="lastname"></div>
  <div><input type="text" name="firstname" placeholder="firstname"></div>
  <div><input type="text" name="pseudoUp" placeholder="pseudo"></div>
  <div><input type="password" name="passwordUp" placeholder="password"></div>
  <div><input type="submit" name="signUpForm" value="signup"></div>
  <div class="signUpMsg"></div>
</form>

php 脚本:

config.php:

<?php

session_start();

  define('MYSQL_HOST', 'localhost');
  define('MYSQL_USER', ' ');
  define('MYSQL_PASSWD', ' ');
  define('MYSQL_DB', 'php');

  try {
    $PDO = new PDO('mysql:host=' . MYSQL_HOST . ';dbname=' . MYSQL_DB, MYSQL_USER, MYSQL_PASSWD);
    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
  } catch (PDOException $e) {
    $e->getMessage();
  }

?>

signUp.php:

<?php

  require_once 'config.php';

  if($_POST["lastname"] != "" && $_POST["firstname"] != "" && $_POST["pseudo"] != ""  && $_POST["password"] != ""){
    $req = $PDO->prepare("INSERT INTO users (lastname, firstname, pseudo, password) VALUES(:lastname, :firstname, :pseudo, :password)");
    $req->bindValue(':lastname', $_POST["lastname"]);
    $req->bindValue(':firstname', $_POST["firstname"]);
    $req->bindValue(':pseudo', $_POST["pseudo"]);
    $req->bindValue(':password', sha1($_POST["password"]));
    if ($req->execute()){
      echo 1;
    }else{
      echo 2;
    }
  }

?>

最后是 AJAX:

$(function(){
  $('#signUpForm').on('submit', function(e){
    e.preventDefault();

    // Undo mistake, thank to @apokryfos
    data = {
        lastname : $("input[name='lastname']").val(),
        firstname : $("input[name='firstname']").val(),
        pseudo : $("input[name='pseudo']").val(),
        password : $("input[name='password']").val(),
    }

    $.ajax({
      method : "POST",
      url : "php/signUp.php",
      data : data,
      success : function(res){
        if(res == 1){
          $('.signUpMsg').html('Sign up done !');
        }else{
          $('.signUpMsg').html('Sign up fail');
        }
      }
    })
  })
})

感谢阅读!

编辑:

错误来自获取数据的错误方法(输入中没有 id,同时在 AJAX 中检查输入 id)和同一页面中的输入名称冲突。此外,我将 signIn.php 中的“echo true/false”更改为 Apokryfos 提到的“echo 1/2”。

感谢您的帮助!!

【问题讨论】:

  • 数据库用户名是否为空
  • 你不应该滚动你自己的密码散列。这是一篇关于为什么sha*-functions 不适合密码哈希的好文章:security.stackexchange.com/questions/88951/…。使用密码时,您真的应该使用password_hash()password_verify()
  • 除此之外,您是否检查过错误日志是否有任何错误?
  • 1) 检查控制台 2) 在页面顶部使用 error_reporting(E_ALL); ini_set('display_errors', 1); 3) 在使用前打印发布的数据 4) 允许查询错误(不是 echo true; / echo false;)然后我们会有更多需要处理的信息
  • 提交后所有行都为空,日志看起来很干净。此外,我尝试在 PHP 中执行请求并且它有效。我将尝试使用 password_hash() 并告诉你结果。

标签: php jquery ajax


【解决方案1】:

您以错误的方式构建您的帖子数据,#something 表示具有 id something 的 DOM 元素。需要使用输入name属性:

data = {
  lastname : $("input[name='lastname']").val(),
  firstname : $("input[name='firstname']").val(),
  pseudo : $("input[name='pseudo']").val(),
  password : $("input[name='password']").val(),
}

我还会提出一些额外的建议。使用 HTTP 代码而不是返回一个数字(这就是代码的用途,并且它们被普遍理解):

if($_POST["lastname"] != "" && $_POST["firstname"] != "" && $_POST["pseudo"] != ""  && $_POST["password"] != ""){
    $req = $PDO->prepare("INSERT INTO users (lastname, firstname, pseudo, password) VALUES(:lastname, :firstname, :pseudo, :password)");
    $req->bindValue(':lastname', $_POST["lastname"]);
    $req->bindValue(':firstname', $_POST["firstname"]);
    $req->bindValue(':pseudo', $_POST["pseudo"]);
    $req->bindValue(':password', sha1($_POST["password"]));
    if ($req->execute()){
      echo 1;
    }else{
      http_response_code(500); //server error
      echo 2;
    }
  }
  http_response_code(400); //Client error (didn't send the correct fields)

还有 JavaScript

$.ajax({
  method : "POST",
  url : "php/signUp.php",
  data : data,
  success : function(res){
      $('.signUpMsg').html('Sign up done !'); //Only runs this when successful
  },
  error: function (xhr, textStatus) {
      if (xhr.status == 500) { 
         $('.signUpMsg').html('Sign up fail');
      } else if (xhr.status == 400) {
         $('.signUpMsg').html('Please fill the form properly');
      }
  }
})

【讨论】:

  • 好收获!我完全错过了那个小而关键的部分。
  • 编辑:UV 捕捉到的好东西 ^^
  • 该死的,我在这里犯了一个巨大的错误,谢谢指出。并感谢您为我提供了获取数据的正确方法。但它不能修复整个代码
  • @AoNoLoki 如果这个答案对你有帮助,你应该接受它。
  • @MagnusEriksson 完成,我正在研究 OldPadawan 的提示以获取有关错误的更多资源
【解决方案2】:

在 ajax 部分,您正在使用这样的输入 id

data = {
      lastname : $('#lastname').val(),
      firstname : $('#firstname').val(),
      pseudo : $('#pseudo').val(),
      password : $('#password').val(),
    }

但是在输入中没有输入的id

<div><input type="text" name="lastname" placeholder="lastname"></div>
  <div><input type="text" name="firstname" placeholder="firstname"></div>
  <div><input type="text" name="pseudo" placeholder="pseudo"></div>
  <div><input type="password" name="password" placeholder="password"></div>

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2020-02-10
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2013-01-21
    • 2015-08-10
    相关资源
    最近更新 更多