• Welcome to Journal web site.

我是 PHP 程序员

- 开发无止境 -

Next
Prev

第8章 数据库的CURD操作,PDO的本质与原理【缺课】

Data: 2016-05-07 20:10:58Form: JournalClick: 1

数据库的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));
}

image.png

PDO本质与原理

  1. 本质:PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。

  2. 原理:PDO 提供了一个 数据访问 抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。 PDO 不提供 数据库 抽象层;它不会重写 SQL,也不会模拟缺失的特性。


预处理作用

  1. 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析/编译/优化周期。简言之,预处理语句占用更少的资源,因而运行得更快

  2. 提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。


PHP中实例演示CURD操作

<?php
namespace php_edu;

use PDO;

/**
 * 数据库常用操作
 * 1. 读操作: select
 * 2. 写操作: insert,update,delete
 * 简称: CURD, 增删改查
 */
// 1. 连接数据库
require __DIR__ . '/config/connect.php';
// 2. CURD: INSERT
/**
 * PDO预处理
 * 为什么要用预处理?
 * 1. 防止SQL注入攻击, 2. 数据延迟绑定
 * (编程时只写SQL语句模板,执行SQL时再给占位符绑定真实数据)
 * 预处理过程:
 * 1. 创建SQL语句模板对象: 数据使用占位符表示
 * 2. 执行SQL语句,根据操作类型(写/读),读返回结果集/数组, 写返回受影响的记录数量
 */
// INSERT 插入
// INSERT 表名 SET 字段1=值1, 字段2=值2, ....
// SQL语句的推荐规范:
// 1. 关键字全大写
// 2. 表名,字段名使用反引号做为定界符
$sql = 'INSERT `myhome` SET `name` = ?, `sex` = ?, `email` = ?';
// 1. 创建SQL语句模板对象
$stmt = $db->prepare($sql);
// var_dump($stmt);
// 2. 执行SQL语句
$stmt->execute(['爸爸', 0, 'father@qq.com']);
$stmt->execute(['妈妈', 1, 'mother@qq.com']);
$stmt->execute(['爷爷', 0, 'grandpa@qq.com']);
$stmt->execute(['奶奶', 1, 'grandma@qq.com']);
$stmt->execute(['哥哥', 0, 'brother@qq.com']);
$stmt->execute(['姐姐', 1, 'sister@qq.com']);
$stmt->execute(['我自己', 0, 'myself@qq.com']);
// 成功
// $stmt->rowCount(): 返回受影响的记录数量
if ($stmt->rowCount() > 0) {
    echo '新增成功, 新增记录的主键ID = ' . $db->lastInsertId();
} else {
    echo '新增失败';
    print_r($stmt->errorInfo());
}
// 2. CURD: UPDATE 更新
$sql = 'UPDATE `myhome` SET `name` = ? WHERE `id` = ?';
$stmt = $db->prepare($sql);
$stmt->execute(['夏天', 1]);
if ($stmt->rowCount() > 0) {
    echo '更新成功';
} else {
    echo '更新失败';
    print_r($stmt->errorInfo());
}
echo '<hr>';
// 3. CURD: DELETE 删除
$sql = 'DELETE FROM `myhome`  WHERE `id` = ?';
$stmt = $db->prepare($sql);
$stmt->execute([2]);
if ($stmt->rowCount() > 0) {
    echo '删除成功';
} else {
    echo '删除失败';
    print_r($stmt->errorInfo());
}
echo '<hr>';
// 4. CURD: SELECT 单条查询
// SELECT 字段列表 FROM 表名 WHERE 查询条件
$sql = 'SELECT `id` ,`name` FROM `myhome` WHERE `id` > :id';
$stmt = $db->prepare($sql);
$stmt->execute(['id' => 6]);
// 单条查询
$myhome = $stmt->fetch(PDO::FETCH_ASSOC);
printf('<pre>%s</pre>', print_r($myhome, true));
echo '<hr>';
// 5. CURD: SELECT 多条查询
// SELECT 字段列表 FROM 表名 WHERE 查询条件
$sql = 'SELECT `id`,`name` FROM `myhome` WHERE `id` > :id';
$stmt = $db->prepare($sql);
$stmt->execute(['id' => 7]);
// fetchAll: 返回全部满足条件的记录集合,二维数组
$myhomes = $stmt->fetchAll();
// print_r($staffs);
foreach ($myhomes as $myhome) {
    printf('<pre>%s</pre>', print_r($myhome, true));
}

image.png

Name:
<提交>