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"
}
});