Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP中的MySQL使用--基于PDO

PHP中的MySQL使用--基于PDO

作者头像
张风捷特烈
发布于 2024-01-26 02:03:22
发布于 2024-01-26 02:03:22
70800
代码可运行
举报
运行总次数:0
代码可运行
一、准备活动
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PHP Data Object 数据库访问抽象层 统一各种数据库访问接口

1.查看PHP的配置信息

调用一个函数即可输出一个界面。默认PDO是支持MySQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
phpinfo(); 

如果不支持,在php.ini中打开选项即可


2.连接数据库
2.1:方式1 写死在代码里
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|-- ---------------
$dsn = 'mysql:host=localhost;dbname=datatype';//数据源
$user = 'root';
$pwd = 'xxxxx';
$conn = new PDO($dsn, $user, $pwd);
var_dump($conn);//object(PDO)#1 (0) { }

2.2:方式2 写一个文件决定数据库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---->[pdo/pdo_conn.php]------------------
$path = __DIR__.'\config.txt';
$dsn = 'uri:file://' . $path . '';//数据源
$user = 'root';
$pwd = 'xxxxx';
$conn = new PDO($dsn, $user, $pwd);
var_dump($conn);//object(PDO)#1 (0) { }

---->[pdo/config.txt]------------------
mysql:dbname=datatype;host=localhost

3.执行语句exec() 创建表

不支持查询操作,返回受影响的行数。数据表使用此文中的pic表:MySQL指南之SQL语句基础

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    $dsn = 'mysql:host=localhost;dbname=datatype';//数据源
    $user = 'root';
    $pwd = 'toly';
    $conn = new PDO($dsn, $user, $pwd);
//---------------------建表--------------------------
    $sql_create_table = <<<EOT
      CREATE TABLE IF NOT EXISTS php_pic(
         id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
         pic_path  VARCHAR(120)   NOT NULL,
         pic_length  INT UNSIGNED  DEFAULT 0,
         pic_mime TINYINT UNSIGNED,
         pic_width SMALLINT UNSIGNED,
         pic_height SMALLINT UNSIGNED
       );
EOT;
    $len = $conn->exec($sql_create_table);
    echo $len;//0
} catch (Exception $e) {
    $e->getMessage();
}

mysql> SHOW TABLES;
+--------------------+
| Tables_in_datatype |
+--------------------+
| php_pic            |
+--------------------+

mysql> DESC php_pic;
+------------+----------------------+------+-----+---------+----------------+
| Field      | Type                 | Null | Key | Default | Extra          |
+------------+----------------------+------+-----+---------+----------------+
| id         | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| pic_path   | varchar(120)         | NO   |     | NULL    |                |
| pic_length | int(10) unsigned     | YES  |     | 0       |                |
| pic_mime   | tinyint(3) unsigned  | YES  |     | NULL    |                |
| pic_width  | smallint(5) unsigned | YES  |     | NULL    |                |
| pic_height | smallint(5) unsigned | YES  |     | NULL    |                |
+------------+----------------------+------+-----+---------+----------------+

二、增删改查
1.增加记录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//---------------------插入记录--------------------------
    $sql_insert = <<<EOT
INSERT INTO pic(pic_path,pic_length,pic_mime,pic_width,pic_height) VALUES
('30000X20000.jpg',116342886,1,30000,20000),
('3000X2000.jpg',3404969,1,3000,2000),
('300X200.jpg',99097,1,300,200),
('30X20.jpg',10158,1,30,20),
('6dc9e8455c47d964e1a8a4ef04cf9477.jpg',236254,1,974,319);
EOT;
    $len = $conn->exec($sql_insert);
    echo $len;//5

---->[命令行]------------------
mysql> SELECT * FROM  php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  1 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
|  2 | 3000X2000.jpg                        |    3404969 |        1 |      3000 |       2000 |
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |       974 |        319 |
+----+--------------------------------------+------------+----------+-----------+------------+

2.修改记录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//---------------------修改记录--------------------------
    $sql_update = <<<EOT
UPDATE php_pic SET pic_height=10086,pic_width=2333 
WHERE id =5;
EOT;
    $len = $conn->exec($sql_update);//1
    
---->[命令行]------------------
mysql> SELECT * FROM  php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  1 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
|  2 | 3000X2000.jpg                        |    3404969 |        1 |      3000 |       2000 |
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |      2333 |      10086 |
+----+--------------------------------------+------------+----------+-----------+------------+

3.删除记录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//---------------------删除记录--------------------------
    $sql_delete = <<<EOT
DELETE FROM php_pic 
WHERE pic_width> 2500;
EOT;
    $len = $conn->exec($sql_delete);//2
    echo $len;
    
---->[命令行]------------------
mysql> SELECT * FROM  php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |      2333 |      10086 |
+----+--------------------------------------+------------+----------+-----------+------------+

关于错误信息的获取

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $sql_delete = <<<EOT
DELETE FROM php_picXXX 
WHERE pic_width> 2500;
EOT;
    $len = $conn->exec($sql_delete);//2
    if ($len === false) {
        echo $conn->errorCode();
        echo "<hr/>";
        $err= $conn->errorInfo();
        print_r($err);
    }
    
---->[命令行]------------------
mysql> DELETE FROM php_picXXX
    -> WHERE pic_width> 2500;
ERROR 1146 (42S02): Table 'datatype.php_picxxx' doesn't exist

4.查询操作:query() 方法

返回一个PDOStatement 对象,可以遍历获取数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $sql_query = <<<EOT
SELECT * FROM php_pic;
EOT;
    $res = $conn->query($sql_query);
    foreach ($res as $data) {
        print_r($data);
    }

打印出记录信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $sql_query = <<<EOT
SELECT * FROM php_pic;
EOT;
    $res = $conn->query($sql_query);
    foreach ($res as $data) {
        echo "id:" . $data["id"] . "<br/>";
        echo "路径: " . $data["pic_path"] . "<br/>";
        echo "大小: " . $data["pic_length"] . "<br/>";
        echo "类型: " . $data["pic_mime"] . "<br/>";
        echo "图片宽: " . $data["pic_width"] . "<br/>";
        echo "图片高: " . $data["pic_height"] . "<br/>";
        echo "<hr/>";
    }

5.通过 prepare 方法 查询
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$cursor = $conn->prepare($sql_query);//准备
$res = $cursor->execute();//执行
if ($res) {
    while ($data = $cursor->fetch()) {
        echo "id:" . $data["id"] . "<br/>";
        echo "路径: " . $data["pic_path"] . "<br/>";
        echo "大小: " . $data["pic_length"] . "<br/>";
        echo "类型: " . $data["pic_mime"] . "<br/>";
        echo "图片宽: " . $data["pic_width"] . "<br/>";
        echo "图片高: " . $data["pic_height"] . "<br/>";
        echo "<hr/>";
    }
}

其中fetch可以传入参数,来控制结果的形式,下面举几个小例子


6.获取数据库连接属性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    $attr_arr = ['AUTOCOMMIT','ERRMODE','CASE','PERSISTENT','TIMEOUT','ORACLE_NULLS',
        'SERVER_INFO','SERVER_VERSION', 'CONNECTION_STATUS',
    ];
    foreach ($attr_arr as $attr) {
        $attr="PDO::ATTR_$attr";
        echo $attr . "----:";
        $attr = constant($attr);
        echo $conn->getAttribute($attr) . '<br/>';
    }
//PDO::ATTR_AUTOCOMMIT----:1
//PDO::ATTR_ERRMODE----:0
//PDO::ATTR_CASE----:0
//PDO::ATTR_PERSISTENT----:
//PDO::ATTR_TIMEOUT----:
//Warning: PDO::getAttribute(): SQLSTATE[IM001]: Driver does not support this function: driver does not support that attribute in J:\PHP\toly\pdo\pdo_conn.php on line 88
//
//PDO::ATTR_ORACLE_NULLS----:0
//PDO::ATTR_SERVER_INFO----:Uptime: 187237 Threads: 2 Questions: 969 Slow queries: 0 Opens: 2033 Flush tables: 1 Open tables: 1004 Queries per second avg: 0.005
//PDO::ATTR_SERVER_VERSION----:5.7.22
//PDO::ATTR_CONNECTION_STATUS----:localhost via TCP/IP

$conn->setAttribute(键,值) # 设置属性

三、结合表单进行数据库操作
1.前端界面与后端数据接收
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---->[pdo/form.php]------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加页面</title>
</head>
<body>
<h1>添加页面</h1>
<form action="do_add_pic.php" method="post">
    <label>图片路径:</label>
    <input type="text" name="pic_path" placeholder="请输入图片路径"><br>
    <label>图片大小:</label>
    <input type="number" name="pic_length" placeholder="请输入图片大小"><br>
    <label>图片类型:</label>
    <select id="select" name="pic_mime">
        <option value="png">png</option>
        <option value="jpg">jpg/jpeg</option>
    </select><br>
    <label>图片宽:</label>
    <input type="number" name=" pic_width" placeholder=" 图片宽">
    <label>图片高:</label>
    <input type="number" name=" pic_height" placeholder=" 图片高"><br>
    <input type="submit" name="submit">
</form>
</body>
</html>

---->[pdo/do_add_pic.php]------------------------------
<?php
$pic_path = $_POST['pic_path'];
$pic_length = $_POST['pic_length'];
$pic_mime = $_POST['pic_mime'];
$pic_width = $_POST['pic_width'];
$pic_height = $_POST['pic_height'];

$pic_mime = $pic_mime === "png" ? 0 : 1;

echo $pic_path . '<br/>';
echo $pic_length . '<br/>';
echo $pic_mime . '<br/>';
echo $pic_width . '<br/>';
echo $pic_height . '<br/>';

2.将表单信息插入数据库
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$dsn = 'mysql:host=localhost;dbname=datatype';//数据源
$user = 'root';
$pwd = 'xxxxx';
$conn = new PDO($dsn, $user, $pwd);
$sql_insert = "INSERT INTO php_pic(pic_path,pic_length,pic_mime,pic_width,pic_height) VALUES
('$pic_path',$pic_length,$pic_mime,$pic_width,$pic_height);";
$exec = $conn->exec($sql_insert);//5

---->[命令行]------------------
mysql> SELECT * FROM  php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |      2333 |      10086 |
|  6 | hello.jpg                            |         88 |        1 |        99 |         99 |
+----+--------------------------------------+------------+----------+-----------+------------+

3.查询操作并形成表格
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---->[pdo/get_pic.php]------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>查询页面</title>
</head>
<body>
<h1>查询页面</h1>
<form action="do_find_pic.php" method="post">
    <label>图片路径:</label>
    <input type="text" name="pic_path" placeholder="请输入图片路径"><br>
    <label>图片大小:</label>
    <input type="number" name="pic_length" placeholder="请输入图片大小"><br>
    <input type="submit" name="获取">
</form>
</body>
</html>

---->[pdo/do_find_pic.php]------------------------------
$pic_path = $_POST['pic_path'];
$pic_length = $_POST['pic_length'];
$dsn = 'mysql:host=localhost;dbname=datatype';//数据源
$user = 'root';
$pwd = 'toly';
$conn = new PDO($dsn, $user, $pwd);
$sql_query = <<<EOT
SELECT * FROM php_pic WHERE pic_path = '$pic_path' AND pic_length= $pic_length;
EOT;
$cursor = $conn->prepare($sql_query);//准备
$res = $cursor->execute();//执行
if ($res) {
    $table = "<table  border='1' cellspacing='0' cellpadding='0' width='70%' >"
    $table .= "<tr/>";
    $table .= "<td >id</td>";
    $table .= "<td >pic_path</td>";
    $table .= "<td >pic_length</td>";
    $table .= "<td >pic_mime</td>";
    $table .= "<td >pic_width</td>";
    $table .= "<td >pic_height</td>";
    $table .= "</tr>";
    while ($data = $cursor->fetch()) {
        $table .= "<tr/>";
        $table .= "<td >" . $data["id"] . "</td>";
        $table .= "<td >" . $data["pic_path"] . "</td>";
        $table .= "<td >" . $data["pic_length"] . "</td>";
        $table .= "<td >" . $data["pic_mime"] . "</td>";
        $table .= "<td >" . $data["pic_width"] . "</td>";
        $table .= "<td >" . $data["pic_height"] . "</td>";
        $table .= "</tr>";
    }
}
echo $table;

5.SQL注入

也就是用户故意在表单里写入sql语句,导致应用的行为异常, 解决方法很简单,也就是将用户的输入都变成字符串,特殊符号转义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo $pic_path.'<br/>';//'or 1=1 #
echo $conn->quote($pic_path);//'\'or 1=1 #'

$sql_query = <<<EOT
SELECT * FROM php_pic WHERE pic_path = $pic_path AND pic_length= $pic_length;
EOT;

6.预处理方式的占位参数 放置SQL注入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$sql_query = <<<EOT
SELECT * FROM php_pic WHERE pic_path = :pic_path AND pic_length= :pic_length;
EOT;
$cursor = $conn->prepare($sql_query);//准备
$res = $cursor->execute([':pic_path'=>$pic_path,':pic_length'=>$pic_length]);//执行

接下来的另一种占位形式可谓他乡遇故知啊,和Android一毛一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$sql_query = <<<EOT
SELECT * FROM php_pic WHERE pic_path =? AND pic_length=?;
EOT;
$cursor = $conn->prepare($sql_query);//准备
$res = $cursor->execute([$pic_path, $pic_length]);//执行

7.参数与变量的绑定

参数绑定到变量好处很明显,变动起来方便

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$sql_insert = "INSERT INTO php_pic(pic_path,pic_length,pic_mime,pic_width,pic_height) VALUES
(:pic_path,:pic_length,:pic_mime,:pic_width,:pic_height);";
$state = $conn->prepare($sql_insert);
$state->bindParam(':pic_path', $pic_path, PDO::PARAM_STR);
$state->bindParam(':pic_length', $pic_length, PDO::PARAM_INT);
$state->bindParam(':pic_mime', $pic_mime, PDO::PARAM_INT);
$state->bindParam(':pic_width', $pic_width, PDO::PARAM_INT);
$state->bindParam(':pic_height', $pic_height, PDO::PARAM_INT);
$state->execute();

---->[命令行]------------------
mysql> SELECT * FROM  php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |      2333 |      10086 |
|  6 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
|  7 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |         99 |
|  8 | 30000X20000.jpg                      |  116342886 |        1 |        99 |         99 |
|  9 | hello.jpg                            |         88 |        1 |        99 |         99 |
| 10 | card.png                             |       3333 |        0 |      4567 |       7889 |
+----+--------------------------------------+------------+----------+-----------+------------+


|--- 问号型的绑定
$sql_insert = "INSERT INTO php_pic(pic_path,pic_length,pic_mime,pic_width,pic_height) VALUES
(?,?,?,?,?);";
$state = $conn->prepare($sql_insert);
$state->bindParam(1, $pic_path, PDO::PARAM_STR);
$state->bindParam(2, $pic_length, PDO::PARAM_INT);
$state->bindParam(3, $pic_mime, PDO::PARAM_INT);
$state->bindParam(4, $pic_width, PDO::PARAM_INT);
$state->bindParam(5, $pic_height, PDO::PARAM_INT);
$state->execute();

---->[命令行]------------------
mysql> SELECT * FROM  php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |      2333 |      10086 |
|  6 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
|  7 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |         99 |
|  8 | 30000X20000.jpg                      |  116342886 |        1 |        99 |         99 |
|  9 | hello.jpg                            |         88 |        1 |        99 |         99 |
| 10 | card.png                             |       3333 |        0 |      4567 |       7889 |
| 11 | toly.png                             |       5543 |        0 |      4567 |       7889 |
+----+--------------------------------------+------------+----------+-----------+------------+

8.绑定列

这样获取数据会比较方便些

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$cursor = $conn->prepare($sql_query);//准备
$res = $cursor->execute([$pic_path, $pic_length]);//执行
$cursor->bindColumn(1, $id_col);
$cursor->bindColumn(2, $pic_path_col);
$cursor->bindColumn(3, $pic_length_col);
$cursor->bindColumn(4, $pic_mime_col);
$cursor->bindColumn(5, $pic_width_col);
$cursor->bindColumn(6, $pic_height_col);

if ($res) {
    $table = "<table  border='1' cellspacing='0' cellpadding='0' width='70%' >";
    $table .= "<tr/>";
    $table .= "<td >id</td>";
    $table .= "<td >pic_path</td>";
    $table .= "<td >pic_length</td>";
    $table .= "<td >pic_mime</td>";
    $table .= "<td >pic_width</td>";
    $table .= "<td >pic_height</td>";
    $table .= "</tr>";
    while ($cursor->fetch()) {
        $table .= "<tr/>";
        $table .= "<td >" . $id_col . "</td>";
        $table .= "<td >" . $pic_path_col . "</td>";
        $table .= "<td >" . $pic_length_col . "</td>";
        $table .= "<td >" . $pic_mime_col . "</td>";
        $table .= "<td >" . $pic_width_col . "</td>";
        $table .= "<td >" . $pic_height_col . "</td>";
        $table .= "</tr>";
    }
    echo $table;
}

四、封装PDO
1. 配置文件:pdo/config.php
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---->[pdo/config.php]---------------------配置文件--------------
<?php
define("DB_HOST", "localhost");
define("DB_PORT", "3306");
define("DB_USER", "root");
define("DB_PWD", "xxxxxx");
define("DB_NAME", "datatype");
define("DB_TYPE", "mysql");
define("DB_CHARSET", "utf8");

2.封装类:Pdor

属性和构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Pdor{
    private static $config = [];//配置
    private static $conn;//连接
    private static $pconn = false;//是否支持长连接
    private static $dbInfo;//数据信息
    private static $connected = false;//是否连接成功
    private static $PDOStatement;//PDOStatement
//---------- 单例模式------------------------
    private static $INSTANCE;
    static function getInstance()
    {
        if (self::$INSTANCE) {
            return self::$INSTANCE;
        } else {
            self::$INSTANCE = new self();
            return self::$INSTANCE;
        }
    }
    private function __construct($config = '')
//---------- 单例模式------------------------
        if (!class_exists("PDO")) {
            self::throwException("不支持PDO");
            return;
        }
        if (!is_array($config)) {//构造方法未传入配置 ,则使用配置文件构建$config变量
            $config = [
                'hostname' => DB_HOST,
                'hostport' => DB_PORT,
                'username' => DB_USER,
                'password' => DB_PWD,
                'database' => DB_NAME,
                'dbms' => DB_TYPE,
                'dsn' => DB_TYPE . ":host=" . DB_HOST . ";dbname=" . DB_NAME,
            ];
        }

        if (empty($config['hostname'])) {//构造方法未传入配置,无配置文件
            self::throwException("数据库未配置");
            return;
        }

        self::$config = $config;
        if (empty(self::$config['params'])) {//params属性为空
            self::$config['params'] = [];
        }

        if (!isset(self::$conn)) {//未连接
            $configs = self::$config;
            if (self::$pconn) {//设置是否正常长连接
                $configs['params'][constant("PDO::ATTR_PERSISTENT")] = true;
            }
            try {//连接数据库
                self::$conn = new \PDO($configs['dsn'], $configs['username'], $configs['password']);
            } catch (\Exception $e) {
                self::throwException($e->getMessage());
            }

            if (!self::$conn) {//没连上
                self::throwException("连接异常");
                return;
            }

            self::$conn->exec('SET NAMES ' . DB_CHARSET);//设置字符集
            self::$dbInfo['version'] = self::$conn->getAttribute(constant('PDO::ATTR_SERVER_VERSION'));
            self::$connected = true;
            unset($configs);

        }
    }

    /**异常处理
     * @param $err
     */
    private function throwException($err){
        echo "<div style='text-align: center; width:70%;color:#fff;margin: 10px ;padding: 10px ;     background-color: red ; border: blue 5px solid ; font-size: larger' > $err</div>";
    }
}

2.查询所有封装
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public function queryAll($sql = null){
    $this->query($sql);
    $res = self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC"));
    return $res;
}

/** 查询
 * @param null $sql
 * @return bool
 */
public function query($sql = null){
    self::freeStateIfNotNull();
    $conn = self::$conn;
    if ($sql != null && $conn) {
          self::$querySQL = $sql;
        self::$PDOStatement = $conn->prepare($sql);
        $res = self::$PDOStatement->execute();
        self::ifErrorHandleSQL($sql);// 如果sql语句有误 打印
        return $res;
    }
}

/**
 * 释放结果集
 */
private function freeStateIfNotNull(){
    if (!empty(self::$PDOStatement)) {
        self::$PDOStatement = null;
    }
}

/**
 * 如果sql语句有误 打印
 */
private function ifErrorHandleSQL($sql){
    $err = empty(self::$PDOStatement) ? self::$conn : self::$PDOStatement;
    $errArr = $err->errorInfo();
    if ($errArr[0] != '00000') {
        $err = '错误码:' . $errArr[0] . '<br/>' . 'SQL错误信息 ' . $errArr[2] . '<br/>' . "ERROR ON : $sql";
        self::throwException($err);
        return false;
    }
}

3.使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
use lib\db\Pdor;

include '../lib/db/Pdor.php';
include './config.php';
$pdor = Pdor::getInstance();

$sql = 'SELECT * FROM php_pic;';
$all = $pdor->queryAll($sql);
print_r($all);

看一下错误的时候:可以自己定义错误的样式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$sql = 'SELECT * FROM php8_pic;';

4.查询一条
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---->[Pdor::queryRow]-----------------
/**查询一条数据
 * @param null $sql
 * @return mixed
 */
public function queryRow($sql = null){
    $this->query($sql);
    $res = self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC"));
    return $res;
}

|--- 使用
$sql_query_one = 'SELECT * FROM php_pic WHERE id=8;';
$one = $pdor->queryRow($sql_query_one);
print_r($one);

5.增删改封装 : execute

此方法返回true/false

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**增删改
 * @param null $sql
 * @return mixed
 */
public function execute($sql = null)
{
    $conn = self::$conn;
    self::freeStateIfNotNull();
    if ($sql != null && $conn) {
        self::$PDOStatement = $conn->prepare($sql);
        $res = self::$PDOStatement->execute();
        self::ifErrorHandleSQL($sql);// 如果sql语句有误 打印
        return $res;
    }
    return false;
}

6.增删改封装 : exec

此方法返回改变的条数rowCount,和插入时的lastInsertId,更新和删除lastInsertId=0;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**增删改
 * @param null $sql
 * @return mixed
 */
public function exec($sql = null)
{
    $conn = self::$conn;
    if ($sql != null && $conn) {
        $len = $conn->exec($sql);//0
        self::ifErrorHandleSQL($sql);// 如果sql语句有误 打印
        return [
            'rowCount' => $len,
            'lastInsertId' => $conn->lastInsertId(),
        ];
    }
    return false;
}

|--- 使用-----------------------------
$sql_insert = <<<EOT
INSERT INTO php_pic(pic_path,pic_length,pic_mime,pic_width,pic_height) VALUES
('30000X20000.jpg',116342886,1,30000,20000),
('3000X2000.jpg',3404969,1,3000,2000),
('300X200.jpg',99097,1,300,200),
('30X20.jpg',10158,1,30,20),
('6dc9e8455c47d964e1a8a4ef04cf9477.jpg',236254,1,974,319);
EOT;

$all = $pdor->exec($sql_insert);
print_r($all);

你以为这就结束了?is just start !


五、强封装
1.单个查询强封装

比如根据指定的键,我想查三列,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$all = $pdor->queryByKey('php_pic', 19, ['pic_path', 'pic_length', 'pic_width']);
print_r($all);

|---- 封装 -------------------------------
/**
 * @param $table 表名
 * @param $id 对应值
 * @param string $attrs 属性集
 * @param string $key 索引
 * @return mixed
 */
public function queryByKey($table, $id, $attrs = "*", $key = 'id'){
    $sql = "SELECT %s FROM %s WHERE $key = %d";
    $sql = sprintf($sql, $this->parseAttrs($attrs), $table, $id);
    return $this->queryRow(sprintf($sql));
}

/**
 * 解析属性
 */
private function parseAttrs($attrs){
    if (is_array($attrs)) {
        array_walk($attrs, array('lib\db\Pdor', 'handleAttr'));
        $res = implode(',', $attrs);
    } else {
        $res = "*";
    }
    return $res;
}

/**通过反引号将属性括起来
 * @param $value
 * @return string
 */
public static function handleAttr(&$value){
    if ($value === '*' || strpos($value, "." !== false || strpos($value, "`") != false)) {
    } elseif (strpos($value, "`") == false) {
        $value = '`' . trim($value) . '`';
    }
    return $value;
}

2. WHERE、ORDER 、GROUP、HAVING等语句的支持

来个链式调用装个13

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$pdor->query('php_pic')->where("pic_height>500")->where("id>5")->where('pic_width>500')
    ->order('pic_width DESC')
    ->ok(['pic_path', 'pic_length', 'pic_width']);

封装起来也挺简单,不过感觉不怎么完美,有时间再推敲推敲

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private $sql;
private $table = [];
private $where = [];
private $order = [];
private $having = [];
private $group;
public function submit($attrs = "*")
{
    $where = '';
    $order = '';
    $group = '';
    $having = '';
    $head = 'SELECT ' . $this->parseAttrs($attrs) . ' FROM ' . $this->table;
    if (!empty($this->where)) {
        $where = $where . " WHERE ";
    }
    foreach ($this->where as $str) {
        $where .= $str . ' AND ';
    }
    if (!empty($this->having)) {
        $having = $having . " HAVING ";
    }
    foreach ($this->having as $str) {
        $having .= $str . ' AND ';
    }
    foreach ($this->order as $str) {
        $order .= " ORDER BY " . $str . ',';
    }
    $where = substr($where, 0, -4);
    $having = substr($having, 0, -4);
    $order = substr($order, 0, -1);
    if (!empty($this->group)) {
        $group = "GROUP BY " . $this->group;
    }
    $this->sql = $head . $where . $group . $having . $order . ";";
    return $this->queryAll($this->sql);
}
public function query($table)
{
    $this->table = $table;
    return $this;
}
public function group($attr)
{
    $this->group = $attr;
    return $this;
}
public function where($where)
{
    array_push($this->where, $where);
    return $this;
}
public function having($having)
{
    array_push($this->having, $having);
    return $this;
}
public function order($order)
{
    array_push($this->order, $order);
    return $this;
}

3.添加方法的数组形式封装
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$data = [

    'pic_path' => 'hekko.png',
    'pic_length' => 1994,
    'pic_mime' => 0,
    'pic_width' => 3,
    'pic_height' => 28,
];

$pdor->add("php_pic", $data);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 用数组添加
 */
public function add($table, $data)
{
    $keys = array_keys($data);//获取键名
    array_walk($keys, array('lib\db\Pdor', 'handleAttr'));
    $resK = join(",", $keys);
    $resV = array_values($data);
    foreach ($resV as &$v) {
        if (is_string($v)) {
            $v = "'" . $v . "'";
        }
    }
    $resV = join(",", $resV);
    $sql = "INSERT INTO {$table} ({$resK}) VALUES ({$resV});";
    echo $sql;
}


mysql> SELECT * FROM php_pic;
+----+--------------------------------------+------------+----------+-----------+------------+
| id | pic_path                             | pic_length | pic_mime | pic_width | pic_height |
+----+--------------------------------------+------------+----------+-----------+------------+
|  3 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
|  4 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
|  5 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |      2333 |      10086 |
|  6 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
|  7 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |         99 |
| 12 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
| 13 | 3000X2000.jpg                        |    3404969 |        1 |      3000 |       2000 |
| 14 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
| 15 | 30X20.jpg                            |      10158 |        1 |      2333 |      10086 |
| 16 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |       974 |        319 |
| 17 | 30000X20000.jpg                      |  116342886 |        1 |     30000 |      20000 |
| 18 | 3000X2000.jpg                        |    3404969 |        1 |      3000 |       2000 |
| 19 | 300X200.jpg                          |      99097 |        1 |       300 |        200 |
| 20 | 30X20.jpg                            |      10158 |        1 |        30 |         20 |
| 21 | 6dc9e8455c47d964e1a8a4ef04cf9477.jpg |     236254 |        1 |       974 |        319 |
| 22 | hekko.png                            |       1994 |        0 |         3 |         28 |
+----+--------------------------------------+------------+----------+-----------+------------+

本篇就这样,其他的,根据字符串拼接的套路自己去玩吧

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL指南之SQL语句基础
---- 零、结构化查询语言:SQL(Structured Query Language) DDL 数据定义语言 管理库,表 DML 数据操作语言 增删改查 DCL 数据控制语言 数据控制,权限访问等 ---- 准备活动:创建库和表 CREATE DATABASE datatype; USE datatype; CREATE TABLE type_number( type CHAR(12), byte TINYINT UNSIGNED, range_singed VARC
张风捷特烈
2019/03/20
4.7K0
MySQL指南之SQL语句基础
PHP-PDO介绍
方法一:mysql扩展【这种方式php7已经淘汰】 方法二:mysqli扩展 方法三:PDO扩展
cwl_java
2020/03/26
2.7K0
PHP笔记(一)
数据库项目作业要团队开发 web,选择了尝试后端,又向做出自己的网站这个目标踏出了一步。
赤蓝紫
2023/01/02
1.4K0
PHP笔记(一)
编程语言对比手册(横向版)[-PHP-]
Windows Apache MySQL PHP,官网:http://www.wampserver.com/ (首页挺狂放)
张风捷特烈
2019/03/19
1.5K0
编程语言对比手册(横向版)[-PHP-]
PHP面向对象核心(一)——序列化与魔术方法
PHP面向对象核心(一) (原创内容,转载请注明来源,谢谢) 一、对象存储——serialize与unserialize 对象是存储类的属性的键值对,类似于数组的键值对。 对象在进行serialize(序列化)时,会连带类名、属性值、属性占用长度一并存储,当使用unserialize(反序列化)时可以还原对象。但是反序列化需要包含类原先定义的代码,否则还原后无法执行对象所属类的方法。 作用:将对象序列化,以便于将对象以字符串的形式存储在文件或数据库中。 示例如下: //定义一个水果类 class frui
用户1327360
2018/03/07
9500
PHP面向对象核心(一)——序列化与魔术方法
PHP中常用的设计模式
应用场景:一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体的代码。
南山竹
2024/06/26
1630
PHP中常用的设计模式
PHP+MYSQL+HTML实现登录和发表文章
​ 紧张的赛前培训迎来了一次休息天,然后看了看自己落下的课程作业,唉,有个课程设计,大概看了一下是用PHP+MYSQL+HTML来写,感觉应该还能写,就利用这一天来写一下吧,先上个最后的效果图。
ly0n
2020/11/04
4.1K0
PHP+MYSQL+HTML实现登录和发表文章
PHP 应用PDO技术操作数据库
创建测试数据: 首先我们需要创建一些测试记录,然后先来演示一下数据库的基本的链接命令的使用.
王瑞MVP
2022/12/28
3.6K0
php mysql PDO 查询操作的实例详解
php mysql PDO 查询操作的实例详解 <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', '
用户2323866
2021/07/08
2.8K0
PHP连接MySQL的几种方式及推荐
https://www.runoob.com/php/php-mysql-intro.html
码客说
2023/07/11
1.1K0
PHP连接MySQL的几种方式及推荐
PHP 开发基础知识笔记
设置Cookie登录: 基于Cookie设置实现的用户登录模块,清空与设置Cookie选项.
王瑞MVP
2022/12/28
2K0
玩转字符串篇--练习MySQL没素材?来一波字符串操作
张风捷特烈
2024/01/29
2280
玩转字符串篇--练习MySQL没素材?来一波字符串操作
PHP使用GD库生成文件
<?php $xgcs_result = $this->get_xgcs_result($key); if (!empty($xgcs_result) && isset($xgcs_result['t
用户7657330
2020/08/14
1K0
PHP中的PDO操作学习(二)预处理语句及事务
今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现。只不过大部分情况下,大家都在使用框架,手写的机会非常少。
硬核项目经理
2020/12/30
1.2K0
PDO 用法学习「建议收藏」
基于驱动: 1、安装扩展 php_pdo.dll 2、安装驱动 php_pdo_mysql.dll
全栈程序员站长
2022/09/20
4.1K0
PHP实现图片压缩
本文实例为大家分享了PHP实现图片压缩的具体代码,供大家参考,具体内容如下 /** * 生成图片 * @param string $im 源图片路径 * @param string $dest 目标图片路径 * @param int $maxwidth 生成图片宽 * @param int $maxheight 生成图片高 */ function resizeImage($im, $dest, $maxwidth, $maxheight) { $img = getimagesize($im);
用户1685462
2021/08/05
3.8K0
PHP PDO——单例模式实现数据库操作
PHP PDO——单例模式实现数据库操作 (原创内容,转载请注明来源,谢谢) 一、概述 PDO是PHP访问数据库的轻量、持久的接口,其提供一个抽象访问层。启用方法是在php.ini中把extension=php_pdo.dll的注释去掉即可。 PDO包含三个预定义类,PDO、PDOStatement、PDOException,其中PDOException是对Exception类的扩展。 下面的这些类的方法很常用,故列出来进行说明。 1)PDO PD
用户1327360
2018/03/07
3.1K0
PHP中PDO的基本使用
以上俩种均可读取数据库数据,但是query()用于简单查询,而prepare()强大安全。
岳泽以
2023/04/23
1.8K0
PHP中PDO的基本使用
PHP全栈学习笔记12
php是世界上使用最广泛的web开发语言,是超文本预处理器,是一种通用的开源脚本语言,语法吸收了c语言,Java语言,和Perl的特点,利于学习,使用广泛,主要适用于web开发,PHP做出来的动态页面与其他的编程语言相比,PHP是将持续嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多,PHP还可以执行编译后的代码,编译后可以达到加密和优化代码的目的,让代码运行更快。
达达前端
2019/07/03
2.5K0
PHP全栈学习笔记12
PHP全栈学习笔记11
在php.ini文件中找到“;extension=php_mcrypt.dll”和“;extension=php_mhash.dll”
达达前端
2019/07/03
8490
PHP全栈学习笔记11
相关推荐
MySQL指南之SQL语句基础
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档