1. 配置文件
config.php
<?php
// 配置文件
// 写法一:常量的方式
// define('DB_TYPE','mysql');
// define('DB_HOST','php.edu');
// define('DB_USER','root');
// define('DB_PWD','root');
// define('DB_NAME','first');
// define('PORT','3306');
// define('DB_CHARSET','uft-8');
// define('DB_DSN',DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME.':charset='.DB_CHARSET);
// $dsn = 'mysql:host=php.edu;dbname=first;charset=utf8;port=3306';
// 写法二:返回数组的方式
return [
'type' => $type ?? 'mysql',
'host' => $host ?? 'php.edu',
'username' => $username ?? 'root',
'password' => $password ?? 'root',
'dbname' => $dbname ?? 'first',
'port' => $port ?? '3306',
'charset' => $charset ?? 'utf8',
''
];
2.使用Mysqli操作数据库
2.1 连接数据库
connect.php
<?php
// 连接数据库
// 1. 引入配置文件,得到一个关联数组
$config = require __DIR__ ."/../config.php";
// 2. 将关联数组拆分为独立变量
extract($config);
// 3. 建立连接对象
$mysqli = new mysqli($host,$username,$password,$dbname,$port);
// 4. 错误检查
if ($mysqli->connect_errno) {
die('连接错误: '. $mysqli->connect_error);
}
// 5. 设置编码方式
$mysqli->set_charset($charset);
2.2 插入数据
<?php
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
// $sql = 'INSERT INTO `ta_users` (`username`,`password`) VALUES (?,?)';
$sql = 'INSERT `ta_users` SET `username`=?,`password`=?';
$stmt = $mysqli->prepare($sql);
// 插入方式一:直接给绑定的变量赋值
// $username = '妞妞';
// $password = md5('123456789');
// $stmt->bind_param('ss',$username,$password);
// $stmt->execute();
// printf('新增了 %s 条记录,是第 %d 位用户',$stmt->affected_rows,$stmt->insert_id);
// 插入方式二:数组的形式
// $user = [
// 'username' => '猪猪',
// 'password' => md5('88888'),
// ];
// extract($user);
// $stmt->bind_param('ss',$username,$password);
// $stmt->execute();
// printf('新增了 %s 条记录,是第 %d 位用户',$stmt->affected_rows,$stmt->insert_id);
// 插入方式三:以二维数组的方式同时插入多条记录
$users = [
['username'=>'小黄人','password'=>md5('123')],
['username'=>'佩奇先生','password'=>md5('456')],
['username'=>'布兰达','password'=>md5('852')],
];
foreach ($users as $user) {
extract($user);
$stmt->bind_param('ss',$username,$password);
if ($stmt->execute()) {
printf('新增了 %s 条记录,是第 %d 位用户<br>',$stmt->affected_rows,$stmt->insert_id);
}else{
echo '新增失败 ,'. $stmt->errno . ':' . $stmt->error;
}
}
// 3. 关闭
$mysqli->close();
2.3 更新数据
<?php
// 更新数据
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'UPDATE `ta_users` SET `username`=? WHERE `id`=?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('si',$username,$id);
$user = ['username'=>'牙擦苏','id'=>21];
extract($user);
$stmt->execute();
echo '更新了 '.$stmt->affected_rows.' 条记录,'.'是第 '.$id.' 位用户';
// 3. 关闭
$mysqli->close();
2.4 删除数据
<?php
// 删除数据
// 1. 连接
require __DIR__.'/connect.php';
// 2.操作
$sql = 'DELETE FROM `ta_users` WHERE `id`>?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i',$id);
$id = 15;
$stmt->execute();
printf('被删除的记录有 %s 条',$stmt->affected_rows);
// 3. 关闭
$mysqli->close();
2.5 查询数据
<?php
// 数据查询,方式一:使用 while() + fetch_assoc()
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'SELECT * FROM `ta_users` WHERE `id`>=?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i',$id);
$id = 10;
$stmt->execute();
// 获取结果集
$res = $stmt->get_result();
if ($res->num_rows === 0) {
exit('未查询到结果');
}else{
while($user = $res->fetch_assoc()) {
vprintf('%d ---- %s : %s <br>',$user);
}
}
// 释放结果集
$res->free();
// 3. 关闭
$mysqli->close();
<?php
// 数据查询,方式二:使用 foreach() + fetch_all()
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'SELECT * FROM `ta_users` WHERE `id`>=? AND `id`<=?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('ii',$id1,$id2);
$ids = ['id1'=>1,'id2'=>4];
extract($ids);
$stmt->execute();
// 获取结果集
$res = $stmt->get_result();
if ($res->num_rows === 0) {
exit('未获取到查询结果');
}else{
$users = $res->fetch_all(MYSQLI_ASSOC);
foreach ($users as $user) {
vprintf('%d ---- %s : %s <br>',$user);
}
}
// 释放结果集
$res->free();
// 3. 关闭
$mysqli->close();
<?php
// 数据查询,方式三:使用bind_result() + fetch() + while()
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'SELECT `id`,`username`,`password` FROM `ta_users` WHERE `id`>=?';
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('i',$id);
$id = 10;
$stmt->execute();
// 执行得到结果后,将查询的每个字段分别与变量绑定
$stmt->bind_result($id,$username,$password);
// 当前操作并没有结果集对象,所以想要获取受影响的行数,需向如下操作:
$stmt->store_result();
if ($stmt->num_rows === 0) {
exit('未获取到查询结果');
}else{
while ($stmt->fetch()) {
printf('%d ---- %s : %s <br>', $id, $username, $password);
}
}
// 3. 关闭
$mysqli->close();
3. 使用PDO操作数据库
3.1 连接数据库
<?php
// 连接数据库
$config = require __DIR__.'/../config.php';
extract($config);
// 数据源名称 (模板)
// $dsn = 'mysql:host=php.edu;dbname=first;charset=utf8;port=3306';
// 写法一:拼接的方式
// $dsn = $type.':host='.$host.';dbname='.$dbname.';charset='.$charset.';port='.$port;
// 写法二:使用sprintf()的返回值
$dsn = sprintf('%s:host=%s;dbname=%s;charset=%s;port=%s',$type,$host,$dbname,$charset,$port);
// 创建pdo对象,方式一:直接创建
// $pdo = new PDO($dsn,$username,$password);
// 创建pdo对象,方式二:使用try{...}catch(...){...}模块
try {
$pdo = new PDO($dsn,$username,$password);
} catch (Throwable $e) {
exit($e->getMessage());
} catch (PDOException $e) {
exit($e->getMessage());
}
3.2 插入数据
<?php
// PDO 插入数据
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'INSERT `ta_users` SET `username`=?,`password`=?';
$stmt = $pdo->prepare($sql);
// 绑定方式一:占位符?与变量名绑定(引用绑定)
// $stmt->bindParam(1,$username);
// $stmt->bindParam(2,$password);
// $user = [
// 'username'=>'西门吹雪',
// 'password'=>md5('456'),
// ];
// extract($user);
// $stmt->execute();
// 绑定方式二:占位符?与值绑定
// $stmt->bindValue(1,'花无缺');
// $stmt->bindValue(2,md5('789'));
// $stmt->execute();
// 绑定方式三:值绑定时可以直接在$stmt->execute()中传参,参数为一个数组
$stmt->execute(['上官大人',md5('666')]);
echo $stmt->rowCount()>0 ? '新增成功,是第 '.$pdo->lastInsertId().' 位用户' : '新增失败:';
// 3. 关闭
// 方式一:销毁变量
// unset($pdo);
// 方式二:变量赋值为null
$pdo = null;
3.3 更新数据
<?php
// 更新数据
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
// 不指定 WHERE 的话,会影响整个数据表
$sql = 'UPDATE `ta_users` SET `username`=?';
$stmt = $pdo->prepare($sql);
$stmt->execute(['憨豆先生']);
echo '受影响的记录有 '.$stmt->rowCount().' 条';
// 指定 WHERE
$sql = 'UPDATE `ta_users` SET `username`=? WHERE `id`>? ';
$stmt = $pdo->prepare($sql);
$stmt->execute(['大头',10]);
echo '受影响的记录有 '.$stmt->rowCount().' 条';
// 3. 关闭
$pdo = null;
3.4 删除数据
<?php
// 删除数据
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'DELETE FROM `ta_users` WHERE `username`=?';
$stmt = $pdo->prepare($sql);
$stmt->execute(['憨豆先生']);
echo '受影响的记录有 '.$stmt->rowCount().' 条';
// 3. 关闭
$pdo = null;
3.5 查询数据
<?php
// 数据查询,方式一:使用 foreach() + fetchAll()
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'SELECT `id`,`username`,`sex`,`tel` FROM `student` WHERE `id`>?';
$stmt = $pdo->prepare($sql);
$stmt->execute([1]);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($users as $user){
vprintf('%s --- %s --- %s --- %s <br>',$user);
}
// 3. 关闭
$pdo = null;
<?php
// 数据查询,方式二:使用 while() + fetch()
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'SELECT `id`,`username`,`sex`,`tel` FROM `student` WHERE `id`>?';
$stmt = $pdo->prepare($sql);
$stmt->execute([1]);
while($user = $stmt->fetch(PDO::FETCH_ASSOC)){
vprintf('%s --- %s --- %s --- %s <br>',$user);
}
// 3. 关闭
$pdo = null;
<?php
// 数据查询,方式三:使用 bindColumn() + fetch() + while()
// 1. 连接
require __DIR__.'/connect.php';
// 2. 操作
$sql = 'SELECT `id`,`username`,`sex`,`tel` FROM `student` WHERE `id`>?';
$stmt = $pdo->prepare($sql);
$stmt->bindColumn('id',$id);
$stmt->bindColumn('username',$username);
$stmt->bindColumn('sex',$sex);
$stmt->bindColumn('tel',$tel);
$stmt->execute([1]);
while ($stmt->fetch(PDO::FETCH_BOUND)) {
printf('%s | %s | %s | %s <br>',$id, $username, $sex,$tel);
}
// 不能直接使用rowCount()获取记录数量,需如下使用:
$sql = 'SELECT COUNT(`id`) AS `count` FROM `student` WHERE `id` > ?;';
$stmt = $pdo->prepare($sql);
$stmt->execute([1]);
$stmt->bindColumn('count', $count);
$stmt->fetch(PDO::FETCH_BOUND);
echo '<br>满足条件的记录数量有 '. $count.' 条';
// 3. 关闭
$pdo = null;
4. 操作数据库总结
4.1. 通用步骤
序号 |
步骤 |
描述 |
1 |
连接数据库 |
使用 mysqli 或 pdo 对象连接 |
2 |
操作数据表 |
sql语句:SELECT 查询、INSERT 新增、UPDATE 更新、DELETE 删除 |
3 |
获取以及释放结果集[可选] |
若是查询操作,获得结果时才会选择释放,与其他操作无关 |
4 |
关闭数据库连接 |
实际上就是销毁数据库连接对象 |
4.2 连接参数
序号 |
参数 |
描述 |
1 |
type |
数据库的类型 |
2 |
host |
数据库的主机名 |
3 |
dbname |
数据库的名称 |
4 |
charset |
设置编码方式 |
5 |
port |
端口号 |
6 |
username |
数据库用户名 |
7 |
password |
数据库密码 |
4.3 mysqli
4.3.1 mysqli对象
序号 |
属性/方法 |
描述 |
1 |
connect_errno |
连接错误信息的编码 |
2 |
connect_error |
连接错误的具体信息 |
3 |
set_charset |
设置编码方式 |
4 |
prepare |
能得到mysqli_statement对象 |
4.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 |
错误信息 |
4.3.3 mysqli_result对象
序号 |
属性/方法 |
描述 |
1 |
fetch_assoc() |
以关联数组的形式返回结果 |
2 |
fetch_all() |
获取结果集,通常会传参数 MYSQLI_ASSOC 得到一个二维关联数组 |
3 |
num_rows |
受影响的行数 |
4 |
free() |
释放结果集 |
4.4 pdo
4.4.1 PDO对象
序号 |
属性/方法 |
描述 |
1 |
setAttribute() |
设置属性 |
2 |
lastInsertId() |
获取最后插入的记录的主键id |
3 |
prepare() |
预处理,得到一个PDOStatement对象 |
4.4.2 PDOStatement对象
序号 |
属性/方法 |
描述 |
1 |
execute() |
执行预处理语句,也可以传参,用于值绑定 |
2 |
fetchAll() |
获取结果集,通常会传参数 PDO::FETCH_ASSOC 得到一个二维关联数组 |
3 |
fetch() |
获取结果,通常会传参 PDO::FETCH_ASSOC 得到关联数组 |
4 |
bindColumn() |
绑定每个字段到对应的变量 |
5 |
rowCount() |
受影响的行数 |
6 |
bindParam() |
绑定占位符与变量名 |
7 |
bindValue() |
绑定占位符与值 |
Correcting teacher:天蓬老师
Correction status:qualified
Teacher's comments:总结内容希望记住,多写多看