0211作业-mysqli基础和接口实战-php培训十期线上班
1. mysqli常见的CURD(增删改查)操作
1.1 用mysqli_stmt类面对对象风格插入数据
//准备需要插入的数据
$arr = [
['杨过','yangguo@php.cn',sha1('123456'),time()],
['段誉','duanyu@php.cn',sha1('123456'),time()],
['虚竹','xuzhu@php.cn',sha1('123456'),time()],
['乔峰','qiaofeng@php.cn',sha1('123456'),time()],
];
//第一步实例化mysql对象
$db = new mysqli('localhost','root1','root123','test');
//第二步调用mysqli中的stmt_init方法,得到预处理对象
$stmt = $db->stmt_init();
//准备增加数据库记录的SQL语句
$sql = 'INSERT `new_user` SET `name`=?, `email`=?, `password`=?, `regs_time`=?';
//调用预处理对象中的prepare()方法对SQL语句进行预处理
$stmt->prepare($sql);
//因为SQL语句中使用了占位符,需要进行参数绑定,这里参数类型中标明的参数个数与后面变量的数量必须一致
$stmt->bind_param('sssi',$name,$email,$password,$time);
//调用预处理对象中的execute方法执行SQL语句
foreach($arr as $value):
//将变量和数组里的值一一绑定
list($name,$email,$password,$time)=$value;
$stmt->execute();
if($stmt->affected_rows === 1)
$i += $stmt->affected_rows;
else
echo $stmt->error;
endforeach;
//输出收影响的记录数
echo '增加了'.$i.'条记录'.'<br>';
//输出最后一条记录的主键ID
echo '最后一条记录的主键ID是:'.$stmt->insert_id;
//关闭预处理对象
$stmt->close();
1.2 用mysqli_stmt类面对对象风格查询数据(用结果集类)
//通过mysqli_stmt的方式查询
//第一步实例化mysql对象
$db = new mysqli('localhost', 'root1', 'root123', 'test');
//第二步调用mysqli中的stmt_init方法,得到预处理对象
$stmt = $db->stmt_init();
//准备增加数据库记录的SQL语句
$sql = 'SELECT `id`,`name`,`email` FROM `new_user` WHERE `id`>?;';
//调用预处理对象中的prepare()方法对SQL语句进行预处理
$stmt->prepare($sql);
//因为SQL语句中使用了占位符,需要进行参数绑定
$stmt->bind_param('i',$id);
$id = 2;
//需要先执行SQL语句,再得到结果集对象
//执行SQL语句
$stmt->execute();
//得到一个结果集对象,
$result = $stmt->get_result();
//从结果集中单条输出,输出一次指针下移一位
//$result->fetch_array();//返回一条数据,是既有索引又有关联的数组
//$result->fetch_row();//返回一条数据,是索引数组
//$result->fetch_assoc();//返回一条数据,是关联数组
while($user=$result->fetch_assoc()){
echo "{$user['id']}|{$user['name']}===>{$user['email']}<br>";
}
//将指针归零
$result->data_seek(0);
//返回所有数据,是索引数组
//$result->fetch_all();
//返回所有数据,是关联数组
//$result->fetch_all(MYSQLI_ASSOC);
$users = $result->fetch_all(MYSQLI_ASSOC);
foreach($users as $user){
echo "{$user['id']}|{$user['name']}===>{$user['email']}<br>";
}
//释放结果集对象,这里是用结果集对象$result
$result->free_result();
//关闭预处理对象
$stmt->close();
1.3 用mysqli_stmt类面对对象风格更新数据
//准备需要更新的数据
$arr = [
['杨过', 'yangguo@sina.com', sha1('12345678')],
['虚竹', 'xuzhu@gmail.com', sha1('12345678')],
];
//第一步实例化mysql对象
$db = new mysqli('localhost', 'root1', 'root123', 'test');
//第二步调用mysqli中的stmt_init方法,得到预处理对象
$stmt = $db->stmt_init();
//准备增加数据库记录的SQL语句
$sql = 'UPDATE `new_user` SET `email`=?,`password`=? WHERE `name`=?;';
//调用预处理对象中的prepare()方法对SQL语句进行预处理
$stmt->prepare($sql);
//因为SQL语句中使用了占位符,需要进行参数绑定
$stmt->bind_param('sss', $email, $password, $name);
//将变量和数组里的值一一绑定
foreach ($arr as $value):
//将变量和数组里的值一一绑定
list($name, $email, $password,) = $value;
$stmt->execute();
if ($stmt->affected_rows === 1)
echo '更新成功';
else
echo '更新失败';
endforeach;
//关闭预处理对象
$stmt->close();
1.4 用mysqli_stmt类面对对象风格删除数据
//第一步实例化mysql对象
$db = new mysqli('localhost', 'root1', 'root123', 'test');
//第二步调用mysqli中的stmt_init方法,得到预处理对象
$stmt = $db->stmt_init();
//准备增加数据库记录的SQL语句
$sql = 'DELETE FROM `new_user` WHERE `id`=?;';
//调用预处理对象中的prepare()方法对SQL语句进行预处理
$stmt->prepare($sql);
//因为SQL语句中使用了占位符,需要进行参数绑定
$stmt->bind_param('i', $id);
for($i=10;$i<29;$i++){
$id = $i;
$stmt->execute();
}
if ($stmt->affected_rows === 1)
echo '删除成功';
else
echo '删除失败'.$stmt->error;
//关闭预处理对象
$stmt->close();
2.接口实战项目
- 接口实战项目要求:通过接口的方式,来将PDO和MySqli两种数据库操作进行封装,使用户不用关注具体的实现方法。
2.1 项目步骤
- 定义接口:定义常量接口、连接对象接口、增删改查接口,其中增删改查接口继承自常量定义接口和连接对象接口。
- 实现接口:一是用PDO的方式来实现增删改查接口;二是用MySqli的方式实现增删改查接口。
- 基于接口的通用类:用基于接口的方式,定义一个通用类,实现具体增删改查方式的隔离或封装。
- 演示验证:用不同方式验证增删改查的操作是否正常。
2.2 定义接口
//定义数据库操作接口
namespace part1;
//定义参数接口
interface iDbPaparms{
const HOST = 'localhost';
const TYPE = 'mysql';
const USER_NAME = 'root1';
const PASSWORD = 'root123';
const CHARSET = 'utf8';
const DBNAME = 'test';
}
//定义初始化接口
interface iDbLink{
public function __construct(...$linkPaparm);
}
//定义数据库常用操作增删改查接口
interface iCURD extends iDbPaparms,iDbLink {
//新增
public function insert(array $data):string;
//查询
public function select(string $where=null);
//更新
public function update(array $data,string $where=null):string;
//删除
public function delete(string $where=null):string;
}
2.3 PDO方式实现CURD
//用PDO的方式实现数据库操作接口
namespace part1;
require 'demo1.php';
//导入PDO
use PDO;
class Db_PDO implements iCURD{
//定义一个私有对象
private $pdo=null;
//实现构造方法
public function __construct(...$linkPaparm)
{
list($dsn,$username,$password)=$linkPaparm;//曾经出错的地方,默写时忘记了
$this->pdo = new PDO($dsn,$username,$password);//曾经出错的地方,没有用this,导致对象为空
}
//实现新增方法
public function insert(array $data): string
{
// TODO: Implement insert() method.
//准备sql语句
$sql = "INSERT `new_user` SET `name`=?,`email`=?,`password`=?,`regs_time`=?";
//调用prepare方法得到PDOStatement预处理对象
$stmt = $this->pdo->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句
$stmt->execute($data);
//判断新增结果
return $stmt->rowCount()===1 ? '新增成功':'新增失败';
}
//实现查询方法
public function select(string $where = null)
{
// TODO: Implement select() method.
//准备sql语句
$where = empty($where) ? $where : ' WHERE '.$where;
$sql = "SELECT * FROM `new_user` {$where};";
echo $sql;
//调用prepare方法得到PDOStatement预处理对象
$stmt = $this->pdo->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句,得到结果集对象
$stmt->execute();
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
//实现更新方法
public function update(array $data, string $where = null): string
{
// TODO: Implement updata() method.
//将$data转换成字符串
$paparm = '';
foreach($data as $key=>$value){
$paparm .= "`{$key}`='{$value}',";
}
$paparm = rtrim($paparm,',');
//准备sql字符串
$sql = "UPDATE `new_user` SET {$paparm} WHERE {$where};";
//调用prepare方法得到PDOStatement预处理对象
$stmt = $this->pdo->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句
$stmt->execute();
//判断更新结果
return $stmt->rowCount()>=1 ? '更新成功':'更新失败';
}
//实现删除方法
public function delete(string $where = null): string
{
// TODO: Implement delete() method.
//准备sql语句
$sql = "DELETE FROM `new_user` WHERE {$where}";
//调用prepare方法得到PDOStatement预处理对象
$stmt = $this->pdo->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句
$stmt->execute();
//判断删除结果
return $stmt->rowCount()>=1 ? '删除成功':'删除失败';
}
}
2.4 MySqli方式实现CURD
//用mysqli的方式实现数据库操作接口
namespace part1;
//加载接口声明
require 'demo1.php';
//导入mysqli
use mysqli;
class Db_Mysqli implements iCURD{
//定义一个私有对象
private $mysqli=null;
//实现构造方法
public function __construct(...$linkPaparm)
{
list($host,$username,$password,$dbname)=$linkPaparm;//曾经出错的地方,默写时忘记了
$this->mysqli = new mysqli($host,$username,$password,$dbname);//曾经出错的地方,没有用this,导致对象为空
// 设置默认字符集
$this->mysqli -> set_charset('utf8');
}
//实现新增方法
public function insert(array $data): string
{
// TODO: Implement insert() method.
//准备sql语句
$sql = "INSERT `new_user` SET `name`=?,`email`=?,`password`=?,`regs_time`=?";
//调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
//如果用了stmt_init(),任何其后调用的mysqli_stmt函数都会失败,直到mysqli_stmt_prepare()被调用.
$stmt = $this->mysqli->stmt_init();
//调用mysqli_stmt类的prepare预处理SQL语句
$stmt->prepare($sql);
//调用mysqli_stmt类的bind_Paparm绑定参数,这个只能在prepare之后
$stmt->bind_param('ssss',$name,$email,$password,$regs_time);
list($name,$email,$password,$regs_time)=$data;
//调用mysqli_stmt类的execute方法执行SQL语句
$stmt->execute();
//判断新增结果
return $stmt->affected_rows===1 ? '新增成功':'新增失败';
}
//实现查询方法
public function select(string $where = null)
{
// TODO: Implement select() method.
//准备sql语句
$where = empty($where) ? $where : ' WHERE '.$where;
$sql = "SELECT * FROM `new_user` {$where};";
//调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
$stmt = $this->mysqli->stmt_init();
//调用mysqli_stmt类的prepare预处理SQL语句
$stmt->prepare($sql);
//上面两条语句可以合并成下面一条,因为prepare返回的就是mysqli_stmt类的对象实例
//$stmt = $this->mysqli->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句,得到结果集对象
$stmt->execute();
//获得结果集对象,以便用stmt_result类来获取查询结果
$result = $stmt->get_result();
//调用stmt_result的fetch_all方法设置MYSQLI_ASSOC获得关联数组
$datas = $result->fetch_all(MYSQLI_ASSOC);
//释放结果集对象
$result->free_result();
//释放预处理对象
$stmt->close();
return $datas;
}
//实现更新方法
public function update(array $data, string $where = null): string
{
// TODO: Implement updata() method.
//将$data转换成字符串
$paparm = '';
foreach($data as $key=>$value){
$paparm .= "`{$key}`='{$value}',";
}
$paparm = rtrim($paparm,',');
//准备sql字符串
$sql = "UPDATE `new_user` SET {$paparm} WHERE {$where};";
//调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
$stmt = $this->mysqli->stmt_init();
//调用mysqli_stmt类的prepare预处理SQL语句
$stmt->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句,得到结果集对象
$stmt->execute();
//判断更新结果
return $stmt->affected_rows>=1 ? '更新成功':'更新失败';
}
//实现删除方法
public function delete(string $where = null): string
{
// TODO: Implement delete() method.
//准备sql语句
$sql = "DELETE FROM `new_user` WHERE {$where}";
//调用mysqli类的stmt_init方法得到mysqli_stmt类预处理对象实例
$stmt = $this->mysqli->stmt_init();
//调用mysqli_stmt类的prepare预处理SQL语句
$stmt->prepare($sql);
//调用PDOStatement的execute方法执行SQL语句,得到结果集对象
$stmt->execute();
//判断删除结果
return $stmt->affected_rows>=1 ? '删除成功':'删除失败';
}
}
2.5 通用类
//设立通用调用接口类
namespace part1;
use part1\iCURD;
class Db{
//新增
public static function insert(iCURD $db,array $data):string{
return $db->insert($data);
}
//查询
public static function select(iCURD $db,string $where=null){
return $db->select($where);
}
//更新
public static function updata(iCURD $db,array $data,string $where=null):string{
return $db->update($data,$where);
}
//删除
public static function delete(iCURD $db,string $where=null):string{
return $db->delete($where);
}
}
2.6 代码验证
namespace part2;
require 'demo4.php';
//require 'demo2.php';
require 'demo3.php';
//use part1\Db_PDO;
use part1\Db_Mysqli;
use part1\iDbPaparms;
use part1\Db;
use part1\iCURD;
//--------------------测试Db_PDO-------------------------------------------//
//$dsn = iDbPaparms::TYPE.':host='.iDbPaparms::HOST.';dbname='.iDbPaparms::DBNAME;
//$links = new Db_PDO($dsn,iDbPaparms::USER_NAME,iDbPaparms::PASSWORD);
//测试新增
//echo DB::insert($links,['赵敏','zhaomin1@php.cn',sha1('123456'),date('Y-m-d',time())]);
//测试查询
//$result = DB::select($links,"name='赵敏'");
//print_r($result);
//测试更新
//echo DB::updata($links,['regs_time'=>date('Y-m-d',time())],"name = '赵敏'");
//测试删除
//echo DB::delete($links,"name = '赵敏'");
//----------------测试Db_Mysqli--------------------------------------------//
//echo iDbPaparms::HOST,iDbPaparms::USER_NAME,iDbPaparms::PASSWORD,iDbPaparms::DBNAME;
//$links = new Db_Mysqli(iDbPaparms::HOST,iDbPaparms::USER_NAME,iDbPaparms::PASSWORD,iDbPaparms::DBNAME);
//echo DB::insert($links,['赵敏','zhaomin1@php.cn',sha1('123456'),date('Y-m-d',time())]);
//测试查询
//$result = DB::select($links,"name='杨过'");
//print_r($result);
//测试更新
//echo DB::updata($links,['email'=>'yangguo@php.cn'],"name = '杨过'");
//测试删除
//echo DB::delete($links,"id = 53");
3.手抄代码
老师,试了很多次,图片传不上去。