主要内容
- mysqli连接
- mysqli增删改查
- pdo连接
- pdo增删改查
- 查询的地方都涉及到遍历等,因此方法相对较多
1. mysqli连接
<?php
// 连接参数
return [
// 类型
'type' => $type ?? 'mysql',
// 先问下,没有的情况下再默认。默认数据库主机名(IP)
'host' => $host ?? 'localhost',
// 默认数据库名
'dbname' => $type ?? 'phpedu',
// 默认字符编码集
'charset' => $type ?? 'utf8',
// 默认端口号
'port' => $type ?? '3306',
// 默认用户名
'username' => $username ?? 'root',
// 默认用户的密码
'password' => $password ?? 'root'
];
<?php
// 连接数据库
// 导入配置参数,就是一个数组。因为在上一级目录,因此有..
$config = require __DIR__ . '/../config.php';
// 关联数组 ===> 独立变量
extract($config);
// 创建连接对象: 连接数据库
$mysqli = new mysqli($host, $username, $password, $dbname);
// 检测错误
if ($mysqli->connect_errno) die('Connect Error: ' . $mysqli->connect_error);
// 字符编码
$mysqli->set_charset($charset);
2. mysqli增删改查
2-1. mysqli - 增(insert)
// mysqli新增操作
// 1. 连接
require 'connect.php';
// 2. 操作
// sql语句, ?:匿名占位符
$sql = 'INSERT `users` SET `name`=?, `email`= ?, `password`=?;';
// 第一步: 将sql语句转为sql语句对象: stmt对象,预处理对象, 预编译语句对象
$stmt = $mysqli->prepare($sql);
// 给sql语句中的占位符?,绑定变量分二步
// 1. 给占位符绑定一个变量名(变量标识符)
$stmt->bind_param('sss', $name,$email,$password);
//sss代表三个string字符串占位
// 2. 将变量名与一个具体的值进行绑定: 变量赋值
// $name = 'admin';
// $email = 'admin@php.cn';
// sha1():生成40位由16进制字母组成的随机字符串
// $password = sha1('123');
// 第二步:执行
// $stmt->execute() or die($stmt->error);
// printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
//也可以用这种方式。
// $data = [
// 'name'=> 'peter',
// 'email'=> 'peter@php.cn',
// 'password' => sha1('123456'),
// ];
// 将关联数组解构到一组独立变量中
// extract($data);
// // 执行
// $stmt->execute() or die($stmt->error);
// printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
// 通过遍历一个二维数组,可以实现一次性插入多条记录
$users = [
['name'=> '小燕子','email'=>'xyz@php.cn', 'password'=>sha1('123456')],
['name'=> '紫薇','email'=>'zw@php.cn', 'password'=>sha1('123456')],
['name'=> '五阿哥','email'=>'wag@php.cn', 'password'=>sha1('123456')],
['name'=> '尔康','email'=>'ek@php.cn', 'password'=>sha1('123456')],
['name'=> '金锁','email'=>'js@php.cn', 'password'=>sha1('123456')],
];
foreach ($users as $user) {
extract($user);
if ($stmt->execute())
printf('成功的新增了 %s 条记录, 新增主键ID = %d<br>', $stmt->affected_rows, $stmt->insert_id);
//$s为string占位符,%d为数字占位符。
else
exit(sprintf('新增失败 , $d: %s', $stmt->errno, $stmt->error ));
}
// 第三步:关闭
$mysqli->close();
2-2. mysqli - 删(delete)
<?php
// mysqli删除操作
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'DELETE FROM `users` WHERE `id` = ?;';
// sql语句对象
$stmt = $mysqli->prepare($sql);
// 占位符与变量名绑定
$stmt->bind_param('i',$id);
// 变量赋值
$id=14;
//执行更新
$stmt->execute();
printf('删除了 %s 条记录', $stmt->affected_rows);
// 3. 关闭
$mysqli->close();
2-3. mysqli - 改(update)
<?php
// mysqli更新操作
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;';
// sql语句对象
$stmt = $mysqli->prepare($sql);
// 占位符与变量名绑定
$stmt->bind_param('sssi', $name, $email, $password, $id);
// 变量赋值
$user = ['name'=>'皇后','email'=>'hh@php.cn', 'password'=>sha1('888'), 'id'=>14 ];
//展开为独立变量给sql语句模板中的与占位符对应的变量名赋值
extract($user);
//执行更新
$stmt->execute();
printf('更新了 %s 条记录', $stmt->affected_rows);
// 3. 关闭
$mysqli->close();
2-4. mysqli - 查(select)
- 查询有好几种方式,主要是因为查询涉及到将取出来的数据展示出来。
2-4-1. fetch_assoc() + while()
<?php
// mysqli查询1: fetch_assoc() + while()
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'SELECT * FROM `users` WHERE `id` > ?';
// sql语句对象
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$id = 15;
$stmt->execute() or die($stmt->error);
// 获取结果集
$result = $stmt->get_result();
if ($result->num_rows === 0) exit('结果为空');
// fetch_assoc():以关联数组方式返回一个记录
// 循环遍历
while ($user=$result->fetch_assoc()) {
vprintf('%d: %s | %s <br>', $user);
}
// 3. 释放结果
$result->free();
// 4. 关闭连接
$mysqli->close();
2-4-2. fetch_all() + foreach()
$sql = 'SELECT * FROM `users` WHERE `id` > ?';
// sql语句对象
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$id = 15;
$stmt->execute() or die($stmt->error);
// 获取结果集
$result = $stmt->get_result();
if ($result->num_rows === 0) exit('结果为空');
// fetch_all():以二维关联数组方式返回一个满足查询条件的所有记录集合
$users=$result->fetch_all(MYSQLI_ASSOC);
// 循环遍历
foreach ($users as $user) {
vprintf('%d: %s ******* | %s <br>', $user);
//中间的*****只是为了区别于前面,可以不加。
}
2-4-3. bind_result() + fetch() + while()
$sql = 'SELECT `id`, `name`,`email` FROM `users` WHERE `id` > ?';
// sql语句对象
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i', $id);
$id = 15;
$stmt->execute() or die($stmt->error);
// 字段与变量的绑定
$stmt->bind_result($id, $name, $email);
// 因为当前操作不涉及结果集对象,如果要获取结果集中的数量,用以下二行代码
$stmt->store_result();
if ($stmt->num_rows === 0) exit('没有内容');
// 循环遍历
while ($stmt->fetch()) {
printf('%d: %s ----| %s <br>', $id, $name, $email);
}
3. pdo连接
// pdo连接数据库
// 导入配置参数,就是一个数组
$config = require __DIR__ . '/../config.php';
// 关联数组 ===> 独立变量
extract($config);
// 创建连接对象: 连接数据库。下面这个直接也可以,当然也可以用下面的try catch。
// $dsn: 数据源名称
// $dsn = 'mysql:host=localhost;dbname=phpedu;charset=utf8;port=3306';//不过这里只是示例
try {
$dsn= sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$host,$dbname,$charset,$port);
$pdo = new PDO($dsn, $username, $password);
// 设置结果集的默认获取模式: 只关心关联数组部分
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
exit('Connection Error: ' . $e->getMessage());
}
4. pdo增删改查
4-1. pdo - 增(insert)
<?php
// pdo 新增操作
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'INSERT `users` SET `name`=?, `email`= ?, `password`=?;';
// sql语句对象
$stmt = $pdo->prepare($sql);
// 1. ? 与 变量名绑定, 引用绑定
// $stmt->bindParam(1, $name, PDO::PARAM_STR, 30);
// $stmt->bindParam(2, $email, PDO::PARAM_STR, 100);
// $stmt->bindParam(3, $password, PDO::PARAM_STR, 40);
// 最后的数字为字段长短。
// 2. 变量名与值绑定(赋值)
// $name = '大飞111';
// $email = 'df111@php.cn';
// $password = sha1('df111');
// 执行
// $stmt->execute();
// $name = '大飞99999';
// $email = 'df1118888@php.cn';
// $password = sha1('df111');
// 执行
// $stmt->execute();
// rowCount():返回表中受影响的记录数量,当前是新增的记录数量
// if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
// 值绑定,变量必须先赋值,否则放在后面的不发挥作用。但变量引用绑定则不要紧。
// $name = '蛋蛋';
// $email = 'dd2@php.cn';
// $password = sha1('dd999');
// $stmt->bindValue(1, $name, PDO::PARAM_STR);
// $stmt->bindValue(2, $email, PDO::PARAM_STR);
// $stmt->bindValue(3, $password, PDO::PARAM_STR);
// 执行
// $stmt->execute() or die(print_r($stmt->errorInfo(),true));
// $name = '蛋蛋888';
// $email = 'dd2888@php.cn';
// $password = sha1('dd999');
// $stmt->bindValue(1, $name, PDO::PARAM_STR);
// $stmt->bindValue(2, $email, PDO::PARAM_STR);
// $stmt->bindValue(3, $password, PDO::PARAM_STR);
// 执行
// $stmt->execute() or die(print_r($stmt->errorInfo(),true));
// rowCount():返回表中受影响的记录数量,当前是新增的记录数量
// if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
// bindParam(): 引用绑定,只需要绑定一次即可(直接绑定到模板上)
// bindValue(): 值绑定, 实时映射,变量的变化或在实时的映射到占位符上,因此每一次都必须重新赋值
// 值绑定实时性,直观好理解,但是操作非常麻烦,可以给execute()传参来简化它。----- 最后这种事最简化的值绑定。
$stmt->execute(['小花','xh@php.cn', sha1('567')]);
if ($stmt->rowCount() > 0) echo '新增成功 ' . $stmt->rowCount() . ' 条记录,主键id: ' . $pdo->lastInsertId();
// 3. 关闭
// $pdo = null;
unset($pdo);
4-2. pdo - 删(delete)
<?php
// pdo删除操作
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'DELETE FROM `users` WHERE `id` = ?;';
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute([42]);
if ($stmt->rowCount() > 0) echo '删除成功 ' . $stmt->rowCount() . ' 条记录';
// 3. 关闭
$pdo = null;
4-3. pdo - 改(update)
<?php
// pdo更新操作
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'UPDATE `users` SET `name`=?, `email`= ?, `password`=? WHERE `id` = ?;';
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute(['小龙人','xlr@php.cn', sha1('1234567'), 42]);
if ($stmt->rowCount() > 0) echo '更新成功 ' . $stmt->rowCount() . ' 条记录';
// 3. 关闭
$pdo = null;
4-4. pdo - 查(select)
4-4-1. fetch() + while()
<?php
// pdo查询操作: fetch() + while()
// 1. 连接
require 'connect.php';
// 2. 操作
$sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute([30]);
while ($user = $stmt->fetch()) {
vprintf('<li>%s: %s | %s</li>', $user);
}
// 3. 关闭
$pdo = null;
4-4-2. fetchAll() + foreach()
$sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute([40]);
$users = $stmt->fetchAll();
foreach ($users as $user) {
vprintf('<li>%s: %s | %s</li>', $user);
}
4-4-3. bindColumn() + fetch() + while()
$sql = 'SELECT `id`,`name`,`email` FROM `users` WHERE `id` >= ?;';
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute([30]);
// 将三个字段与三个变量绑定,变量名自己定义。
$stmt->bindColumn('id', $id);
$stmt->bindColumn('name', $name);
$stmt->bindColumn('email', $email);
while ($stmt->fetch(PDO::FETCH_BOUND)) {
printf('<li>%s: %s | %s</li>',$id, $name, $email);
}
// 获取记录数量比较难,可以用下面的方式来实现。
// echo $stmt->rowCount();
$sql = 'SELECT COUNT(`id`) AS `count` FROM `users` WHERE `id` >= ?;';
$stmt = $pdo->prepare($sql);
// 将值直接绑定到匿名占位符?上面
$stmt->execute([30]);
$stmt->bindColumn('count', $count);
$stmt->fetch(PDO::FETCH_BOUND);
echo '满足条件的记录数量'. $count;
5. 总结部分(php数据操作)
5-1. 基本步骤
序号 |
步骤 |
描述 |
1 |
连接数据库 |
创建数据库连接对象的过程$mysqli 或$pdo |
2 |
操作数据表 |
SELECT 查询/INSERT 新增/UPDATE 更新/DELETE 删除 |
3 |
释放结果集[可选] |
仅针对查询操作有效,清空查询结果的过程 |
4 |
关闭数据库连接 |
实际上是销毁数据库连接对象的过程 |
- 写操作(INSERT/UPDATE/DELETE): 返回受影响的记录数量(整数)
- 读操作(SELECT/DESC…): 返回查询结果集(二维关联数组)
5-2. 连接参数
序号 |
参数 |
描述 |
1 |
type |
数据库类型 |
2 |
host |
默认数据库主机名 |
3 |
dbname |
默认数据库名称 |
4 |
charset |
默认字符集 |
5 |
port |
默认端口号 |
6 |
username |
默认用户名 |
7 |
password |
默认用户密码 |
5-3. mysqli
仅介绍 mysqli 面向对象 + 预处理
5-3.1 mysqli
接口
序号 |
属性/方法 |
描述 |
1 |
connect_errno |
连接错误编码 |
2 |
connect_error |
连接错误信息 |
3 |
set_charset |
设置字符集 |
4 |
prepare |
创建mysqli_stmt 对象 |
5-3.2 mysqli_stmt
接口
序号 |
属性/方法 |
描述 |
1 |
bind_param() |
占位符与变量绑定 |
2 |
bind_result() |
字段与变量绑定 |
3 |
execute() |
执行 SQL 语句 |
4 |
get_result() |
创建mysqli_result 对象 |
5 |
fetch() |
遍历变量中的字段 |
6 |
close() |
关闭预处理查询 |
7 |
affected_rows |
受影响记录数量 |
8 |
insert_id |
新增记录主键 id |
9 |
errno |
错误编号 |
10 |
error |
错误信息 |
5-3.3 mysqli_result
接口
序号 |
属性/方法 |
描述 |
1 |
fetch_assoc() |
以关联数组返回一条记录 |
2 |
fetch_all() |
获取全部记录 |
3 |
num_rows |
结果集记录数量 |
4 |
free() |
释放结果集 |
5-4. pdo
仅介绍 pdo 预处理
5-4.1 PDO
接口
序号 |
属性/方法 |
描述 |
1 |
setAttribute() |
设置属性 |
2 |
lastInsertId() |
最后插入记录的主键 id |
3 |
prepare() |
创建PDOStatement 对象 |
5-4.2 PDOStatement
接口
它的实例与一条预处理语句对应, 上面定义了许多实用的方法
序号 |
属性/方法 |
描述 |
1 |
setAttribute() |
设置属性 |
2 |
lastInsertId() |
最后插入记录的主键 id |
3 |
prepare() |
创建PDOStatement 对象 |
- 后面很多内容跟mysqli类似,不展开了。还是要在实战中不断锻炼,琢磨每个方法或属性。
最后附上mysqli、PDO之前的几张图(在第10次课的文件夹中)。

![
]
