PHP面向对象(数据库抽象层PDO)

一、数据库抽象层(PDO)

1) PDO 链接数据库

// DSN: 数据库类型:dbname=库名;host=主机名/IP地址;charset=编码
// USER: 用户名
// PWD: 密码

实例1:PDO链接数据库

$dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
$user = 'root';
$pwd = '123456';

$pdo = new PDO($dsn, $user, $pwd); // 此处的变量名可以变,$a, $b, $c也可以使用
var_dump($pdo);

在本地创建一个数据库,如下:

数据库名:s73

用户名:root

密码:123456


运行结果:

PDO链接数据库

若没有在本地建立数据库,会报以下错误:

找不到数据库

2) PDO调用方法

$对象名->方法名()

实例2:query方法,获取一条数据

// 1. PDO连接数据库
$dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
$user = 'root';
$pwd = '123456';

// 2. 实例化PDO类
$pdo = new PDO($dsn, $user, $pwd);

// 3. 准备SQL语句
$sql = 'SELECT * FROM `user`';

// 4. 执行SQL语句,通过PDO里面的query()方法,成功:返回PDOStatement对象
echo "<pre>";
$res = $pdo->query($sql);
var_dump($res);

// 5. 分析结果集
// fetch(): 获取一条结果集 
$data = $res->fetch(); 
var_dump($data);

运行结果:

fetch 获取单条数据

实例3:获取查询到的所有数据(关联,索引,默认)

① 获取查询到的所有数据,混合(默认)

// 1. 链接数据库
$dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
$user = 'root';
$pwd = '123456';

// 2. 实例化PDO
$pdo = new PDO($dsn, $user, $pwd);

// 3. 准备SQL语句
$sql = 'SELECT * FROM `user`';

// 4. 执行SQL语句,通过PDO里面的query()方法,成功:返回PDOStatement对象
$res = $pdo->query($sql);

// 5. 分析结果集
// 获取查询到的所有数据,混合(默认)
echo "<pre>";
$data = $res->fetchALL(); // 或者 $data = $res->fetchALL(PDO::FETCH_BOTH); 【二者等价】
var_dump($data);

运行结果:获取查询到的所有结果集

获取查询到的所有结果集

② 获取查询到的所有数据,关联【常用】

// 获取查询到的所有数据,关联
$data = $res->fetchALL(PDO::FETCH_ASSOC);

运行结果:获取查询到的所有数据,关联

fetchALL关联

③ 获取查询到的所有数据,索引

$data = $res->fetchALL(PDO::FETCH_NUM);

运行结果:获取查询都得所有数据,索引

fetchALL索引

3) PDO对象

query();    // 返回值:PDOStatement对象【最适用于查】(适用于任何)
exec();     // 返回值:受影响的行数【适用于增、删、改】
errorInfo(); // 返回值:错误信息
                    0 -> 驱动号   00000:成功,其他都为失败
                    1 -> 错误编号
                    2 -> 错误详情
lastInsertId(); // 返回值:返回最后一次插入的ID

实例4:exec()方法的使用【删除操作】

// 1. 链接数据库
$dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
$user = 'root';
$pwd = '123456';

// 2. 实例化PDO
$pdo = new PDO($dsn, $user, $pwd);

// 3. 准备SQL语句
$sql = 'DELETE FROM `user` WHERE `id`=2';

// 4. 执行SQL语句
$res = $pdo->exec($sql);
var_dump($res);

运行结果:

这里写图片描述

未执行删除前的数据表

未执行删除前的数据表

执行删除后的数据表

执行删除后的数据表

实例5:errorInfo()返回错误信息

// 1. 链接数据库
$dsn = "mysql:dbname=s73;host=localhost;charset=utf8";
$user = 'root';
$pwd = '123456';

// 2. 实例化PDO
$pdo = new PDO($dsn, $user, $pwd);

// 3. 准备SQL语句
$sql = 'DEL FROM `user` WHERE `id`=4'; // 该条SQL语句是一条有语法错误的SQL,为了返回错误信息而使用

// 4. 执行SQL语句
$res = $pdo->exec($sql);

echo "<pre>";
var_dump($res);
var_dump($pdo->errorInfo());

运行结果:有错误信息的结果

这里写图片描述

若将SQL语句改为:

$sql = 'DELETE FROM `user` WHERE `id`=4';

运行结果:此时无错误信息(5个0代表执行成功)

errorInfo返回00000

实例6:lastInsetId()返回最后一次插入的ID

// 1. 链接数据库
$dsn = "mysql:dbname=s73;host=localhost;charset=utf8";
$user = "root";
$pwd = "123456";

// 2. 实例化PDO
$pdo = new PDO($dsn, $user, $pwd);

// 3. 准备SQL语句
$sql = 'INSERT INTO `user`(`name`, `pass`, `status`, `time`) VALUES("admin123", "123456", 1, "'.time().'")';

// 4. 执行SQL语句
$res = $pdo->exec($sql);

echo "<pre>";
var_dump($res);
var_dump($pdo->errorInfo()); // 返回错误信息
var_dumo($pdo->lastInsertId()); // 返回最后插入ID

运行结果:

lastInsetId()返回最后插入ID

新增后的数据库

注:如果返回结果为0,则表示执行失败,因为ID的最小值为1。


4) PDOStatement对象

fetch();    // 返回值:一维数组
fetchALL(); // 返回值:二维数组
    PDO::FETCH_ASSOC    // 关联
    PDO::FETCH_NUM      // 索引
    PDO::FETCH_BOTH      // 混合【默认】


二、PDO项目实战

1)准备工作:

① 新建一个 index.php 文件
② 在 index.php 文件中,写入简单的页面样式
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title> PDO实战 </title>
    <style>
        body{margin: 0; padding: 0;}
        table{border-collapse: collapse; width: 100%;}
        tr{transition: all .2s;}
        th,td{border: 2px solid #ccc; text-align: center;}
        th{height: 50px;}
        td{height: 38px;}

        tr:hover{background-color: #eef3fa;}

    </style>
</head>
<body>

    <table>
        <caption> <h2>俊男美女</h2> </caption>
        <tr>
            <th> 编号 </th>
            <th> 电话 </th>
            <th> 姓名 </th>
            <th> 性别 </th>
            <th> 生日 </th>
            <th> 注册时间 </th>
        </tr>        
        <tr>
            <td> 007 </td>
            <td> 18888888888 </td>
            <td> 小明 </td>
            <td></td>
            <td> 1998-02-04 </td>
            <td> 2018-05-20 </td>
        </tr>

    </table>

</body>
</html>
③ 用户表 user(以下是我测试导出的数据表,可以直接放到命令行执行,也可以创建一个后缀名为.sql的文件,然后导入)
/*
Navicat MySQL Data Transfer

Source Server         : mysql
Source Server Version : 50553
Source Host           : localhost:3306
Source Database       : s73

Target Server Type    : MYSQL
Target Server Version : 50553
File Encoding         : 65001

Date: 2018-08-17 12:39:25
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tel` char(11) NOT NULL COMMENT '电话',
  `name` varchar(30) DEFAULT NULL COMMENT '名字',
  `pwd` char(32) NOT NULL COMMENT '密码',
  `sex` tinyint(1) DEFAULT '1' COMMENT '性别 1-男  2-女',
  `birthday` date DEFAULT NULL COMMENT '出生日期',
  `icon` varchar(255) DEFAULT NULL COMMENT '头像',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `status` tinyint(1) DEFAULT '1' COMMENT '状态 1-激活 2-禁用',
  `regtime` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `tel` (`tel`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '13888888888', '张三', 'e10adc3949ba59abbe56e057f20f883e', '1', '2018-01-15', '', '上海市宝山区', '1', '1515556191');
INSERT INTO `user` VALUES ('2', '13666666668', '李四', 'e10adc3949ba59abbe56e057f20f883e', '0', '2018-01-15', null, '上海市静安区', '1', '1515556191');


2) 查询操作

① 查询所有用户的数据,此时要使用PDO进行数据库操作分为以下四步:
  • 链接数据库
$dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
$user = 'root';
$pwd = '123456';

$pdo = new PDO($dsn, $user, $pwd);
  • 执行SQL语句
$sql = 'SELECT `id`, `tel`, `name`, `sex`, `birthday`, `regtime` FROM `user` ORDER BY `id`'; // 排序可加可不加,此处是用的默认排序
  • 执行SQL语句, query(),返回PDOStatement对象
$res = $pdo->query($sql);
  • 分析结果集
$data = $res->fetchALL(PDO::FETCH_ASSOC); // 返回关联数组(二维)
var_dump($data); // 可以将结果打印出来查看


② 将查询到的数据遍历到页面
<?php foreach ($data as $k => $v): ?>
    <tr>
        <td> <?= $v['id']; ?> </td>
        <td> <?= $v['tel']; ?> </td>
        <td> <?= $v['name']; ?> </td>
        <td> <?= $v['sex'] == 1 ? '男' : '女'; ?> </td>
        <td> <?= $v['birthday']; ?> </td>
        <td> <?= date('Y-m-d H:i:s', $v['regtime']); ?> </td>
    </tr>
<?php endforeach ?>


③ 完整代码及运行结果:
<?php
    // 查询所有的用户数据

        // 1. 链接数据库
        $dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
        $user = 'root';
        $pwd = '123456';
        $pdo = new PDO($dsn, $user, $pwd);

        // 2. 执行SQL语句
        $sql = 'SELECT `id`, `tel`, `name`, `sex`, `birthday`, `regtime` FROM `user` ORDER BY `id`';

        // 3. 执行SQL语句,query(), 返回PDOStatement对象
        $res = $pdo->query($sql);

        // 4. 分析结果集
        $data = $res->fetchALL(PDO::FETCH_ASSOC);
        // echo "<pre>";
        // var_dump($data);

 ?>



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title> PDO实战 </title>
    <style>
        body{margin: 0; padding: 0;}
        table{border-collapse: collapse; width: 100%;}
        tr{transition: all .2s;}
        th,td{border: 2px solid #ccc; text-align: center;}
        th{height: 50px;}
        td{height: 38px;}

        tr:hover{background-color: #eef3fa;}

    </style>
</head>
<body>

    <table>
        <caption> <h2>俊男美女</h2> </caption>
        <tr>
            <th> 编号 </th>
            <th> 电话 </th>
            <th> 姓名 </th>
            <th> 性别 </th>
            <th> 生日 </th>
            <th> 注册时间 </th>
        </tr>

        <!-- 测试代码  -->
        <tr>
            <td> 007 </td>
            <td> 18888888888 </td>
            <td> 小明 </td>
            <td> 男 </td>
            <td> 1998-02-04 </td>
            <td> 2018-05-20 </td>
        </tr>

        <!-- 实例 -->
        <?php foreach ($data as $k => $v): ?>
            <tr>
                <td> <?= $v['id']; ?> </td>
                <td> <?= $v['tel']; ?> </td>
                <td> <?= $v['name']; ?> </td>
                <td> <?= $v['sex'] == 1 ? '男' : '女'; ?> </td>
                <td> <?= $v['birthday']; ?> </td>
                <td> <?= date('Y-m-d H:i:s', $v['regtime']); ?> </td>
            </tr>

        <?php endforeach ?>

    </table>

</body>
</html>

运行结果:

PDO实战

可以将模板中的 测试代码 去掉,如下操作:

PDO实战(去掉模板中测试代码)

最终运行结果:

PDO实战(最终版)


3)删除操作

① 准备 删除按钮 和 跳转链接,及跳转的页面(此处为了效果明显使用跳转页面),代码如下:
<?php
    // 查询所有的用户数据

        // 1. 链接数据库
        $dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
        $user = 'root';
        $pwd = '123456';
        $pdo = new PDO($dsn, $user, $pwd);

        // 2. 执行SQL语句
        $sql = 'SELECT `id`, `tel`, `name`, `sex`, `birthday`, `regtime` FROM `user` ORDER BY `id`';

        // 3. 执行SQL语句,query(), 返回PDOStatement对象
        $res = $pdo->query($sql);

        // 4. 分析结果集
        $data = $res->fetchALL(PDO::FETCH_ASSOC);
        // echo "<pre>";
        // var_dump($data);

 ?>



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title> PDO实战 </title>
    <style>
        body{margin: 0; padding: 0;}
        table{border-collapse: collapse; width: 100%;}
        tr{transition: all .2s;}
        th,td{border: 2px solid #ccc; text-align: center;}
        th{height: 50px;}
        td{height: 38px;}
        a{color: #1303FA; text-decoration: none; margin-right: 5px;}

        tr:hover{background-color: #eef3fa; cursor: pointer;}

    </style>
</head>
<body>

    <table>
        <caption> <h2>俊男美女</h2> </caption>
        <tr>
            <th> 编号 </th>
            <th> 电话 </th>
            <th> 姓名 </th>
            <th> 性别 </th>
            <th> 生日 </th>
            <th> 注册时间 </th>
            <th> 操作 </th>
        </tr>

        <!-- 实例 -->
        <?php foreach ($data as $k => $v): ?>
            <tr>
                <td> <?= $v['id']; ?> </td>
                <td> <?= $v['tel']; ?> </td>
                <td> <?= $v['name']; ?> </td>
                <td> <?= $v['sex'] == 1 ? '男' : '女'; ?> </td>
                <td> <?= $v['birthday']; ?> </td>
                <td> <?= date('Y-m-d H:i:s', $v['regtime']); ?> </td>
                <td>
                    <a href=""> 更新 </a>
                    <a href="del.php?id=<?= $v['id']; ?>"> 删除 </a>
                </td>
            </tr>

        <?php endforeach ?>

    </table>

</body>
</html>

页面效果:

删除准备

② 新建 del.php 文件
// 专门删除数据

// 1. 链接数据库
$dsn = 'mysql:dbname=s73;host=localhost;charset=utf8';
$user = 'root';
$pwd = '123456';
$pdo = new PDO($dsn, $user, $pwd);

// 2. 准备SQL语句
$id = $_GET['id']; // 接收ID
$sql = 'DELETE FROM `user` WHERE `id` = '. $id;

// 3. 执行SQL语句,exec() 返回受影响行数(1-成功 0-失败)
$res = $pdo->exec($sql);

// 4. 跳转页面
header('location: index.php');

运行结果:

删除成功后

猜你喜欢

转载自blog.csdn.net/studyphp123/article/details/81778812