数据库的CURD操作:增删改查
1.新增
//新增
<?php
namespace php;
//导入数据库链接文件
require __DIR__ . '/config/conn.php';
//PDO预处理
$sql = 'INSERT `student` SET `name`=?,`sex`=?,`email`=? ';
//prepare:准备要执行的语句,并返回语句对象
$stmt = $db ->prepare($sql);
//execute:执行一条预处理语句
$stmt = execute(['小龙女',1,'xiaolongnv@php.cn']);
$stmt = execute(['洪七公',0,'hongqigong@php.cn']);
$stmt = execute(['黄蓉',1,'huangrong@php.cn']);
//!rowCount:返回受上一个 SQL 语句影响的行数
//!lastInserId:获取新增数据的ID
//!errorInfo():获取跟上一次语句句柄操作相关的扩展错误信息
if($stmt ->rowCount()>0){
echo '新增成功,新增记录的主键ID为:'.$db ->lastInsertId();
}else{
echo '新增失败';
print_r($stmt -> errorInfo());
}
//输出结果:新增成功,新增记录的主键ID= 3
2.更改
//更改
<?php
namespace php;
require __DIR__ . '/config/conn.php';
$sql = 'UPDATE `student` SET `name`=? WHERE `id`=? ';
$stmt = $db ->prepare($sql);
$stmt -> execute(['郭靖',3]):
if($stmt ->rowCount>0){
echo '更新成功';
}else{
echo '更新失败';
print_f($stmt->errorInfo());
}
//输出结果:更新成功
3.删除
//删除(内部)
<?php
namespace php;
require __DIR__ . '/config/conn.php';
$sql = 'DELETE FROM `student` WHERE `id`=?';
$stmt = $db ->prepare($sql);
$stmt -> execute([8]);
if($stmt ->rowCount()>0){
echo '删除成功';
}else{
echo '删除失败';
print_r($stmt ->errorInfo());
}
//输出结果:删除成功
//删除(外部)
<?php
namespace php;
require __DIR__ . '/config/conn.php';
$sql = 'DELETE FROM `student` WHERE `id`=:id';
$stmt = $db ->prepare($sql);
$stmt -> execute([':id'=>$_GET['id']]);//id=7
if($stmt ->rowCount()>0){
echo '删除成功';
}else{
echo '删除失败';
print_r($stmt ->errorInfo());
}
//输出结果:删除成功
4.查询
<?php
namespace php;
use PDO;
require __DIR__ .'/config/conn.php';
$sql = 'SELECT `id`,`name` FROM `student` WHERE' `id`>?;
$stmt = $db->prepare($sql);
$stmt ->execute([10]);
//单条查询
$staff = $stmt ->fetch(PDO::FETCH_ASSOC);
printf('<pre>%s</pre>',print_r($staff,true));
echo '<hr>';
echo '下面为多条查询';
//多条查询
while($staff = $stmt ->fetch(PDO::FETCH_ASSOC)){
printf('<pre>%s</pre>',print_r($staff,true));
}
PDO本质与原理
本质:PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。
原理:PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。
预处理作用
查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快
提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。