PHP基于PDO封装简易MySQL操作类
介绍一个基于PHP PDO的MySQL简易操作类,涵盖建连、增删改查及分组查询等方法,提供完整的源码参考。
核心功能与目标
该 MySQL 操作类旨在简化 PHP 原生数据库交互流程。通过继承 PDO 类,封装了常见的 CRUD(创建、读取、更新、删除)操作。主要功能包括:
- 自动连接:构造函数中初始化数据库连接并设置字符集。
- 批量插入:
insert方法支持数组键值对自动拼接 SQL。 - 条件查询:
select和delete支持字符串单条件或数组多条件组合。 - 结果获取:提供单条字段提取、全表遍历及分组取值方法。
准备条件
- 确保 PHP 环境已开启
pdo_mysql扩展。 - 准备好 MySQL 数据库的用户名、密码、主机地址及端口信息。
- 备份重要数据,此类涉及删除和覆盖操作,请谨慎使用。
代码实现结构
类名定义为 mysql,直接继承自 PDO。以下是完整源代码:
<?php
class mysql extends PDO{
public $server;
public $database;
public $user;
public $password;
public $sql;
// 构造函数:建立连接并设置编码
public function __construct($server,$database,$user,$password,$port=3306){
$this->server = $server;
$this->database = $database;
$this->user = $user;
$this->password = $password;
parent::__construct("mysql:host=$server;port=$port;dbname=$database",$user,$password);
$this->query('SET NAMES utf8');
}
// 删除表操作
public function drop($table){
$sql = 'DROP TABLE '.$table.';';
$re = $this->query($sql);
if($re){
return true;
}else{
return false;
}
}
// 插入数据:支持数组参数或分隔符解析
public function insert($table,$name,$value=null){
$sql = "INSERT INTO ".$table.'(';
if($value == null){
$arrname = array_keys($name);
$arrvalue = array_values($name);
}else{
$arrname = explode('|', $name);
$arrvalue = explode('|', $value);
}
// 动态拼接字段名
for($i=0;$i<count($arrname);$i++){
if($i==count($arrname)-1){
$sql = $sql.$arrname[$i];
}else{
$sql = $sql.$arrname[$i].",";
}
}
$sql = $sql.")VALUES(";
// 动态拼接字段值
for($i=0;$i<count($arrvalue);$i++){
if($i==count($arrvalue)-1){
$sql = $sql."'".$arrvalue[$i]."'";
}else{
$sql = $sql."'".$arrvalue[$i]."',";
}
}
$sql .=");";
$re = $this->query($sql);
if($re){
return true;
}else{
return false;
}
}
// 删除数据:支持单条件字符串或多条件数组
public function delete($table,$Conditionsname,$Conditionsvalue=null){
if($Conditionsvalue!=null){
$sql = "DELETE FROM ".$table." WHERE ".$Conditionsname."='".$Conditionsvalue."';";
}else{
$sql = "DELETE FROM ".$table." WHERE ";
$arrname = array_keys($Conditionsname);
$arrvalue = array_values($Conditionsname);
for($i=0;$i<count($arrname);$i++){
if($i==count($arrname)-1){
$sql.=$arrname[$i].'='."'".$arrvalue[$i]."'";
}else{
// 注意:此处逻辑可能存在语义歧义,通常多条件应用 AND 连接
$sql.=$arrname[$i].'='."'".$arrvalue[$i]."',";
}
}
$sql.=';';
}
$re = $this->query($sql);
if($re){
return true;
}else{
return false;
}
}
// 查询数据:返回指定字段的单行值
public function select($table,$name,$Conditionsname,$Conditionsvalue=null){
if($Conditionsvalue!=null){
$sql = "SELECT ".$name." FROM ".$table." WHERE ".$Conditionsname."='".$Conditionsvalue."';";
}else{
$sql = "SELECT ".$name." FROM ".$table." WHERE ";
$arrname = array_keys($Conditionsname);
$arrvalue = array_values($Conditionsname);
for($i=0;$i<count($arrname);$i++){
if($i==count($arrname)-1){
$sql.=$arrname[$i].'='."'".$arrvalue[$i]."'";
}else{
$sql.=$arrname[$i].'='."'".$arrvalue[$i]."' and ";
}
}
$sql.=';';
}
$re = $this->query($sql);
$row = $re->fetch();
return $row[$name];
}
// 更新数据
public function update($table,$name,$value,$Conditionsname,$Conditionsvalue=null){
if($Conditionsvalue!=null){
$sql = "UPDATE ".$table." SET ".$name."= '".$value."' WHERE ".$Conditionsname."='".$Conditionsvalue."';";
}else{
$sql = "UPDATE ".$table." SET ".$name."= '".$value."' WHERE ";
$arrname = array_keys($Conditionsname);
$arrvalue = array_values($Conditionsname);
for($i=0;$i<count($arrname);$i++){
if($i==count($arrname)-1){
$sql.=$arrname[$i].'='."'".$arrvalue[$i]."'";
}else{
$sql.=$arrname[$i].'='."'".$arrvalue[$i]."' and ";
}
}
$sql.=';';
}
$re = $this->query($sql);
if($re){
return true;
}else{
return false;
}
}
// 分组获取某字段所有值
public function group($table,$name){
$sql = "SELECT ".$name." FROM ".$table.";";
$return = array();
$re = $this->query($sql);
while($row = $re->fetch(PDO::FETCH_ASSOC)){
array_push($return,$row[$name]);
}
return $return;
}
// 执行任意SQL并返回关联数组结果集
public function fetchall($sql){
$return = array();
$re = $this->query($sql);
while($row = $re->fetch(PDO::FETCH_ASSOC)){
array_push($return,$row);
}
return $return;
}
}
关键方法使用说明
第1步:实例化数据库对象
入口为标准构造函数调用。需传入服务器地址、数据库名、用户名和密码。可选参数为端口,默认为 3306。
示例:$db = new mysql('localhost','test_db','root','pass123');
第2步:执行插入操作 (Insert)
入口为 insert(表名, 数据)。若 value 为 null,则 name 应为关联数组,自动提取 Key 作为字段名,Value 作为字段值。若提供了 value,则 name 和 value 均应以 | 分隔的字符串形式传入。
第3步:执行查询与更新 (Select & Update)
入口分别为 select() 和 update()。两者均支持两种模式:
- 单条件模式:直接传入条件字段名和值作为最后两个参数。
- 多条件模式:将条件字段和值分别放入数组/字符串,通过
and连接(需注意 delete 方法中部分版本的拼接逻辑差异)。
第4步:处理结果集
使用 fetchall() 可执行自定义 SQL 语句并返回完整的关联数组列表。使用 group() 可快速获取指定表中某一列的所有值组成的数组。
完成判断与注意事项
- 安全提示:此类直接拼接变量到 SQL 语句中,未使用预处理语句(Prepare),在高并发或不可信输入场景下存在 SQL 注入风险。建议仅在受控环境或内部工具中使用,生产环境请引入参数绑定。
- 编码问题:构造函数硬编码了
SET NAMES utf8,若数据库使用 utf8mb4,需手动修改此处的字符串以支持Emoji等特殊字符。 - 错误处理:当前实现仅返回布尔值,未抛出异常。若需调试,可在各方法中加入
echo $this->errorInfo();输出详细错误码。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













