前言: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(); }
- 参考 PHP 官方文档了解更多 PDO 的用法和功能。
无论选择使用 MySQLi 还是 PDO,都可以根据具体需求和个人喜好选择合适的类库来进行 MySQL 数据库操作。它们都提供了丰富的功能和可靠的性能,可以满足大多数的 PHP 数据库开发需求。
一、自行封装 MySQL 类库
1.MySQL 类库进行自行封装的优点
- 代码复用和可维护性:封装 MySQL 类库可以将数据库操作逻辑封装到一个独立的类中,提供统一的接口和方法,使代码更加模块化。这样可以减少重复的代码编写,提高代码的复用性和可维护性。如果需要修改数据库连接或操作方式,只需要修改封装类的实现,而不需要在代码的多个地方进行修改。
- 隐藏细节和增加安全性:封装类库能够隐藏底层数据库细节,使系统的其他部分不直接和数据库进行交互。这样可以提高代码的安全性,避免直接执行原始的 SQL 语句等潜在风险。
- 错误处理和异常管理:自行封装 MySQL 类库可以对数据库操作过程中的错误进行处理和管理。可以自定义异常处理机制,捕获并处理数据库操作中可能出现的异常,从而更好地控制错误流程,提供更友好的错误信息,以及记录和处理数据库错误信息。
- 注重性能和优化:通过自行封装 MySQL 类库,可以在底层处理一些性能优化的细节。例如,可以使用查询预处理等方式提高数据库操作的效率,减少数据库访问的网络开销。还可以根据具体应用需求进行数据库连接池、查询缓存等优化,提升系统的性能和响应速度。
- 适应多个数据库类型:自行封装的类库可以以抽象的方式连接和操作多种类型的数据库,而不仅限于 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); }
@漏刻有时