笔记总结

本文深入探讨了MVC设计模式的原理、优缺点及在实际项目中的应用,通过新闻增删案例展示了MVC模式的操作流程。同时,详细讲解了jQuery的选择器、DOM操作和动画效果,以及在网页交互中的应用。此外,还介绍了Laravel框架下如何创建文章列表、编写、详情、编辑和删除模块,涉及路由、控制器和数据库操作。最后,通过AJAX实现了英雄数据的增删改查功能,涵盖了前端与后端的交互。
摘要由CSDN通过智能技术生成

笔记总结

1MVC

1.1概念

M(model 模型):- 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
V(view 视图):视图代表模型包含的数据的可视化。
C(controller 控制器):控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
MVC 是一种编程思想
核心:将程序当中的跟页面展现相关的代码放到一个文件中,将业务逻辑处理相关的代码放到一个文件
中,将数据库交互的代码放到一个文件中
这三个文件就分别负责页面呈现(view)、业务逻辑(controller)和数据交互(模型)

MVC

1.2处理流程图

image.png

对于每一个用户输入的请求,首先被控制器接收,并决定由哪个模型来进行处理,然后模型通过业务处理逻辑处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过显示页面呈现给用户。

1.3优点

1、视图重用。多个视图能共享一个模型。同一个模型可以被不同的视图重用,大大提高了代码的可重用性。

   2、松散耦合。由于MVC的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的松耦合的构件。

   3、灵活性。控制器提高了应用程序的灵活性和可配置性。控制器可以用来联接不同的模型和视图去完成用户的需求,这样控制器可以为构造应用程序提供强有力的手段。

1.3缺点

1、增加了系统结构和实现的复杂性。
对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

  2、视图与控制器间的过于紧密的连接。
  视图与控制器是相互分离,但确实联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

  3、视图对模型数据的低效率访问。
  依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
 MVC的使用会使我们的软件或系统在健壮性,代码重用和结构方面有很大的提升。但并不是所有的系统都适合使用MVC,它会带来额外的工作和复杂性,所以并不适合小型甚至中等规模的系统或软件,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。这就需要我们做出抉择。

1.4案例

新闻增删案例

model页面

image.png

control页面

image.png

view页面

image.png

html页面

image.png
image.png
image.png

个人思路:现在model页面定义一个类,在分别写连库的基本操作,之后在control里引入model,在分别写php语法结合html前台,在html利用action传参,根据aciton的不同,打开不同的页面。

2jquery

2.1引入方式

$(function(){})

$(document).ready(function(){})

2.2选择器

2.3基础选择器

名称用法描述
ID选择器$("#id")获取ID的元素
全选选择器$(’*’)匹配所有元素
类选择器$(".class")获取同一类class元素
标签选择器$(“div”)获取同一类标签的所有元素
并集选择器$(“div,p,li”)选取多个元素
交际选择器$(“li.current”)交集元素

2.4层级选择器

名称用法描述
子代选择器$(“ul>li”);使用>号,获取亲儿子层级的元素;注意,并不会获取孙子层级的元素
后代选择器$(“ul li”);使用空格,代表后代选择器,获取ul下的所有li元素,包括孙子等

2.5筛选选择器

语法用法描述
:first$(“li:first”)获取第一个li元素
:last$(“li:last”)获取最后一个li元素
:eq(index)$(“li:eq(2)”)获取到的li元素中,选择索引号为2的元素,索引号index从0开始。
:odd$(“li:odd”)获取到的li元素中,选择索引号为奇数的元素
:even$(“li:even”)获取到的li元素中,选择索引号为偶数的元素
语法用法说明
parent()$(“li”).parent()查找父级
children(selector)$(“ul”).children(“li”)相当于$(“ul>li”),最近一级(亲儿子)
find(selector)$(“ul”).find(“li”);相当于$(“ul li”),后代选择器
siblings(selector)$(".first").siblings(“li”)查找兄弟节点,不包括自己本身
nextAll([expr])$(".first").nextAll()查找当前元素之后所有的同辈元素
prevtAll([expr])$(".last").prevAll()查找当前元素之前所有的同辈元素
hasClass(class)$(‘div’).hasClass(“protected”)检查当前的元素是否含有某个特定的类,如果有,则返回true
eq(index)$(“li”).eq(2)相当于$(li:eq(2)),index从0开始

2.6节点关系

父节点parent()
父节点集合 parents(“选择器”)
直接子节点 children()
后代子节点 find()
所有的兄弟节点 siblings()
后面的一个兄弟节点next()
前面的一个兄弟节点prev()
后面的所有兄弟节点 nextAll()
前面的所有兄弟节点 prevAll()
添加类名 addClass(‘类名’)
移出类名 removeClass(“类名”)
切换类名 toggleClass(‘类名’)

2.7DOM增删语法

$("#box").append(“我是尾部追加的元素”);//尾部追加元素

$("#box").prepend("")//头部追加元素

$("#box").after("");//外部末尾追加元素

$("#box").before("");//外部头部追加元素

( " 我 是 内 部 追 加 的 元 素 " ) . a p p e n d T o ( ("我是内部追加的元素").appendTo( ("").appendTo(("#box"));//内部追加元素

$("#box").remove();//删除自身和所有的子元素

$("#box").empty();//删除子元素但是保留自身

$("#box").html("");//和上面的empty的用法相同

2.7jquery动画

hide(1000)隐藏 show(1000)显示
$("#btn").click(function(){
$("#box").hide(1000,function(){
alert('我被删除了');
});
})
slideUp()滑上去 slideDown()滑动下去
$("#btn").click(function(){
$("#box").slideUp(1000,function(){
alert('滑动上去了')
})
$(selector).animate({},1000,callback)
备注:动画属性可以设置很多,比如宽高、边框、位置、2D转换等,但是颜色没有用
$("#btn").click(function(){
$("#box").animate({
"width":"150px",
"height":"150px",
"border-radius":'50%'58
},1000,function(){
})
})
fadeIn() 方法使用淡入效果来显示被选元素,假如该元素是隐藏的。
fadeOut() 方法使用淡出效果来隐藏被选元素,假如该元素是隐藏的。

2.8掉钱案例

css

<style>
			*{
				margin:0;
				padding:0;
			}
			html,body{
				width:100%;
				height:100%;
			}
			.box{
				width:100%;
				height:100%;
				background-color: #000;
			}
			span{
				position: absolute;
			}
		</style>
html
<div class="box">
			
		</div>
		<script src="jquery.min.js"></script>
		<script>
			function money(){
				// 我们要创建span标签放在div里面去
				var $span=$("<span>¥</span>");
				// 随机数
				var left=Math.random()*1300;
				// 刚创建的span标签设置样式
				$span.css({
					"fontSize":"30px",
					"color":"red",
					"left":left+"px"
				})
				$(".box").append($span);
				$span.animate({
					"top":"600px"
				},1000,function (){
					// 让当前的span标签删除
					$(this).remove();
				})
					
			}
			setInterval(money,1000)
		</script>

2.9购物车全选案例

<table border="1px" cellspacing='0' cellpadding='0'>
        <thead>
            <tr>
                <th><input type="checkbox" id="checkall"></th>
                <th>课程名称</th>
                <th>所属学院</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><input type="checkbox" class="cek" id="c1"></td>
                <td>JavaScript</td>
                <td>前端与移动开发学院</td>
            </tr>
            <tr>
                <td><input type="checkbox" class="cek"></td>
                <td>css</td>
                <td>前端与移动开发学院</td>
            </tr>
            <tr>
                <td><input type="checkbox" class="cek"></td>
                <td>html</td>
                <td>前端与移动开发学院</td>
            </tr>
            <tr>
                <td><input type="checkbox" class="cek"></td>
                <td>jQuery</td>
                <td>前端与移动开发学院</td>
            </tr>
            
        </tbody>
    </table>
    <script src="jquery.min.js"></script>
    <script>
        var cekall=$('#checkall')//获取全选复选框
        var cek=$('.cek')//获取每个复选框
        cekall.click(function(){//全选复选框点击事件
            var ck=$(this).prop('checked')//定义一个量,让每个复选框的状态处于选中状态
            cek.prop('checked',ck)//让每个复选框都选中
        })

       
        cek.change(function(){//定义一个事件
        l1=$('.cek:checked').length//先定义选中复选框的长度
        l2=$('.cek').length//在定义复选框的长度
        if(l1==l2){//如果选中的等于复选框,就是复选框全部被选中
            cekall.prop('checked',true)//让全选复选框处于true,因为在前面打印复选框的时候选中时全选框是true,没选中是false
        }else{
            cekall.prop('checked',false)
        }
    })
    </script>

定时器语法

var timer=setInterval(function(){},1000)
函数中是重复执行的代码块,1000代表时间是1000毫秒,也就是1秒
或者写一个单独的函数,然后用定时器调用
function fn(){}
var timer=setInterval(fn,1000)
clearInterval(timer);清除上面定时器的返回值,就是清除定时器的意思
简单示例如下:
var i=0;
var timer=setInterval(function(){
i++;
document.write(i)
if(i==5){
clearInterval(timer);
}
},1000)

Tab切换案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.red{
				color:red;
	
			}
			.block{
				display: none;
			}
		</style>
	</head>
	<body>
<div class="top">
<button class="btn">按钮1</button>
<button class="btn">按钮2</button>
<button class="btn">按钮3</button>
</div>
<div class="bot">
<div class="box">我是div1的内容</div>
<div class="box">我是div2的内容</div>
<div class="box">我是div3的内容</div>
</div>
	</body>
	<script src="jquery.min.js"></script>
	<script>
	$(".btn").click(function(){
	$(this).addClass("red").siblings().removeClass("red");
	var index=$(this).index();//获取当前点击按钮的索引号
	$(".box").eq(index).removeClass("block");
	$(".box").eq(index).siblings().addClass("block");
	})
	console.log($('.box').siblings())
	</script>
</html>
个人思路:
	先写三个button,再写三个div,给按钮添加点击事件,如果点击就让当时被点击的按钮获取red类,并且让他的兄弟移除red类。因为按钮和div索引相同,所以获取按钮的索引号,然后定义一个display:none的类,让索引号与按钮索引号相同的div移除block类,让他的兄弟获取block类。

3laravel写模块

3.1文章列表

首先把里的css,image,fonts,js放在public文件夹里,然后在views下新建一个post文件夹放blade.php文件,新建一个index.blade.php文件,把复制的代码放进去,然后把里面的路径改了。

image.png
先在web.php里编写路由

Route::get('posts','\App\Http\Controllers\PostController@index');

然后在控制器里编写index方法

    public function index(){
        $model=Post::orderby('id','desc')->get();
        return view('post.index',['posts'=>$model]);
    }

然后在前端页面的内容里这么写,别的不用动

开头写@foreach($posts as $post)

中间的内容用两个{},里面用$post->数据库的内容

结尾写@endforeach

image.png

在地址栏里输入/posts,就能进到文章列表界面
image.png

3.2编写文章

编写文章分为两个步骤,首先在在web.php里写入以下代码

Route::get('posts/create','\App\Http\Controllers\PostController@create');
Route::post('posts','\App\Http\Controllers\PostController@store');

然后在控制器里新建create和store方法,create用于展示create.balde.php页面,store用于把写入的数据存到库里

    public function create(){
        return view('post.create');
    }
    public function store(){
        $title=request('title');
        $content=request('content');
        $model=new Post();
        $model->title=$title;
        $model->content=$content;
        $res=$model->save();
        if($res){
            return redirect('/posts');}

编写内容时用wangeditor编辑器,按照下图方法。

image.png

这时会出现一个问题,因为富文本编辑器是div标签。不是input。所以接收不到数据,把submit改为button,给form一个id,在js里写上以下代码,就可以传数据了。

document.querySelector('#btn_save').addEventListener('click',function(){
    // 根据id获取表单
    var form=document.querySelector('#form_post')

    // 创建一个 input
    var input=document.createElement('input')
    input.type="text"
    input.name='content'
    // 获取的是 编辑器中用户输入的内容
    input.value=editor.txt.html()
    form.appendChild(input)
    console.log(form);
   
    // 调用表单的 submit 方法提交表单
    form.submit()
})

返回的界面可能出现419,这是由于 CSRF 保护引起的,这时我们在form表单里添加@csrf就可以了,他会自动生成一段代码

image.png

image.png

image.png

还有一个问题,当点击图片上传时无法上传本地文件,在web.php写入下面代码

Route::post('/posts/upload/image','\App\Http\Controllers\PostController@upload');

在js里写下面的代码

var E = window.wangEditor
var editor = new E('#content')
// 配置 server 接口地址
editor.config.uploadImgServer = '/posts/upload/image'
editor.config.uploadFileName = 'file'
editor.config.uploadImgHeaders = {
    Accept: 'text/x-json',
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}

editor.create()

在控制器里写上下面的代码,

public function upload()
    {
        // 获取上传的图片,并将其保存到一个叫做 upload 的文件夹下
        // 如果没有这个文件夹,会自动创建
        // laravel 会为这个图片生成一个随机的名称
        $file = request()->file('file')->store('upload');
        return [
            'errno' => 0,
            'data' => [
                asset('/storage/' . $file)
            ]
        ];
    }

3.3文章详情页

先修改超链接

image.png

在web.php写入下面代码

Route::get('/posts/{id}','\App\Http\Controllers\PostController@show');

在控制器里写入下面代码

    public function edite($id)
    {
        $model = Post::find($id);
        return view('post.edite', ['post' => $model]);      
    }

3.4文章编辑

编辑的实质就是在添加页面写入数据库的东西,在web.php里写下面的代码

Route::get('/posts/{id}/edit','\App\Http\Controllers\PostController@edite');
Route::put('/posts/{id}','\App\Http\Controllers\PostController@update');

在控制器里写下面的代码

 public function edite($id)
    {
        // 根据id获取文章详细信息
        $model = Post::find($id);
        return view('post.edite', ['post' => $model]);      
    }
    
     public function update($id)
    {
        // 根据id查询到文章
        $model = Post::find($id);
        $model->title = request('title');
        $model->content = request('content');
        $res = $model->save();
        if ($res) {
            return redirect("/posts/{$id}");
        } else {
            return redirect("/posts/{$id}/edit");
        }
    }

image.png

3.5删除文章

这里的删除是软删除,不会真正把数据删除,查询的时候不会查询出来,首先在web.php写入代码

Route::get('/posts/{id}/delete','\App\Http\Controllers\PostController@delete');

控制器

public function delete($id)
    {
        $res = Post::find($id)->delete();
        if ($res) {
            return redirect("/posts");
        } else {
            return redirect("/posts/{$id}");
        }
    }

4ajax的增删改查

4.1查询

html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="hero.css">
</head>
<body>
<a href="#" id="btn_showAdd">添加英雄</a>
<table border="1px" cellspacing="0" cellpadding="0">
    <thead>
    <tr>
        <th>英雄名称</th>
        <th>英雄技能</th>
        <th>英雄职业</th>
        <th>英雄皮肤</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>

    </tbody>
    </body>
</html>
js页面
loadhero();
function loadhero(){
    var xhr = new XMLHttpRequest();
    xhr.open('get','list.php')
    xhr.onreadystatechange = function(){
        if(xhr.readyState==4){
            document.querySelector('tbody').innerHTML=''
            var data = JSON.parse(xhr.responseText);
            data.forEach(function(ele,index){
                var tr = document.createElement('tr');
                tr.innerHTML=`
                    <td>${ele.title}</td>
                    <td>${ele.skill}</td>
                    <td>${ele.job}</td>
                    <td>${ele.skin}</td>
                    <td>
                        <a href="javascript:void(0)" class="edite" >编辑</a>
                        <a href="javascript:void(0)" class="btn_delete" data-id="${ele.id}">删除</a>
                    </td>
                    `
                document.querySelector('tbody').appendChild(tr);
            })

        }
    }
    xhr.send();
}
php后台
<?php
$link=mysqli_connect('localhost','root','root','blog');
mysqli_set_charset($link,'utf8');
$sql='select * from heroe';
$res=mysqli_query($link,$sql);
if ($res!=false){
    $heroe=mysqli_fetch_all($res,MYSQLI_ASSOC);
    echo json_encode($heroe);
}

个人思路:先写html生成一个只有表头没有内容的表格,然后在下面引入js文件,js里先定义一个函数叫loadhero,接着创建对象,配置请求方式和地址,注册事件,接受服务器返回的数据,里面先写一个console.log(xhr.responseText),下面在发送请求,之后写php代码,先连库,语法是查询,然后当语法执行时,定义一个$hero返回库中取得的行作为关联数组,在用json_encode输出,回到js在事件里用JSON.parse接收,在接收前用document.querySelector(‘tbody’).innerHTML=’'清空数据,然后遍历返回的数据,在遍历语法里创一个元素叫tr,让tr获取数据库的内容,最后在tbody里添加tr子节点。

4.2增加数据

html新增
    <div class="add_box">
        <span class="close">X</span>
        <div class="row">
            <label for="title">英雄名称</label>
            <input type="text" id="title">
        </div>
        <div class="row">
            <label for="job">英雄职业</label>
            <input type="text" id="job">
        </div>
        <div class="row">
            <label for="skill">英雄技能</label>
            <input type="text" id="skill">
        </div>
        <div class="row">
            <label for="skin">英雄皮肤</label>
            <input type="text" id="skin">
        </div>
        <div class="row">
            <button id="btn_add">保存</button>
        </div>
    </div>
    <!-- 遮罩层 -->
    <div class="cover"></div>
css
.cover{
    display: none;
    position: absolute;
    width: 100%;
    height: 100%;
    left: 0;
    top: 0;
    background-color: rgba(0, 0, 0, .3);
}
.add_box{
    display: none;
   position: absolute;
   width: 600px;
  
   left: 50%;
   top: 50%;
   margin-left: -300px;
   margin-top: -150px;
   padding: 15px;
   
   background-color: #fff;
   z-index: 999;
}
.close{
    position:absolute;
    width: 20px;
    height: 20px;
    right: 10px;
    top: 10px;
    border: 1px solid black;
    border-radius: 50%;
    text-align: center;
    line-height: 20px;
    cursor: pointer;
}
js
var btn_add = document.querySelector('#btn_add')
var close = document.querySelector('.close')
var cover = document.querySelector('.cover')
var add_box = document.querySelector('.add_box')
var btn_showAdd = document.querySelector('#btn_showAdd')
var tbody = document.querySelector('tbody');
btn_showAdd.addEventListener('click', function () {
    cover.style.display = 'block'
    add_box.style.display = 'block'
})
close.addEventListener('click', function () {
    cover.style.display = 'none'
    add_box.style.display = 'none'
})
cover.addEventListener('click', function () {
    cover.style.display = 'none'
    add_box.style.display = 'none'
})
btn_add.addEventListener('click', function () {
    var title = document.querySelector('#title').value
    var job = document.querySelector('#job').value
    var skill = document.querySelector('#skill').value
    var skin = document.querySelector('#skin').value
    var xhr = new XMLHttpRequest()
    xhr.open('post', 'add.php')
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            if (xhr.responseText == 'ok') {
                cover.style.display = 'none'
                add_box.style.display = 'none'
                loadhero()
            } else {

            }
        }
    }
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send(`title=${title}&job=${job}&skill=${skill}&skin=${skin}`)
})
php
<?php
$title=$_POST['title'];
$job=$_POST['job'];
$skill=$_POST['skill'];
$skin=$_POST['skin'];

// 创建连接
$link=mysqli_connect('localhost','root','root','blog') or die('连接失败');
// 设置编码
mysqli_set_charset($link,'utf8');
// 拼写sql语句
$sql="insert into heroe values(null,'$title','$job','$skill','$skin')";
// echo $sql;
// 查询
$res=mysqli_query($link,$sql);
if($res==true){
    echo 'ok';
}else{
    echo 'no';
}

个人思路:先用一个盒子把添加的模板隐藏起来,当点击添加按钮时添加页面才能出来,在设置一个遮罩层,当点击遮罩层时,遮罩层和添加界面都会关闭,在js页面先把按钮都获取,在分别设置点击事件,在添加按钮事件里先获取几个输入框的值,再写必备的语句,然后写php语句,先接收传过来的值,当增加语句执行时会传ok,然后在js写当xhr.responseText == 'ok’时,添加模板和遮罩层都会消失,然后调用查询函数。在发送请求前再写上xhr.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”);。发送请求里用模板字符串写上title=KaTeX parse error: Expected 'EOF', got '&' at position 8: {title}&̲job={job}&skill=KaTeX parse error: Expected 'EOF', got '&' at position 8: {skill}&̲skin={skin}。

4.3删除

js
	tbody.addEventListener('click', function (e) {
    if (e.target.className == 'delete') {
        // 让用户确认是否删除
        var res=confirm('真的姚删除吗?')
        if(!res){ // res==false
            return false;
        }
        var id=e.target.dataset.id
        var xhr=new XMLHttpRequest()
        xhr.open('get','delete.php?id='+id)
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4){
                if(xhr.responseText=='ok'){
                    loadHeroes()
                    alert('删除成功')
                }else{
                    alert('删除失败')
                }
            }
        }
        xhr.send()
    }
php
<?php
$id=$_GET['id'];
$link=mysqli_connect('localhost','root','root','blog') or die('连接失败');
mysqli_set_charset($link,'utf8');
$sql="delete from heroe where id=$id";

$res=mysqli_query($link,$sql);
if($res){
    echo 'ok';
}else{
    echo 'no';
}

个人思路:在增加的js语法里在删除里定义一个data-id的自定义标签,让他等于这个数据的id,利用事件委托和冒泡机制,当点击的类名时delete时,会弹出一个框提示用户是否删除,之后定义一个id获取它自定义属性的id然后写上必备语句,在 配置地址里用?传值去锁定他的id,php里写上删除语句,成功执行会输出ok给服务器,当js里的xhr.responseText等于ok时,调用查询函数并弹出删除成功,否则弹出删除失败。

4.4编辑

js
else if(e.target.className=='edite'){
        cover.style.display='block'
        edite_box.style.display='block'
        var id=e.target.dataset.id
        var xhr=new XMLHttpRequest()
        xhr.open('get','getHeiroById.php?id='+id)
        xhr.onreadystatechange=function(){
            if(xhr.readyState==4){
               var data=JSON.parse(xhr.responseText)
               document.querySelector('#edite_id').value=data.id
               document.querySelector('#edite_title').value=data.title
               document.querySelector('#edite_job').value=data.job
               document.querySelector('#edite_skill').value=data.skill
               document.querySelector('#edite_skin').value=data.skin
            }
        }
        xhr.send()
    }
})
btn_edite.addEventListener('click',function(){

    var id=document.querySelector('#edite_id').value
    var title = document.querySelector('#edite_title').value
    var job = document.querySelector('#edite_job').value
    var skill = document.querySelector('#edite_skill').value
    var skin = document.querySelector('#edite_skin').value

    var xhr=new XMLHttpRequest()
    xhr.open('post','edite.php')
    xhr.onreadystatechange=function(){
        if(xhr.readyState==4){
            if(xhr.responseText=='ok'){
                cover.style.display='none'
                edite_box.style.display='none'
               
                

                loadHeroes()
            }else{
                alert('更新失败')
            }
        }
    }
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xhr.send(`id=${id}&title=${title}&job=${job}&skill=${skill}&skin=${skin}`)
})
php
<?php
$id=$_POST['id'];
$title=$_POST['title'];
$job=$_POST['job'];
$skill=$_POST['skill'];
$skin=$_POST['skin'];


$link=mysqli_connect('localhost','root','root','blog') or die('连接失败');
mysqli_set_charset($link,'utf8');
$sql="update heroe set title='$title',job='$job',skill='$skill',skin='$skin'
where id=$id";

$res=mysqli_query($link,$sql);
if($res==true){
    echo 'ok';
}else{
    echo 'no';
}

<?php
$id=$_GET['id'];
$link=mysqli_connect('localhost','root','root','blog') or die('连接失败');
mysqli_set_charset($link,'utf8');
$sql="select * from heroe where id=$id";
$res=mysqli_query($link,$sql);
if($res){
    $hero=mysqli_fetch_assoc($res);
    echo json_encode($hero);
}
html
    <div class="edite_box">
        <span class="close">X</span>
        <!-- 隐藏域,用来存储英雄id -->
        <input type="hidden" id="edite_id">
        <div class="row">
            <label for="edite_title">英雄名称</label>
            <input type="text" id="edite_title">
        </div>
        <div class="row">
            <label for="edite_job">英雄职业</label>
            <input type="text" id="edite_job">
        </div>
        <div class="row">
            <label for="edite_skill">英雄技能</label>
            <input type="text" id="edite_skill">
        </div>
        <div class="row">
            <label for="edite_skin">英雄皮肤</label>
            <input type="text" id="edite_skin">
        </div>
        <div class="row">
            <button id="btn_edite">保存</button>
        </div>
    </div>

eroe where id=$id";
r e s = m y s q l i q u e r y ( res=mysqli_query( res=mysqliquery(link, s q l ) ; i f ( sql); if( sql);if(res){
h e r o = m y s q l i f e t c h a s s o c ( hero=mysqli_fetch_assoc( hero=mysqlifetchassoc(res);
echo json_encode($hero);
}


#### html

```html
    <div class="edite_box">
        <span class="close">X</span>
        <!-- 隐藏域,用来存储英雄id -->
        <input type="hidden" id="edite_id">
        <div class="row">
            <label for="edite_title">英雄名称</label>
            <input type="text" id="edite_title">
        </div>
        <div class="row">
            <label for="edite_job">英雄职业</label>
            <input type="text" id="edite_job">
        </div>
        <div class="row">
            <label for="edite_skill">英雄技能</label>
            <input type="text" id="edite_skill">
        </div>
        <div class="row">
            <label for="edite_skin">英雄皮肤</label>
            <input type="text" id="edite_skin">
        </div>
        <div class="row">
            <button id="btn_edite">保存</button>
        </div>
    </div>

个人思路:先写一个和添加盒子差不多的html但是在上面得写一个隐藏域用来写id,js分成两个步骤,当你点击的类名时edite时,编辑的盒子和遮罩层都会出来,然后利用get把id传给php,php里写查询语句where 数据库的id等于传过来的id,在js里在获取穿过来的数据库里行的数组,让编辑页面的文本框的值等于库的值。在给更新按钮一个点击事件,先把文本框的值分别获取,写上必备的语句,利用post传给php,php在用post接收,当更改语句执行成功时,会给服务器返回ok,js在用xhr.responseText等于ok,在让编辑框和遮罩层消失,调用查询函数,否则会弹出失败,在js最后面写上xhr.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”);,并且在send把值传过去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值