博客列表 >ajax请求与json数据--20190125

ajax请求与json数据--20190125

曲小冷
曲小冷原创
2019年03月27日 15:45:091083浏览

使用知识:

JSON

以前端JS进行ajax的POST请求为例,后端PHP处理请求为例:
1.前端构造一个JS对象,用于包装要传递的数据,然后将JS对象转化为JSON字符串,再发送请求到后端;
2.后端PHP接收到这个JSON字符串,将JSON字符串转化为PHP对象,然后处理请求。
相同的数据在这里有3种不同的表现形式,分别是前端的JS对象、传输的JSON字符串、后端的PHP对象
JS中与JSON相关的几个函数

1. 将JS数据结构转化为JSON字符串 —— JSON.stringify(value[, replacer [, space]])
JSON.stringify({"name":"Good Man","age":18})返回一个字符串 "{"name":"GoodMan","age":18}"
2. 将JSON字符串解析为JS数据结构 —— JSON.parse(text[, reviver])
3. 影响 JSON.stringify 的神奇函数 —— object.toJSON
如果你在一个JS对象上实现了toJSON方法,那么调用JSON.stringify去序列化这个JS对象时,JSON.stringify会把这个对象的toJSON方法返回的值作为参数去进行序列化。

AJAX请求:

同步与异步的根本区别在于;请求发出后,是否需要等待结果,必须等待结果就是同步,不用等待继续执行就是异步

Ajax技术核心是XMLHttpRequest对象

//GET请求
var request = new XMLHttpRequest(); //创建XHR对象可以直接实例化XMLHttpRequest
request.open('get', 'demo.php', false); //连接服务器
request.send(); //发送请求
request.onreadystatechange = function(){    //接受返回
    if(request.readyState==4 && request.status==200){
        //读取成功操作
    }
}

//POST请求
// 1、创建ajax对象
var request = new XMLHttpRequest();    // 2、监听成功回调
request.onreadystatechange = function(ev){        // 成功返回的信息
    if(request.readyState==4 && request.status==200){
       frame.href="user_manager.php";
    }
}    
// 3、初始化参数
request.open('POST','user_manager.php?active=save');    // post 请求 需要设置一个请求头
request.setRequestHeader('content-type','application/x-www-form-urlencoded');    // post 请求发送请求到服务器
// 以键值对:
var data = 'email='+form.email.value+'&password='+form.password.value+'&id='+form.id.value;
request.send(data);

open()方法,它接受三个参数:要发送的请求类型(get、post)、请求的URL和表示是否异步

open()方法并不会真正发送请求,而只是启动一个请求以备发送。通过send()方法进行发送请求,send()方法接受一个参数,作为请求主体发送的数据。如果不需要则,必须填null。执行send()方法之后,请求就会发送到服务器上。


当请求发送到服务器端,收到响应后,响应的数据会自动填充XHR对象的属性。那么一共有四个属性:

XHR对象的四个属性.png

接受响应之后,第一步检查status属性,以确定响应已经成功返回。一般而已HTTP状态代码为200作为成功的标志

HTTP状态吗.png

使用异步调用的时候,需要触发readystatechange事件,然后检测readyState属性即可。这个属性有五个值:


readyState属性.png


代码:

按钮请求编辑:
<button onclick="location.href='user_edit.php?id=<?=$user['id'] ?>'" class="layui-btn layui-btn-normal layui-btn-xs"><i class='layui-icon layui-icon-edit'></i></button>
编辑页面:
<?php

    $id = intval(trim($_GET['id']));
    $pdo = new PDO("mysql:host=127.0.0.1;dbname=staff;",'root','root');
    $stmt = $pdo->prepare("select * from staff where id ={$id}");
    $stmt->execute();
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    $pdo = null;

?>

<link rel="stylesheet" href="static/layui/css/layui.css" media="all">
<script src="static/js/jquery.js"></script>
<script src="static/layui/layui.all.js"></script>
<style>
    .login{width:350px;margin:50px auto;}
    .login h3{text-align:center;line-height:50px;font-size:24px;font-weight:bold;}
    .success{color:#5FB878;}
    .error{color:#FF5722;}
    .notice{color:#FFB800;}
</style>

<div class='login'>
    <h3>员工信息编辑</h3>
    <form action="" class="layui-form" id='edit-form' name='user'>
        <div class="layui-form-item">
            <label class="layui-form-label">用户名</label>
            <div class="layui-input-inline">
                <input type="text" name="name" value="<?=$user['name']; ?>" readonly  lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">邮 箱</label>
            <div class="layui-input-inline">
                <input type="email" name="email" value="<?=$user['email']; ?>" required  lay-verify="required|email" placeholder="请输入邮箱" autocomplete="off" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">电 话</label>
            <div class="layui-input-inline">
                <input type="text" name="mobile" value="<?=$user['mobile']; ?>" required  lay-verify="required|number" placeholder="请输入电话" autocomplete="off" class="layui-input">
            </div>
        </div>
        <input type="hidden" name='id' value="<?=$id ?>" />

        <div class="layui-form-item">
            <label class="layui-form-label"> </label>
            <div class="layui-input-inline">
                <button type="button" class="layui-btn" lay-submit lay-filter="formDemo">更新</button>
                <button class="layui-btn layui-btn-primary" onclick='history.back();'>取消</button>
            </div>
        </div>
        <h4 id='tips' class='success'></h4>
    </form>
</div>

<script>
    layui.use(['layer','form'], function(){
        var form = layui.form;
        form.render();
        
        //监听提交
        form.on('submit(formDemo)', function(data){
            var form = data.form;
            console.log(form);

            // 以 ajax 异步方式与服务器进行数据交互

            // 1、创建ajax对象
            var request = new XMLHttpRequest();

            // 2、监听成功回调
            request.onreadystatechange = function(){
                // 成功返回的信息
                if(request.readyState===4 && request.status===200){
                    // console.log(request.responseText);
                    // request.responseText === $_POST 响应返回的信息 是user_manager.php 文件内容
                    var data = JSON.parse(request.responseText);   // JSON.parse 将服务器传输的信息转为json对象

                    var tips = form.lastElementChild;
                    tips.innerHTML = data.message;

                    if(data.status === 1){
                        tips.classList.add('success');
                    }else{
                        tips.classList.add('error');
                    }

                    setTimeout(function() {
                        history.back();
                    }, 2000);
                }
            }

            // 3、初始化参数
            request.open('POST','check.php?action=update');

            // post 请求 需要设置一个请求头
            request.setRequestHeader('content-type','application/x-www-form-urlencoded');

            // 发送请求到服务器
            // 以键值对:
            var data = 'email='+form.email.value+'&mobile='+form.mobile.value+'&id='+form.id.value;

            request.send(data);
        });
    });

</script>

请求检查:
<?php
// 用户管理操作 不是界面
$pdo = new PDO('mysql:host=127.0.0.1;dbname=staff;','root','root');
$action = strtolower(trim($_REQUEST['action']));

session_start();

// 返回json格式数据 ['status'=>1,'msg'=>'lll']

$status = 0;
$message = '';

switch ($action){
    case 'update':
        $stmt = $pdo->prepare("UPDATE `staff` SET `email` = :email,`mobile` = :mobile WHERE id = :id");

        $email = strtolower(trim($_POST['email']));
        $mobile = intval(trim($_POST['mobile']));
        $id = $id = intval(trim($_POST['id']));

        $stmt->bindParam('email',$email,PDO::PARAM_STR,60);
        $stmt->bindParam('mobile',$mobile,PDO::PARAM_INT);
        $stmt->bindParam('id',$id,PDO::PARAM_INT);
        if($stmt->execute()){
            // 更新成功
            if($stmt->rowCount() === 1){
                $status = 1;
                $message = '更新成功';
            }else if($stmt->rowCount() === 0){
                $status = 0;
                $message = '没有更新';
            }
        }else{
            // 上线后 下面这句话 应删除
            // die(print_r($stmt->errorInfo()));    //开发时使用
            $status = -1;
            $message = '保存失败,请检查';
        }
        exit(json_encode(['status'=>$status,'message'=>$message]));  // 将信息返回给前台
    break;

    case 'add':
        $sql = "INSERT INTO staff(`name`,`age`,`sex`,`salary`,`position`,`email`,`hiredate`) VALUES(:name,:age,:sex,:salary,:position,:email,:hiredate)";
        $stmt = $pdo->prepare($sql);

        $name = trim($_POST['name']);
        $age = trim($_POST['age']);
        $sex = trim($_POST['sex']);
        $salary = trim($_POST['salary']);
        $position = trim($_POST['position']);
        $email = trim($_POST['email']);
        $hiredate = time();

        $stmt->bindValue('name',$name,PDO::PARAM_STR);
        $stmt->bindValue('age',$age,PDO::PARAM_INT);
        $stmt->bindValue('sex',$sex,PDO::PARAM_INT);
        $stmt->bindValue('salary',$salary,PDO::PARAM_INT);
        $stmt->bindValue('position',$position,PDO::PARAM_STR);
        $stmt->bindValue('email',$email,PDO::PARAM_STR);
        $stmt->bindValue('hiredate',$hiredate,PDO::PARAM_INT);

        if ($stmt->execute()){
            if ($stmt->rowCount() === 1){
                $status = 1;
                $message = '新增成功';
            }else if($stmt->rowCount() === 0){
                $status = 0;
                $message = '没有记录新增';
            }
        }else{
            $status = -1;
            $message = '新增失败,请检查';
        }

        exit(json_encode(['status'=>$status,'message'=>$message]));  // 将信息返回给前台
    break;

    case 'del':
        $id = trim($_POST['id']);
        $sql = "UPDATE `staff` SET `delete_time` = :delete_time WHERE id = :id";
        $stmt = $pdo->prepare($sql);
        if ($stmt->execute(['delete_time'=>time(),'id'=>$id])){
            if ($stmt->rowCount() == 1){
                $status = 1;
                $message = '删除成功';
            }elseif ($stmt->rowCount() == 0){
                $status = 0;
                $message = '没有记录删除';
            }
        }else{
            $message = '删除失败,请检查';
        }
        exit(json_encode(['status'=>$status,'message'=>$message]));  // 将信息返回给前台
    break;
}

效果图:

列表页.png

员工信息编辑界面.png

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议