如果笔记

如果笔记

做有价值的技术笔记

PHP操作MySQL数据库的简单高效封装(增删改查)

本文所给出代码只是对一些最常用的API的简单封装,不是完整类,完整的类会包含一些针对自己业务的特殊封装,本文就不讲那些了。

写PHP,增删改查MySQL数据库是很基本和经常要做的事,所以封装一个简单好用的数据库操作类是必须的。 先来看下不封装或封装不完善的代码一般是什么样子: ```php $sql = "INSERT INTO db_xxx.tb_yyy (col1, col2) VALUES ($val1, $val2)"; $db->query($sql); $sql = "SELECT col1, col2 FROM db_xxx.tb_yyy WHERE status=1 ORDER BY id DESC"; $rows = $db->select($sql); ``` 每次都要拼sql语句真的很累,开发效率低还很容易拼错,这是不行的! 本文所给出代码只是对一些最常用的API的简单封装,不是完整类,完整的类会包含一些针对自己业务的特殊封装,本文就不讲那些了。 废话不多说,上代码: ```php class Mysql { // 省略掉构造函数,连接数据库服务器这些。。 // 给表名加上数据库限定 function table($table) { return "`$this->db_name`.`$table`"; } // 执行sql语句 function query($sql) { if ($this->link_id === NULL) { $this->connect(/*连接数据库服务器的各种参数*/); } $query = mysql_query($sql, $this->link_id); if (!$query) { $error = array( 'message' => 'MySQL Query Error', 'sql' => $sql, 'error' => mysql_error($this->link_id), 'errno' => mysql_errno($this->link_id) ); $this->report_error($error); // 报告错误,比如写到错误日志 return false; } return $query; } function insert($table, $fields, $values) { $table = $this->table($table); $this->query("INSERT INTO $table ($fields) VALUES ($values)"); } function insert_id() { return mysql_insert_id($this->link_id); } function update($table, $assign, $where) { $table = $this->table($table); $this->query("UPDATE $table SET $assign WHERE $where LIMIT 1"); } function delete($table, $where) { $table = $this->table($table); $this->query("DELETE FROM $table WHERE $where LIMIT 1"); } function count($table, $where) { $table = $this->table($table); $res = $this->query("SELECT COUNT(*) FROM $table WHERE $where"); return $res ? intval(mysql_fetch_row($res)[0]) : 0; } // 查询单行单个字段的值 function select_one($table, $field, $where) { $table = $this->table($table); $res = $this->query("SELECT $field FROM $table WHERE $where LIMIT 1"); if ($res) { $row = mysql_fetch_row($res); return $row ? $row[0] : false; } return false; } // 查询单行 function select_row($table, $fields, $where) { $table = $this->table($table); $res = $this->query("SELECT $fields FROM $table WHERE $where LIMIT 1"); return $res ? mysql_fetch_assoc($res) : false; } // 查询多行 // $options 包括 where、order by、limit 等中的一个或多个 function select($table, $fields, $options) { $table = $this->table($table); $res = $this->query("SELECT $fields FROM $table WHERE $options"); if ($res) { $rows = array(); while ($row = mysql_fetch_assoc($res)) { $rows[] = $row; } return $rows; } return false; } } ``` 用上面封装好的类,业务代码就很简洁了: ```php // 增 $db->insert('tb_yyy', 'col1, col2', "$val1, $val2"); // 删 $db->delete('tb_yyy', "col1=$val1"); // 改 $db->update('tb_yyy', "col1=$new_val1", "id=$id"); // 查:只查col1的值(单行单个字段) $col1 = $db->select_one('tb_yyy', "col1", "id=$id"); // 查:查单行多个字段 $row = $db->select_row('tb_yyy', "col1, col2, col3", "id=$id"); // 查:查多行 $rows = $db->select('tb_yyy', "col1, col2", "status=1"); $rows = $db->select('tb_yyy', "col1, col2", "status=1 ORDER BY id DESC"); $rows = $db->select('tb_yyy', "col1, col2", "status=1 ORDER BY id DESC LIMIT 20"); // 查:查总数 $count = $db->count('tb_yyy', "status=2"); ``` 业务代码只用写必要的参数,是不是省事、清晰太多了! 是的,如果要做连表查询等比较复杂的操作,还是得手动拼下sql。。本人觉得复杂的sql操作,一是不好封装得比较好用,二是用到的频率也不是很高,所以不是很必要进行封装。你们觉得呢?

后端

hahaboy