数据库
1. 发展
- 以文件/文档的方式进行手工管理
- 数据库的方式管理
- 关系型数据库:MySQL
- 关系: 表格
- 免费, 大厂产品, 社区活跃
2. 管理工具
- phpmyadmin:web
- mysql workbench: MySQL 工作台
- Navicat: 好用收费
- DBeaver: 免费客户端工具
- Adminer.php 推荐
3. 术语
- 数据库: 目录
- 数据表: 目录中的文件, .dbf
- 字段: 也叫’列’
- 记录: 也叫’行’,是由一个或多个字段组成
- 键: 是用来标识记录的
4. 数据类型
- 数值型: int
- 字符型: char
- 日期时间型: date, datetime
5. 常用指令
- 操作方式: 增删改查: CURD
- 数据是否变化: 分为读与写二种
读: 查询 select
写: 增加 insert, 更新 update, 删除 delete
6. 演示
6.1 创建数据库链接配置参数
- 放到 config 目录下的 database.php 中
config/database.php
<?php
//声明命名空间
namespace pdo_edu;
//将连接数据库参数以数组方式进行返回
//连接数据库配置参数
return[
// 数据库类型
'type' => $type ?? 'mysql',
// 数据库地址
'host' => $host ?? 'localhost',
// 数据库名
'dbname' => $dbname ?? 'php11.edu',
// 数据库编码集
'charset' => $charset ?? 'utf8',
// 数据库端口号
'port' => $port ?? '3306',
// 数据库用户名
'username' => $username ?? 'root',
// 数据库密码
'password' => $password ?? 'root',
];
6.2 连接数据库
- 放到 connect.php 文件中
connect.php
<?php
//链接数据库
//声明命名空间
namespace pdo_edu;
//使用全局系统对象
use PDO;
use Exception;
//加载配置参数
$config = require 'config/database.php';
//数组键值对转为名值对
/**
* @var string $type
* @var string $host
* @var string $dbname
* @var string $charset
* @var string $port
* @var string $username
* @var string $password
* */
extract($config);
//创建dsn
$dsn = sprintf('%s:host=%s;dbname=%s',$type,$host,$dbname);
//修改默认用户名和密码
$username = 'php11.edu';
$password = 'php11.edu';
//链接数据库
try {
$pdo = new PDO($dsn,$username,$password);
// 测试有没有链接成功
// var_dump($pdo); // 输出 object(PDO)#1 (0) { } 链接成功
}catch (Exception $e){
die($e->getMessage());
}
6.3 进行增删改查
6.3.1 增 (向数据库中添加一组数据)
insert.php
<?php
//创建命名空间
namespace pdo_edu;
//加载连接数据库文件
require 'connect.php';
//操作数据表 增 INSERT
//sql命令格式 INSERT 表名 SET 数据。。。
//创建sql语句
//通常这些数据以数组形式输入 如果是索引数组使用
//$sql = "INSERT `staffs` SET `name` = ? ,`age` = ? , `sex` = ? , `position` = ? , `mobile` = ? , `hiredate` = ?";
//如果是关联数组 使用
$sql = "INSERT `staffs` SET `name` = :name ,`age` = :age , `sex` = :sex , `position` = :position , `mobile` = :mobile , `hiredate` = :hiredate";
//通常向数据库添加数据 获取$_POST数据 以POST数据为例
//当前没有POST数据 手动创建POST数据
$_POST = ['name'=>'大西瓜','age'=>'25','sex'=>'1','position'=>'夏季消暑扛把子','mobile'=>'18899998888','hiredate'=>''];
//hiredate 时间戳取当前时间戳
$_POST['hiredate'] = time();
//开始写入
$stmt = $pdo->prepare($sql);
$stmt->execute($_POST);
//判断是否执行成功
//$stmt->rowCount() 返回该操作受影响的记录数量
//$pdo->lastInsertId(); 返回写入操作最后一个id
if ($stmt->rowCount() === 1){
echo '新增成功id = '.$pdo->lastInsertId();
}else{
echo '写入失败';
}
//输出 新增成功id = 412
- 数据库显示正常
6.3.2 删 (删除数据库中的某条数据)
delete.php
<?php
//删除数据库中的某条数据
//声明命名空间
namespace pdo_edu;
//加载数据库
require 'connect.php';
//操作数据表 删 DELETE
$sql = "DELETE FROM `staffs` WHERE `id`=:id";
//开始执行
$stmt = $pdo->prepare($sql);
//删除通常使用get方式
//所以要过滤一下,防止sql注入攻击
//检测 get方式提交表单中的id是不是数字
if (!filter_input(INPUT_GET,'id',FILTER_VALIDATE_INT)){
$_GET['id'] = '非法数据';
}
////断掉进程测试一下判断是否生效
//echo $_GET['id']; //delete.php?id=s1 输出 非法数据 delete.php?id=1 输出 1
//die();
$stmt->execute($_GET);
//判断是否执行成功
if ($stmt->rowCount()=== 1) {
echo '删除成功';
}else{
echo '删除失败';
}
//执行 /delete.php?id=412 输出 删除成功
- 看一下数据库 最后一条 411 已经没有 412 的数据了
6.3.3 改 (修改数据库中的某条数据)
update.php
<?php
namespace pdo_edu;
require 'connect.php';
//把 id = 411 的 name position 改掉
$sql = "UPDATE `staffs` SET `name` = ? , `position` = ? WHERE `id` = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute(['大冬瓜','冬季驱寒扛把子',411]);
//判断是否执行成功
if ($stmt->rowCount() === 1){
echo '修改成功';
}else{
echo '没有记录被更新';
// 打印返回数组
print_r($stmt->errorUInfo());
}
//访问输出 修改成功
- 去数据库看一下,已经成功被修改
6.3.4 查 查询数据库中的数据
- 单条查询
select1.php
<?php
namespace pdo_edu;
//下面查询语句中要使用PDO对象 use一下
use PDO;
require 'connect.php';
//查询数据库中年龄大于40的员工 *表示返回所有数据 如果只想要id name 就输入 `id`,`name`
$sql = 'SELECT * FROM `staffs` WHERE `age`>40';
$stmt = $pdo->prepare($sql);
$stmt->execute();
printf('<pre>%s</pre>',print_r($stmt->fetch(PDO::FETCH_ASSOC),true));
//输出 Array
//(
// [id] => 2
// [name] => 祁同伟
// [age] => 46
// [sex] => 1
// [position] => 公安厅长
// [mobile] => 13023456110
// [hiredate] => 1420041600
//)
//如果你要获取多条
while ($staff = $stmt->fetch(PDO::FETCH_ASSOC)){
printf('<pre>%s</pre>',print_r($staff ,true));
}
//输出 这里这复制了部分过来 他会一直输出直到没有符合条件为止 Array
//(
// [id] => 3
// [name] => 高育良
// [age] => 57
// [sex] => 1
// [position] => 政法书记
// [mobile] => 15678789933
// [hiredate] => 981734400
//)
//Array
//(
// [id] => 4
// [name] => 李达康
// [age] => 51
// [sex] => 1
// [position] => 市委书记
// [mobile] => 13088856110
// [hiredate] => 1336838400
//)
//Array
//(
// [id] => 5
// [name] => 沙瑞金
// [age] => 56
// [sex] => 1
// [position] => 省委书记
// [mobile] => 18956490987
// [hiredate] => 1179158400
//)
- 多条查询
select2.php
<?php
//其实就是把 fetch 改成 fetchAll
//fetch 返回一维数组
//fetchAll 返回二维数组
namespace pdo_edu;
//下面查询语句中要使用PDO对象 use一下
use PDO;
require 'connect.php';
//查询数据库中年龄大于40的员工 *表示返回所有数据 如果只想要id name 就输入 `id`,`name`
$sql = 'SELECT * FROM `staffs` WHERE `age`>40';
$stmt = $pdo->prepare($sql);
$stmt->execute();
//printf('<pre>%s</pre>', print_r($stmt->fetchAll(PDO::FETCH_ASSOC), true));
//如果你要显示它 使用 foreach
$staffs = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($staffs as $staff){
// 时间戳改为时间
$date = date('Y年m月d日',$staff['hiredate']);
printf('id=%s:姓名=%s---职位=%s---入职时间=%s<br>', $staff['id'], $staff['name'], $staff['position'], $date);
}
//输出 id=2:姓名=祁同伟---职位=公安厅长---入职时间=2014年12月31日
//id=3:姓名=高育良---职位=政法书记---入职时间=2001年02月09日
//id=4:姓名=李达康---职位=市委书记---入职时间=2012年05月12日
//id=5:姓名=沙瑞金---职位=省委书记---入职时间=2007年05月14日
//id=6:姓名=赵东来---职位=公安局长---入职时间=2013年08月07日
//id=8:姓名=陈清泉---职位=外语学霸---入职时间=2011年11月10日
//id=10:姓名=陆亦可---职位=调查处长---入职时间=2008年08月09日
//id=12:姓名=祁同伟---职位=公安厅长---入职时间=2014年12月31日
//id=13:姓名=高育良---职位=政法书记---入职时间=2001年02月09日
7. 总结
前几天有事耽搁了,不过感觉现在写这个作业跟课后第二天写作业完全不一样,最近几天一直在使用PDO ,以前课后就写是记录操作方法,今天写这个博客就像是在复习,所有语句都明白是什么意思~ 算不上手到擒来也差不多 mysqli暂时不想学了,因为目前用不到,而且有PDO就足够了,学了也会忘浪费时间,不如将时间用到有意义的事情上面,不知道我这个想法对不对