php开发实战分析(7):mysql类库操作的高级使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: php开发实战分析(7):mysql类库操作的高级使用

前言:MySQL 类库

MySQL 类库是用于在 PHP 中与 MySQL 数据库进行交互的工具集合。PHP 提供了多个可用的 MySQL 类库,其中最常用的是官方提供的 MySQLi(MySQL improved)和 PDO(PHP Data Objects)。


1.MySQLi(MySQL improved):

MySQLi 是 PHP 官方提供的 MySQL 扩展,提供了面向对象和面向过程两种 API 风格。它支持 MySQL 5.0 版本及以上,并提供了更多的功能和性能改进。

使用 MySQLi 类库,你可以使用面向对象或面向过程的方式连接 MySQL 数据库、执行查询和事务、处理结果集等。下面是使用面向对象风格的示例:


<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_errno) {
    echo "连接 MySQL 失败: " . $mysqli->connect_error;
    exit;
}
$query = "SELECT * FROM users";
$result = $mysqli->query($query);
while ($row = $result->fetch_assoc()) {
    echo $row['username'] . "<br>";
}
$mysqli->close();


可以参考 PHP 官方文档了解更多 MySQLi 的用法和功能。


2.PDO(PHP Data Objects):

PDO 是一个通用的、可扩展的数据库访问抽象层,可以用于连接多种类型的数据库,包括 MySQL。使用 PDO,你可以使用统一的 API 风格来连接数据库、执行查询和事务,并处理结果集。

下面是 PDO 的示例:

<?php
$dsn = "mysql:host=localhost;dbname=database";
$username = "username";
$password = "password";
try {
    $pdo = new PDO($dsn, $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $query = "SELECT * FROM users";
    $stmt = $pdo->query($query);
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo $row['username'] . "<br>";
    }
} catch (PDOException $e) {
    echo "连接数据库失败: " . $e->getMessage();
}
  1. 参考 PHP 官方文档了解更多 PDO 的用法和功能。

无论选择使用 MySQLi 还是 PDO,都可以根据具体需求和个人喜好选择合适的类库来进行 MySQL 数据库操作。它们都提供了丰富的功能和可靠的性能,可以满足大多数的 PHP 数据库开发需求。


一、自行封装 MySQL 类库

1.MySQL 类库进行自行封装的优点


  1. 代码复用和可维护性:封装 MySQL 类库可以将数据库操作逻辑封装到一个独立的类中,提供统一的接口和方法,使代码更加模块化。这样可以减少重复的代码编写,提高代码的复用性和可维护性。如果需要修改数据库连接或操作方式,只需要修改封装类的实现,而不需要在代码的多个地方进行修改。
  2. 隐藏细节和增加安全性:封装类库能够隐藏底层数据库细节,使系统的其他部分不直接和数据库进行交互。这样可以提高代码的安全性,避免直接执行原始的 SQL 语句等潜在风险。
  3. 错误处理和异常管理:自行封装 MySQL 类库可以对数据库操作过程中的错误进行处理和管理。可以自定义异常处理机制,捕获并处理数据库操作中可能出现的异常,从而更好地控制错误流程,提供更友好的错误信息,以及记录和处理数据库错误信息。
  4. 注重性能和优化:通过自行封装 MySQL 类库,可以在底层处理一些性能优化的细节。例如,可以使用查询预处理等方式提高数据库操作的效率,减少数据库访问的网络开销。还可以根据具体应用需求进行数据库连接池、查询缓存等优化,提升系统的性能和响应速度。
  5. 适应多个数据库类型:自行封装的类库可以以抽象的方式连接和操作多种类型的数据库,而不仅限于 MySQL。这样,如果未来需要切换到其他类型的数据库,只需修改封装类库的实现,而不会对应用其他部分产生影响。


综上所述,自行封装 MySQL 类库能够提供更好的代码复用性、可维护性、安全性、错误处理和性能优化等优势,使开发过程更加高效、可靠和可扩展。封装类库可以根据项目需求和团队要求进行定制化,满足特定的开发需求,并提供更好的抽象层,使代码更加可读、可靠和易于维护。


2.单记录查询

    public function query($sql)
    {
        $this->connect(); //logs($sql);//print $sql.'<br>';
        $result = $this->db->query($sql);
        $this->error(); ///var_dump($result);
        $result->setFetchMode(PDO::FETCH_ASSOC);
        $this->querynum++;
        return $result->fetch();
    }
    public function fetch($table, $field, $condition = '', $sort = '')
    {
        $condition = $this->format_condition($condition);
        $sort && $sort = ' ORDER BY ' . $sort;
        $sql = 'SELECT ' . $field . ' FROM ' . $this->table($table) . $condition . $sort . ' LIMIT 1'; //print $sql.'<br>';
        return $this->query($sql);
    }


3.多记录查询

    public function queryall($sql)
    {
        $this->connect();
        $result = $this->db->query($sql); //print $sql.'<br>';die();//logs($sql);
        $this->error();
        $result->setFetchMode(PDO::FETCH_ASSOC);
        $this->querynum++;
        return $result->fetchall();
    }
    public function fetchall($table, $field, $condition = '', $sort = '', $limit = '')
    {
        $condition = $this->format_condition($condition);
        $sort && $sort = ' ORDER BY ' . $sort;
        $limit && $limit = ' LIMIT ' . $limit;
        $sql = 'SELECT ' . $field . ' FROM ' . $this->table($table) . $condition . $sort . $limit;
        return $this->queryall($sql);
    }


4.获取插入的id

    public function lastinsertid()
    {
        return $this->db->lastInsertId();
    }


5.插入数据

   public function insert($table, $array)
    {
        if (!is_array($array)) {
            return false;
        }
        foreach ($array as $key => $value) {
            $cols[] = $key;
            $vals[] = '\'' . $this->strescape($value) . '\'';
        }
        $col = join(',', $cols);
        $val = join(',', $vals);
        $sql = 'INSERT INTO ' . $this->table($table) . ' (' . $col . ') VALUES (' . $val . ')'; //print $sql;//logs($sql);
        return $this->exec($sql);
    }


6.更新数据

    public function update($table, $array, $condition)
    {
        if (!is_array($array)) {
            return false;
        }
        $condition = $this->format_condition($condition);
        foreach ($array as $key => $value) {
            $vals[] = $key . ' = \'' . $this->strescape($value) . '\'';
        }
        $values = join(',', $vals);
        $sql = 'UPDATE ' . $this->table($table) . ' SET ' . $values . $condition;
        return $this->exec($sql);
    }


7.删除数据

    public function delete($table, $condition)
    {
        $condition = $this->format_condition($condition);
        $sql = 'DELETE FROM ' . $this->table($table) . $condition;
        return $this->exec($sql);
    }


8.统计数量

   public function rowcount($table, $condition = '')
    {
        $condition = $this->format_condition($condition);
        $sql = 'SELECT COUNT(*) FROM ' . $this->table($table) . $condition; 
        $result = $this->query($sql);
        return $result['COUNT(*)'];
    }
    public function get_count($sql = '')
    {
        $result = $this->query('SELECT COUNT(*) FROM ' . $sql);
        return $result['COUNT(*)'];
    }

二、MySQL 类库的实战使用

1.文章系统上一篇和下一篇

function get_prev_news($news_id)
{
    global $db;
    $row = $db->query("select news_id,name,code from " . $db->table('news') . " where news_id<" . intval($news_id) . " order by news_id desc limit 1");
    $row['url'] = get_url($row['code']);
    return $row;
}


//下一篇
function get_next_news($news_id)
{
    global $db;
    $row = $db->query("select news_id,name,code from " . $db->table('news') . " where news_id>" . intval($news_id) . " order by news_id asc limit 1");
    $row['url'] = get_url($row['code']);
    return $row;
}

2.条件判断查询的拼接语句

function get_brand($id = 0, $name = '', $recommend = 0, $startI = 0, $num = null)
{
    global $db;
    $where = '';
    global $db;
    $where = '';
    if ($id != 0) {
        $where .= ' and id=' . intval($id);
    }
    if ($name != 0) {
        $where .= " and name like '%" . trim(addslashes($name)) . "%'";
    }
    if ($recommend != 0) {
        $where .= " and recommend=" . intval($recommend);
    }
    if ($num != null) {
        $where .= ' limit ' . intval($startI) . "," . intval($num);
    }
    return $db->queryall("select * from " . $db->table('brand') . " where status=1 " . $where);
}

3.获取收藏数

//获取收藏数
function get_fav_count($uid = 0)
{
    global $db;
    return $db->get_count($db->table('member_fav') . " where uid=" . intval($uid));
}


4.数量统计

$robot_count = $db->rowcount("member", array("is_robot" => 1));


5.添加字段

    public function install()
    {
        global $db;
        $sql = "alter table " . $db->table("member") . " add is_robot tinyint(1) default '0'  COMMENT '是否机器人'; ";
        $db->query($sql);
        return true;
    }


6.删除字段

   public function uninst()
    {
        global $db;
        $sql = "alter table " . $db->table("member") . " drop column is_robot; ";
        $db->query($sql);
        return true;
    }

7.跨表查询

$where='';
$row = $db->queryall("SELECT g.goods_id,g.name,g.subname,g.code,g.thumb,g.unit,g.virtype,g.status goods_status,ifnull(g.point*i.num, 0) point,g.uptime,ifnull(s.weight, g.weight) weight,ifnull(s.attr_ids,'') as spec_ids,ifnull(s.`values`,'')as spec_name, ifnull(s.price, g.price) price,ifnull(s.number, g.number) number,(ifnull(s.price, g.price)*i.num) amount,(ifnull(s.weight, g.weight)*i.num) total_weight, c.uid,ifnull(f.id,0) as favid,i.* from " . $db->table('cart') . " c join " . 
$db->table('cart_item') . " i on c.id = i.cid join " .
$db->table('goods') . " g on i.gid=g.goods_id left join " . 
$db->table('goods_spec') . " s on i.gid=s.goods_id and s.values =i.spec left join " . 
$db->table('member_fav') . " f on f.goods_id=i.gid and f.spec=i.spec and f.uid=c.uid where 1 " . $where);


8.类型限制

$db->insert('banner', array('c_id' => intval($login_id), 'c_width' => intval($c_width), 'c_height' => intval($c_height), 'c_title' => ptitle($c_title), 'c_name' => ptitle($c_name), 'c_time' => time(), 'c_code' => ''));


9.记录格式转换

function get_delivery($order_sn)
{
    global $db;
    $row = $db->queryall("select d.*,ifnull(e.name,'商家配送') exp_name,e.code exp_code,e.code2 exp_code2 from " . $db->table('delivery') . " d left join " . $db->table('express_common') . " e on d.exp_id=e.id where order_sn=" . $order_sn);
    foreach ($row as $k => $v) {
        $row[$k]['exp_time'] = date('Y-m-d H:i:s', $v['addtime']);
    }
    return $row;
}


function get_not_delivery($order_sn)
{
    global $db;
    $goods = $db->queryall("SELECT g.thumb,g.code,og.* FROM " . $db->table('order') . " o join " . $db->table('order_goods') . " og on o.id=og.order_id left join " . $db->table('goods') . " g on g.goods_id=og.goods_id left join (select order_sn,concat(goods_id,spec)goods from " . $db->table('delivery') . " d join " . $db->table('delivery_goods') . " dg on d.id=dg.delivery_id WHERE order_sn=" . $order_sn . ") de on de.order_sn=o.order_sn and de.goods=concat(og.goods_id,og.spec) where concat(og.goods_id,og.spec)<>ifnull(goods,'') and o.order_sn=" . $order_sn);
    foreach ($goods as $k => $v) {
        $goods[$k]['price'] = format_price($v['price']);
        $goods[$k]['amount'] = format_price($v['price'] * $v['num']);
        $goods[$k]['url'] = $v['code'] . '-g.html';
    }
    return $goods;
}


11.获取订单数

function order_count($uid = 0, $status = 0, $where = '')
{
    global $db;
    if ($uid != 0) {
        $where .= " and uid=" . $uid;
    }
    if ($status != 0) {
        $where .= " and status=" . $status;
    }
    return $db->rowcount('order', "1 " . $where);
}



@漏刻有时

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
10天前
|
自然语言处理 安全 PHP
深入浅出PHP编程:从基础到实战
【10月更文挑战第36天】本文将带你走进PHP的奇妙世界,无论你是初学者还是有一定经验的开发者,都将从中获益。文章首先介绍PHP的基础概念和语法,然后通过实际代码示例,展示如何利用PHP进行高效的Web开发。最后,我们将探讨一些高级主题,如面向对象编程、数据库操作以及安全性问题。让我们一起开启PHP的学习之旅吧!
|
11天前
|
存储 Serverless PHP
PHP编程入门:从基础到实战
【10月更文挑战第35天】本文将带你走进PHP的世界,从最基本的语法开始,逐步深入到实际应用。我们将通过简单易懂的语言和实际代码示例,让你快速掌握PHP编程的基础知识。无论你是初学者还是有一定经验的开发者,都能在这篇文章中找到你需要的内容。让我们一起探索PHP的魅力吧!
|
10天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
25 1
|
15天前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
16天前
|
关系型数据库 MySQL PHP
PHP与MySQL动态网站开发实战指南####
本文深入探讨了PHP与MySQL在动态网站开发中的应用实践,通过具体案例解析如何高效结合这两大技术构建数据驱动的Web应用。文章将涵盖环境搭建、基础语法回顾、数据库设计与操作、用户注册与登录系统实现等关键步骤,旨在为开发者提供一个从零到一的项目实战路径,展示PHP与MySQL协同工作的强大能力。 ####
|
14天前
|
前端开发 中间件 PHP
PHP框架深度解析:Laravel的魔力与实战应用####
【10月更文挑战第31天】 本文作为一篇技术深度好文,旨在揭开PHP领域璀璨明星——Laravel框架的神秘面纱。不同于常规摘要的概括性介绍,本文将直接以一段引人入胜的技术剖析开场,随后通过具体代码示例和实战案例,逐步引导读者领略Laravel在简化开发流程、提升代码质量及促进团队协作方面的卓越能力。无论你是PHP初学者渴望深入了解现代开发范式,还是经验丰富的开发者寻求优化项目架构的灵感,本文都将为你提供宝贵的见解与实践指导。 ####
|
1月前
|
SQL 关系型数据库 MySQL
PHP与MySQL协同工作的艺术:开发高效动态网站
在这个后端技术迅速迭代的时代,PHP和MySQL的组合仍然是创建动态网站和应用的主流选择之一。本文将带领读者深入理解PHP后端逻辑与MySQL数据库之间的协同工作方式,包括数据的检索、插入、更新和删除操作。文章将通过一系列实用的示例和最佳实践,揭示如何充分利用这两种技术的优势,构建高效、安全且易于维护的动态网站。
|
23天前
|
存储 Java PHP
PHP编程之旅:从基础到实战
【10月更文挑战第23天】本文将带你走进PHP的世界,探索这个流行的服务器端脚本语言的魅力。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和实用的代码示例。我们将从PHP的基本概念开始,然后深入到实际应用中,最后通过一个实战项目来巩固所学知识。让我们一起开启这段激动人心的PHP编程之旅吧!
21 0
|
2月前
|
设计模式 数据管理 测试技术
PHP中的设计模式:单一职责原则在实战项目中的应用
在软件开发中,设计模式是解决问题的最佳实践。本文通过分析单一职责原则(SRP),探讨了如何运用这一原则来提升PHP项目的可维护性和扩展性。我们将从实际案例出发,展示单一职责原则在业务逻辑分离、代码解耦和提高测试效率方面的应用。无论是新手还是经验丰富的开发者,都能从中获益,进而编写出更健壮、更灵活的PHP代码。
39 5