鍍金池/ 問(wèn)答/PHP  HTML/ php+ajax驗(yàn)證問(wèn)題(附完整代碼),已上傳錯(cuò)誤截圖,請(qǐng)指點(diǎn)哪里錯(cuò)誤了?

php+ajax驗(yàn)證問(wèn)題(附完整代碼),已上傳錯(cuò)誤截圖,請(qǐng)指點(diǎn)哪里錯(cuò)誤了?

圖片描述
這是后端代碼

<?php
 $password=$_POST['password'];
function getRandPass(){
$chars = ("0123456789abcdefghijklmnopqrstuvwxyz");
$min = 6;//最小字?jǐn)?shù)
$max = 9;//最大字?jǐn)?shù)
$len = mt_rand($min,$max);//隨機(jī)長(zhǎng)度
$password= '';
$a_len = strlen($chars);
for($i=0;$i<$len;$i++){
$password.= $chars[mt_rand(0,$a_len-1)];//隨機(jī)取出一個(gè)字符
}
return $password;
}
$password=getRandPass();
 if($password==$password){
    $data['code'] = 1;
    $data['password'] = $password;
}else{
    $data['code'] = 0;    
}
$data='{password:"' . $password. '"}';//組合成json格式數(shù)據(jù)
 echo json_encode($data);//輸出json數(shù)據(jù)
?>

以下是前端代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<input type="text" id="password">
 <button id="sub">獲取密碼</button>
  <button id="gopass">驗(yàn)證密碼</button>
 <input type="text" id="text">
 <span id="texts"></span><!-- 用以顯示返回來(lái)的數(shù)據(jù),只刷新這部分地方 -->
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
     $('#gopass').click(function(){
  var password=$('#password').val();
  if(password==''){
      $('#texts').html('密碼不能為空!');
      return false;
  }
        $.ajax({
            url: 'password.php',
            type: 'POST',
            dataType: 'json',
            data: {password: password},
            beforeSend: function(){
                $('#texts').html('驗(yàn)證中!');//用于調(diào)試驗(yàn)證過(guò)程
            },
            success: function(data){
                if(data.code==1){ //驗(yàn)證密碼
                    $('#texts').html('驗(yàn)證成功' );
                }else{
                    $('#texts').html('密碼錯(cuò)誤!');
                }
            }
        });

 });
</script>
<script>
$(function(){
$('#sub').click(function(){
  var password=$('#password').val();
  $.ajax({
  type: "post",
  url: "password.php",
  data: {password: password}, //提交到password.php的數(shù)據(jù)
  dataType: "json", //回調(diào)函數(shù)接收數(shù)據(jù)的數(shù)據(jù)格式

  success: function(msg){
   $('#text').empty(); //清空Text里面的所有內(nèi)容
   var data='';
   if(msg!=''){
   data = eval("("+msg+")"); //將返回的json數(shù)據(jù)進(jìn)行解析,并賦給data
   }
   $('#text').val(data.password); //密碼在#text中輸出
   $('#texts').html('獲取成功!');
   console.log(data); //控制臺(tái)輸出調(diào)試結(jié)果
  },
  error:function(msg){
   console.log(msg);//控制臺(tái)輸出錯(cuò)誤調(diào)試結(jié)果
  }
  });
 });
 });
</script>
</body>
</html>
回答
編輯回答
呆萌傻

問(wèn)題1,沒(méi)有保存密碼,驗(yàn)證密碼的時(shí)候又重新生成了新密碼,所以永遠(yuǎn)都是密碼錯(cuò)誤

問(wèn)題2,$data='{password:"' . $password. '"}';echo json_encode($data);重復(fù),json_encode就是生成json的

問(wèn)題3,ajax使用dataType: "json"時(shí),jquery會(huì)自動(dòng)解析json字符串,不需要再一次data = eval("("+msg+")");

問(wèn)題4,獲取密碼的點(diǎn)擊事件中,還沒(méi)有輸入密碼呢,干嘛還要提交密碼 data: {password: password}, //提交到password.php的數(shù)據(jù)

<?php
session_start();
function getRandPass()
{
    $chars    = ("0123456789abcdefghijklmnopqrstuvwxyz");
    $min      = 6;//最小字?jǐn)?shù)
    $max      = 9;//最大字?jǐn)?shù)
    $len      = mt_rand($min,$max);//隨機(jī)長(zhǎng)度
    $password = '';
    $a_len    = strlen($chars);
    for($i = 0;$i < $len;$i++)
    {
        $password .= $chars[mt_rand(0,$a_len - 1)];//隨機(jī)取出一個(gè)字符
    }
    return $password;
}
if(isset($_POST['password']))
{
    if($_SESSION['password'] == $_POST['password'])//驗(yàn)證密碼
    {
        $data['code'] = 1;
    }
    else
    {
        $data['code'] = 0;
    }
}
else
{
    $password = getRandPass();
    $_SESSION['password'] = $password;//保存密碼,以便下次驗(yàn)證密碼
    $data['password'] = $password;
}
echo json_encode($data);//輸出json數(shù)據(jù)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
    </head>
    <body>
        <input type="text" id="password">
        <button id="sub">
            獲取密碼
        </button>
        <button id="gopass">
            驗(yàn)證密碼
        </button>
        <input type="text" id="text">
        <span id="texts">
        </span><!-- 用以顯示返回來(lái)的數(shù)據(jù),只刷新這部分地方 -->
        <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js">
        </script>
        <script>
            $('#gopass').click(function()
                {
                    var password = $('#password').val();
                    if(password == '')
                    {
                        $('#texts').html('密碼不能為空!');
                        return false;
                    }
                    $.ajax(
                        {
                            url: 'password.php',
                            type: 'POST',
                            dataType: 'json',
                            data:
                            {
                                password: password
                            },
                            beforeSend: function()
                            {
                                $('#texts').html('驗(yàn)證中!');//用于調(diào)試驗(yàn)證過(guò)程
                            },
                            success: function(data)
                            {
                                if(data.code == 1)
                                {
                                    //驗(yàn)證密碼
                                    $('#texts').html('驗(yàn)證成功' );
                                }else
                                {
                                    $('#texts').html('密碼錯(cuò)誤!');
                                }
                            }
                        });
                });
            $('#sub').click(function()
                {
                    var password = $('#password').val();
                    $.ajax(
                        {
                            type: "get",
                            url: "password.php",//提交到password.php的數(shù)據(jù)
                            dataType: "json", //回調(diào)函數(shù)接收數(shù)據(jù)的數(shù)據(jù)格式
                            success: function(data)
                            {
                                $('#text').empty(); //清空Text里面的所有內(nèi)容
                                $('#text').val(data.password); //密碼在#text中輸出
                                $('#texts').html('獲取成功!');
                                console.log(data); //控制臺(tái)輸出調(diào)試結(jié)果
                            },
                            error:function(msg)
                            {
                                console.log(msg);//控制臺(tái)輸出錯(cuò)誤調(diào)試結(jié)果
                            }
                        });
                });
        </script>
    </body>
</html>
2018年3月27日 09:27
編輯回答
兔寶寶

最終目的:獲取到的密碼和輸入的密碼進(jìn)行驗(yàn)證。

后端代碼改為

<?php

if ($_POST['action'] == 'getPassword') {
    $data['password'] = getRandPass();
} else if ($_POST['action'] == 'check') {
    if($_POST['password'] == $_POST['inputPassword']){
        $data['code'] = 1;
    }else{
        $data['code'] = 0;    
    }
}

function getRandPass()
{
    $chars = ("0123456789abcdefghijklmnopqrstuvwxyz");
    $min = 6;//最小字?jǐn)?shù)
    $max = 9;//最大字?jǐn)?shù)
    $len = mt_rand($min,$max);//隨機(jī)長(zhǎng)度
    $password= '';
    $a_len = strlen($chars);
    
    for($i=0;$i<$len;$i++){
        $password.= $chars[mt_rand(0,$a_len-1)];//隨機(jī)取出一個(gè)字符
    }
    
    return $password;
}

echo json_encode($data);//輸出json數(shù)據(jù)

?>

前端代碼

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
</head>
<body>
<input type="text" id="password">
 <button id="sub">獲取密碼</button>
  <button id="gopass">驗(yàn)證密碼</button>
 <input type="text" id="text">
 <span id="texts"></span><!-- 用以顯示返回來(lái)的數(shù)據(jù),只刷新這部分地方 -->
<script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
     $('#gopass').click(function(){
  var password=$('#password').val();
  if(password==''){
      $('#texts').html('密碼不能為空!');
      return false;
  }
        $.ajax({
            url: 'password.php',
            type: 'POST',
            dataType: 'json',
            data: {action:'check',password: password,inputPassword:$('#text').val()},
            beforeSend: function(){
                $('#texts').html('驗(yàn)證中!');//用于調(diào)試驗(yàn)證過(guò)程
            },
            success: function(data){
                if(data.code==1){ //驗(yàn)證密碼
                    $('#texts').html('驗(yàn)證成功' );
                }else{
                    $('#texts').html('密碼錯(cuò)誤!');
                }
            }
        });

 });
</script>
<script>
$(function(){
$('#sub').click(function(){
  var password=$('#password').val();
  $.ajax({
  type: "post",
  url: "password.php",
  data: {action:'getPassword', password: password}, //提交到password.php的數(shù)據(jù)
  dataType: "json", //回調(diào)函數(shù)接收數(shù)據(jù)的數(shù)據(jù)格式

  success: function(msg){
   $('#text').empty(); //清空Text里面的所有內(nèi)容
   var data='';
   if(msg!=''){
   data = eval("("+msg+")"); //將返回的json數(shù)據(jù)進(jìn)行解析,并賦給data
   }
   $('#text').val(data.password); //密碼在#text中輸出
   $('#texts').html('獲取成功!');
   console.log(data); //控制臺(tái)輸出調(diào)試結(jié)果
  },
  error:function(msg){
   console.log(msg);//控制臺(tái)輸出錯(cuò)誤調(diào)試結(jié)果
  }
  });
 });
 });
</script>
</body>
</html>

然后再試試,主要問(wèn)題還是最后的輸出部分做了手動(dòng)拼接。

2017年8月12日 17:41