day0413

day0413

PHP操作数据库

php是一个后端语言,其核心职责之一就是操作数据库
php本身给我们提供了一套操作数据库的工具:mysqli

1.链接数据库 connect

链接数据库会返回一个通行秘钥, 这个东西在后期操作数据库的时候非常有用;

// mysqli_connect("服务器路径" , "数据库账号" , "数据库密码" , "数据库名称")
$con = mysqli_connect("localhost" , "root" , "123456","gp23_database");

con 有可能为 资源秘钥 也可能为空值;

# 错误处理主要判断的就是 $con ; 
if( !$con ){
      // API : die 终止全局代码执行 
      // API : mysqli_error($con) 报出当前连接的错误信息用于排错; 
      die("数据库连接错误,错误信息:" . mysqli_error($con));
}
echo "数据库连接成功";
# 数据库连接成功之后,一定要记得在最后关闭数据库连接; 
# 否则你的服务器会非常脆弱; 
mysqli_close($con);

数据库连接成功之后,一定要记得在最后关闭数据库连接;

2.SQL语句执行工具 query

我们操作数据库还是需要sql语句

数据库插入数据:

1. 连接数据库; 
2. 编写sql语句; 
3. 执行sql语句; 
4. 错误处理; 

在php之中编写sql语句所有的表名称,以及字段名全都用 反引号引起来;

我们表之中设置好类型为varchar的字符串,一定要在数据前面加上单引号 ;
为了让我们的mysql把数据识别为varchar;

# 引入连接数据库的文件; 
require("./02_php链接数据库.php");

# 编写sql语句 : 
$insert_sql = "INSERT INTO `usertable` VALUES ('xietian' , '456789' , null)";

# 使用sql语句; 

// API : mysqli_query 执行sql语句; 
$res = mysqli_query($con , $insert_sql);

# 错误处理; 
if(!$res){
      die("数据库操作错误,错误信息:" . $res);
}
echo "表格数据插入成功";

mysqli_close($con);

3.php查询数据库会返回一个资源类型,我们会对资源类型进行特殊处理

#引入链接
require("./02_php链接数据库.php");

# 写sql语句; 
$select_sql = "SELECT * FROM `usertable`";

# 执行sql语句;
$select_res = mysqli_query($con , $select_sql);

# 错误处理; 
if(!$select_res){
      # 这个mysqli_error 主要作用是帮助我们排查错误; 
      die("数据库查询错误,错误信息". mysqli_error($con));
}

查询结果处理 :

$select_res 是php的特殊类型 (实例对象) , 资源类型;

资源类型没有办法直接使用我们需要将资源类型里面的数据取出,然后在进行后续的使用;

在进行数组转换的时候默认把数据转换为数字数组,如果我们想要其他类型的数组就需要使用常量

fetch_all API;
MYSQLI_ASSOC ;
MYSQLI_NUM ;

$array = mysqli_fetch_all($select_res,MYSQLI_ASSOC);

echo json_encode($array);

mysqli_close($con);

4.error:数据库报错信息

设置某属性值不可重复:
右键设计表,索引,索引类型Unique
在这里插入图片描述

使用 php 操作数据库的步骤

1.和数据库建立链接
2.使用 sql 语句对数据库进行操作
3.获取结果
4.和数据库的链接断开

1.和数据库建立链接

在 php 中我们使用 mysql_connect() 方法来建立和数据库的链接

<?php
  # 下面就是建立链接,$link 会得到一个链接信息
   $link = mysql_connect('ip地址', '数据库用户名', '数据库密码'); 
?>

确定操作哪个哪个库

<?php
  # 下面就是确定你要操作哪个库  
   mysqli_select_db('你要操作的库的名称', $link);
?>
2.执行 sql 语句操作数据库
<?php
  # 下面就是使用 sql 语句对数据库进行操作
   $res = mysqli_query('你要执行的 sql 语句');      
?>
3.获取结果

这里有一个注意的点:
拿到的结果是一个看不懂的处理信息
需要使用 mysql_fetch_row || mysql_fetch_assoc 解析一下结果才能看得懂

4.关闭链接
<?php
  # mysqli_close($conn);
?>

完整步骤

<?php
  $conn = mysqli_connect('localhost', 'root', 'root');
  mysqli_select_db('test1913');
  $res = mysqli_query('SELECT * FROM `student`');
  $row = mysqli_fetch_assoc($res);
  mysqli_close($conn);

  print_r($row);
?>

常用的 sql 语句

<?php
  # 向表中增加一条数据,再增加的时候主键不能由我们书写,而是 mysql 数据库自己递增
  $sql = 'INSERT INTO `student` VALUES(null, "张三", 18, "男", 1913, 100)';
    
  # 插入固定几个键的数据,其他的用默认值
  $sql = 'INSERT INTO `student` (`name`, `age`) VALUES("李四", 22)';
?>

<?php
  # 删除表中 id 为 100 的数据
  $sql = 'DELETE FROM `student` WHERE `id`=100';

  # 删除表中 name 为 张三 的数据
  $sql = 'DELETE FROM `student` WHERE `name`="张三"'
?>

<?php
  # 更新一条 id 为 100 的数据中的 name 字段的值和 age 字段的值
  $sql = 'UPDATE `student` SET `name`="张三", `age`=10 WHERE `id`=100'
    
  # 更新数据的时候让所有的数据增加一些内容
  $sql = 'UPDATE `student` SET `age`=age+1'
?>

<?php
  # 查询 student 这个表里面的所有数据
  $sql = 'SELECT * FROM `student`';
    
  # 查询 student 表中的数据里面 gender 为 男 的数据
  $sql = 'SELECT * FROM `student` WHERE `gender`="男"';
    
  # 查询 student 表中的数据里面 age 大于 18 的数据
  $sql = 'SELECT * FROM `student` WHERE `age`>18';
    
  # 查询 student 表中的数据里面 age 大于 18 且 gender 为 男 的数据
  $sql = 'SELECT * FROM `student` WHERE `age`>18 AND `gender`="男"';

  # 查询 student 表中的数据里面 age 小于 22 或者 age 大于 28 的数据
  $sql = 'SELECT * FROM `student` WHERE `age`<22 OR `age`>28';

  # 查询 student 表中的数据里面从 第几条开始 查询多少条
  $sql = 'SELECT * FROM `student` LIMIT 0, 10';
    
  # 先按照条件筛选出数据以后再进行分页查询
  # 下面是查询表中所有 age>18 且 性别为男的所有数据,查出来以后从第 10 条开始查 10 条
  $sql = 'SELECT * FROM `student` WHERE `age`>18 AND `gender`="男" LIMIT 10, 10';

  # 查询表的模糊查询
  # 下面表示查询表中所有数据里面 name 字段中包含 "三" 字的数据
  $sql = 'SELECT * FROM `student` WHERE `name` LIKE "%三%"';

  # 查询排序,查询的时候按照某一个字段升序或降序排序
  $sql = 'SELECT * FROM `student` ORDER BY `age` ASC';
  $sql = 'SELECT * FROM `student` ORDER BY `age` DESC';
?>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

前后端分离

现代项目开发的核心思想
前后端的开发效率不一致:
后端慢:1.业务逻辑 2.数据库操作 3.安全
前端快:

前后端职责进行明确的划分:
前端工作职责大多在使用发送请求,处理服务的响应
后端的工作职责是做一个黑盒子

如何协作:
在项目开发之前就定义好请求和响应的规则
我们需要书面格式的规则说明=>面向前端的=>接口文档

接口文档

接口路径

url:htttp://www.baidu.com/xxx.php

请求方式

GET|POST|PATCH|PUT|DELETE

请求字段信息

username:string
password:string

返回数据实例

	//需要维护更新
	{"data":"hello world"}

注意事项:
1.定义的字段名必须是英文
2.请求方式必须明确
3.后端响应的数据必须是json格式

“{“username” : “wuyanzu” , “password”:123456, “id” : 3 , “type” : “success”}”;

有一个API可以把json字符串转换为对象数据类型

AJAX

前端必须要操作浏览器发送请求,接受响应
目前我们技术栈上来讲,请求发送依靠的是浏览器的页面跳转来完成的

这样的请求发送方式有问题:
页面必定会跳转; 性能消耗的急剧增加; 达不到前后端分离的开发模式要求;

页面无刷新无跳转的请求发起技术来了

AJAX:异步 javascript and xml

异步asynchronous;

javascript是单线程语言
上一行代码不执行结束,下一行代码绝对不执行;
干活的人只有一个

这个单线程语言里面有一些特别的内容:

异步的是 回调函数

事件 =>事件处理函数
定时器/延时器 => 定时器的回调函数
ajax
promise.then

因为这样的程序会让我们等待非常久的时间,我们js机制使用异步规避了长时间的等待
这个机制我们称之为异步

内存:函数执行都会被放在内存的代码执行栈之中

异步程序会有一个额外的队列
异步程序队列

同步程序会优先执行,当前我们所能看到的同步程序之后我们才回去执行异步程序

console.log(1);
 setTimeout( function(){
       console.log(2);     
 } , 0)
 console.log(3);

在这里插入图片描述
如果同步程序执行的过程之中碰到了异步程序,那么我们就会把异步程序放入到异步队列之中等待执行

for(var i = 0 ; i < 10 ; i ++){
      setTimeout( function(){
            console.log(i);
      } , 0)
}

在这里插入图片描述

AJAX:异步 javascript and xml
一堆技术的统称

xhr:记成小黄人好记
jsonp:跨域技术
fetch:高级封装
各种工具:
$.ajax,axios…

xhr

xhr 全称XMLHttpRequest();
无刷新发起浏览器请求
接收服务器的响应

xhr对象使用共分四部:
1.发起请求:有三步
2.接收响应:一步,(异步)

1.每一个请求都要创建一个xhr实例对象

var xhr = new XMLHttpRequest();

2.请求是必须有目标,并且想要获取数据的

明确目标:

http://localhost/gp23/20210413/09_test.txt 

目标必须是http协议打开的
请求发起的时候必须配置请求方式,现在先用get

var url = "http://localhost/gp23/20210413/09_test.txt ";
xhr.open("GET" , url);

在这里插入图片描述

3.发送行为

xhr.send( null );

请求发起时,当前html页面的源路径必须和请求目标的路径
同协议,同端口,同域名才可以正确发送请求
一定要注意请求发起的源路径

4.响应处理
xhr.readyState :xhr的请求状态

状态链接:

0~4 五个状态
4:成功

xhr.status : http状态码
200:成功
2开头的所有状态码都表示成功
在这里插入图片描述

xhr.responseText:响应字符串数据

事件:onreadystatechange

xhr.onreadystatechange = function(){
      // 判断 : xhr 的状态还有 http的状态;                   
      // 状态码的判定是响应信息已经完全可以获取了; 
      if( xhr.readyState === 4 && /^2\d{2}$/.test( xhr.status )){ 
            console.log( xhr.responseText );
      }
}

AJAX实现注册

.success{
      display: none;
}
<form action="javascript:void(0)">
      <p>账号 : <input type="text" id="username"></p>
      <p>密码 : <input type="text" id="password"></p>
      <button id="send">注册</button>
</form>

<div class="success">
      <img src="http://img1.dongqiudi.com/fastdfs1/M00/6B/DC/o4YBAFkHaECAOPllAAKG4pUqtH820.jpeg" alt="">
</div>

<script>
      var send_ele = document.getElementById("send");
      var usr_ipt = document.getElementById("username");
      var pwd_ipt = document.getElementById("password");
      var succ_ele = document.querySelector(".success");

      send_ele.onclick = function(){
            // 发送请求 ; 
            sendRegisterMsg();
      }

      function sendRegisterMsg(){
            var xhr = new XMLHttpRequest();
            // var url ="http://localhost/GP23/20210413/05_注册功能.php";

            var url ="http://localhost/GP23/20210413/10_register.php";


            url += "?username=" + usr_ipt.value + "&password=" + pwd_ipt.value;
            
            xhr.open("GET" , url);
            xhr.send();

            xhr.onreadystatechange = function(){
                  if( xhr.readyState === 4 && xhr.status === 200 ){
                        // 我们不要吧请求和请求之后的数据处理放在一起写; 
                        // console.log( xhr.responseText);
                        // 数据处理应该独立封装; 
                        setReisterState(xhr.responseText)
                  }
            }
      }
      function setReisterState( res ){
            res = JSON.parse(res);

            if( res.type === "success" ){
                  succ_ele.style.display = "block";
                  alert("恭喜注册成功");
            }else{
                  alert(res.msg);
            }
      }
# 获取用户信息; 

$username = $_GET["username"];
$password = $_GET["password"];

// echo "用户名:$username 密码:$password";

if(!$username || !$password){
      die('{"type":"error", "msg" : "参数不足"}');
}


require("./02_php链接数据库.php");
# 数据库操作 : 

# - 拼接sql语句 
# - 执行sql语句; 

# 加密password 
$password = md5($password);

$insert_sql = "INSERT INTO `usertable` VALUES ('$username' , '$password' , null)";

# 检查sql语句没有问题之后再去执行剩余的代码; 
// echo $insert_sql;

$res = mysqli_query( $con , $insert_sql);

# 判断 $res 是不是错误结果; 
if(!$res){
      die('{"type":"error", "msg" : "数据库错误" , "detail" : "'. mysqli_error($con) .'"}');
}

echo '{"type":"success", "msg" : "恭喜注册成功"}';

mysqli_close($con);

作业:
1.业务:注册成功之后跳转到登录页面
2.登录功能实现ajax
3.登录成功之后携带用户名跳转到首页

封装AJAX

function ajax(options) {
// 判断options是不是对象; 
// 如果不是对象给options一个默认值; 
if (!isObject(options)) {
      options = {};
}

// 对象参数的默认值; 
var _default = {
      type: "GET"
}
for (var attr in options) {
      _default[attr] = options[attr];
}
options = _default;

// 想要让我们的ajax可以携带数据怎么办; 
// 给url拼接数据很麻烦; 
// 我们用 对象承载需要发送的数据, 在封装之中把对象数据转换成字符串; 
// { username : "xxx" , password : "xxx" };

// option.data
if( isObject( options.data )){
      var _data = "";
      for(var attr in options.data){
            _data += "&" + attr + "=" + options.data[attr];
      }
      _data = _data.slice(1);
}

// 只有get的情况下我们采取拼接data数据; 

if( options.type.toUpperCase() === "GET"){
      options.url += "?" + _data;
}

console.log(options);


var xhr = new XMLHttpRequest();
xhr.open(options.type, options.url);
xhr.send(null);
xhr.onreadystatechange = function () {
      // 判断 : xhr 的状态还有 http的状态;                   
      // 状态码的判定是响应信息已经完全可以获取了; 
      if (xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)) {
            // 把callback也变成了可选参数;  
            typeof options.callback === "function" ? options.callback() : "";
      }
}
}
function isObject(data){
return (typeof data === "object" && data !== null && !(data instanceof Array))
}

ajax({
url : "http://localhost",
data : {
      username : "xx",
      password : "xxx"
}
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值