PDO,MYSQL,MYSQLI的各自不同介绍,PDO,MYSQL,MYSQLI 性能哪个比较好
普通的mysql连接肯定是会被抛弃的 因为每次都要防止sql注入的问题 而且相对来说比较慢
首先, mysqli 连接是永久连接,而mysql是非永久连接 。什么意思呢? mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
mysqli是在普通mysql的基础上做的一次优化说实话很成功 预处理方式完全解决了sql注入的问题
但是唯一的不足点 就是只支持mysql数据库当然如果你要是不操作其他的数据库或者 当然这无疑是最好的选择
PDO则是最新出来的一种 连接方式 兼容大部分数据库 也解决了sql注入 但是也有缺点 它只支持php5.1以上的版本 不过听说在未来的php6中 只支持这种连接.PDO统一所有数据库抽象层对象接口,mysqli只统一mysql的
简单说,PDO可以实现同样的代码对不同数据库的操作,例如你从mysql迁移到mssql,程序基本不需要改动
而mysqli简单理解未mysql的封装就好 在高负载的情况下.PDO开启长连接能够得到一个相对稳定的负载“值”。但是效率却不是最高的。 mysql最快。mysqli其次。只是mysql和mysqli在高并发、系统高负载的时候。其所承担的负载也是很可观的。PDO则不会。http://hudeyong926.iteye.com/blog/1824869
<?php /** * 数据库操作类 */ class Db { protected $db; protected $_sql; protected $throw = 1; //抛出sql语句错误信息 protected $_query; function __construct($dbname = NULL, $port = '3306') { if (!$dbname) { $this->db = new mysqli(HOST, USER, PASS, DBNAME, PORT); } else { $this->db = new mysqli(HOST, USER, PASS, $dbname, $port); } $this->db->set_charset(CHARSET); if ($this->db->connect_error) { if ($this->throw) { throw new Exception($this->db->connect_error, $this->db->connect_errno); } } } /** * 查询字段 * @param string $field 要查询的字段 * @return Db */ public function field($field) { $this->_query['field'] = "SELECT {$field}"; return $this; } /** * 查询的表名 * @param string $table 要查询的表名可以带别名,例如table as tab * @return Db */ public function table($table) { $this->_query['table'] = "FROM {$table}"; return $this; } /** * 联合查询 * @param string $join 联合的表名可以带别名,必须加上关联的on语句 * @return Db */ public function join($join) { $this->_query['join'][] = $join; return $this; } /** * 条件语句 * @param string $where sql条件语句不需加where关键字 * @return Db */ public function where($where) { $this->_query['where'] = "WHERE {$where}"; return $this; } /** * 排序 * @param string $order * @return Db */ public function order($order) { if ($order != '') { $this->_query['order'] = "ORDER BY {$order}"; } return $this; } /** * 获取条数 * @param string $limit 格式0,5 * @return Db */ public function limit($limit) { if ($limit != '') { $this->_query['limit'] = "LIMIT {$limit}"; } return $this; } /** * 构造sql语句 * @return string 返回sql语句 */ private function buildsql() { $sql = $this->_query['field'] . ' ' . $this->_query['table']; if (!empty($this->_query['join'])) { foreach ($this->_query['join'] as $join) { $sql .= " {$join}"; }; } if (isset($this->_query['del'])) { $sql = $this->_query['del'] . ' ' . $this->_query['table']; } if (isset($this->_query['where']) && $this->_query['where'] != '') { $sql .= ' ' . $this->_query['where']; } if (isset($this->_query['limit']) && $this->_query['limit'] != '') { $sql .= ' ' . $this->_query['limit']; } if (isset($this->_query['order']) && $this->_query['order'] != '') { $sql .= ' ' . $this->_query['order']; } unset($this->_query); return $sql; } /** * 执行select查询 * @return bool|array 失败返回FALSE,成功返回二维数组 */ public function select() { $sql = $this->buildsql(); return $this->fetchAll($sql); } /** * 获取所有记录数 * * @return int 返回所有记录数 */ public function findNumRows() { $sql = $this->buildsql(); $res = $this->query($sql); return $res->num_rows; } /** * 删除一行记录 * @return boolean */ public function delRow() { $this->_query['del'] = "DELETE"; $sql = $this->buildsql(); $res = $this->query($sql); if ($res === FALSE) { return FALSE; } return TRUE; } /** * 检查唯一性 * * @param string $table 表名 * @param string $where 查询条件 * @param string $keyid 自动id * @return boolean 存在返回FALSE,否则返回TRUE */ public function chkUnique($table, $where, $keyid = 'id') { $sql = "SELECT {$keyid} from {$table} WHERE {$where}"; $num = $this->getNumRows($sql); if ($num > 0) { return FALSE; } return TRUE; } /** * 执行select查询 * @return bool|array 失败返回FALSE,成功返回一维数组 */ public function findRow() { $sql = $this->buildsql(); return $this->fetchRow($sql); } /** * 执行select查询 * @return bool|array 失败返回FALSE,成功返回一维数组 */ public function findOne() { $sql = $this->buildsql(); return $this->fetchOne($sql); } /** * 获取一条数据 * @param string $sql sql语句 * @return array 一维数组 */ public function fetchOne($sql) { $res = $this->fetchRow($sql); if ($res) { $field = key($res); $res = $res[$field]; } return $res; } /** * 执行sql语句查询 * @param string $sql sql语句 * @return mixed 返回资源结果集或布尔值 */ public function query($sql) { $this->_sql = $sql; $res = $this->db->query($sql); if ($res === FALSE) { if ($this->throw) { throw new Exception("发生错误: 错误信息 {$this->getLastErr()} 相关sql语句 {$this->_sql}", $this->db->errno); } else { return FALSE; } } return $res; } /** * 设置是否抛出sql异常 * @param bool $bool */ public function setThrow($bool = FALSE) { $this->throw = $bool; } /** * 执行sql脚本从文件 * @param file $sqlfile sql脚本文件路径 * @return boolean */ public function buildSqlfile($sqlfile) { $file = file($sqlfile); if ($file === FALSE || empty($file)) { return FALSE; } foreach ($file as $key => $val) { if (preg_match('/^(-|#)/', $val) || trim($val) == '') { continue; } $new[] = $val; } $sqls = split(';', join('', $new)); foreach ($sqls as $sql) { $this->query($sql); } return TRUE; } /** * 获取一条数据 * @param string $sql sql语句 * @return array 一维数组 */ public function fetchRow($sql) { $res = $this->query($sql); $result = @$res->fetch_assoc(); return $result; } /** * 获取多条数据 * @param string $sql * @return array 二维数组 */ public function fetchAll($sql, $key = '') { $res = $this->query($sql); $result = array(); while ($row = $res->fetch_assoc()) { if ($key) { $result [$row[$key]] = $row; } else { $result [] = $row; } } return $result; } /** * 获取所有记录数 * * @param string $sql sql语句 * @return int 返回所有记录数 */ public function getNumRows($sql) { $res = $this->query($sql); return $res->num_rows; } /** * 返回最后查询自动生成的id */ public function getLastId() { return $this->db->insert_id; } /** * 返回最后查询出现的错误信息 */ public function getLastErr() { return $this->db->error; } /** * 获取最后一次执行的sql语句 * * @return string sql */ public function getLastSql() { return $this->_sql; } /** * 锁定表 * @param string $tabname 表名 * @param string $mode 模式 */ public function locktab($tabname, $mode = 'READ') { $this->query("LOCK TABLE {$tabname} {$mode}"); return $this; } /** * 解锁表 */ public function unlocktab() { $this->query("UNLOCK TABLES"); } /** * 执行锁定查询 */ public function execlockquery() { $sql = $this->buildsql(); } /** * 执行添加记录操作 * @param $data 要增加的数据,参数为数组。数组key为字段值,数组值为数据取值 格式:array('字段名' => 值); * @param $table 数据表 * @return boolean */ public function add($data, $table, $replace = false) { if (!is_array($data) || $table == '' || count($data) == 0) { return false; } $fielddata = array_keys($data); $valuedata = array_values($data); array_walk($fielddata, array($this, 'add_special_char')); array_walk($valuedata, array($this, 'escape_string')); $field = implode(',', $fielddata); $value = implode(',', $valuedata); $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO'; $sql = $cmd . ' `' . $table . '`(' . $field . ') VALUES (' . $value . ')'; $this->query($sql); return $this->getLastId(); } /** * 执行更新记录操作 * @param $table 数据表 * @param $data 要更新的数据内容,参数可以为数组也可以为字符串,建议数组。 * 为数组时数组key为字段值,数组值为数据取值 * 为字符串时[例:`name`='phpcms',`hits`=`hits`+1]。 * 为数组时[例: array('name'=>'phpcms','password'=>'123456')] * 数组可使用array('name'=>'+=1', 'base'=>'-=1');程序会自动解析为`name` = `name` + 1, `base` = `base` - 1 * * @param $where 更新数据时的条件 * @return boolean */ public function update($table, $data, $where = '') { if ($table == '' or $where == '') { return false; } $where = ' WHERE ' . $where; $field = ''; if (is_string($data) && $data != '') { $field = $data; } elseif (is_array($data) && count($data) > 0) { $fields = array(); foreach ($data as $k => $v) { switch (substr($v, 0, 2)) { case '+=': $v = substr($v, 2); if (is_numeric($v)) { $fields[] = $this->add_special_char($k) . '=' . $this->add_special_char($k) . '+' . $this->escape_string($v, '', false); } else { continue; } break; case '-=': $v = substr($v, 2); if (is_numeric($v)) { $fields[] = $this->add_special_char($k) . '=' . $this->add_special_char($k) . '-' . $this->escape_string($v, '', false); } else { continue; } break; default: $fields[] = $this->add_special_char($k) . '=' . $this->escape_string($v); } } $field = implode(',', $fields); } else { return false; } $sql = 'UPDATE `' . $table . '` SET ' . $field . $where; return $this->query($sql); } /** * 执行删除记录操作 * @param $table 数据表 * @param $where 删除数据条件,不充许为空。 * 如果要清空表,使用empty方法 * @return boolean */ public function delete($table, $where = null) { if ($table == '') { return false; } $sql = 'DELETE FROM `' . $table . '`'; if ($where) { $sql .= " WHERE {$where}"; } return $this->query($sql); } /** * 自动提交 * @param BOOL $status 默认false关闭自动提交,设置为true时打开自动提交 */ public function autocommit($status = FALSE) { $this->db->autocommit($status); } /** * 提交事务 */ public function commit() { $this->db->commit(); } /** * 回滚事务 */ public function rollback() { $this->db->rollback(); } /** * 对字段两边加反引号,以保证数据库安全 * @param $value 数组值 */ public function add_special_char(&$value) { if ('*' == $value || false !== strpos($value, '(') || false !== strpos($value, '.') || false !== strpos($value, '`')) { //不处理包含* 或者 使用了sql方法。 } else { $value = '`' . trim($value) . '`'; } if (preg_match("/\b(select|insert|update|delete)\b/i", $value)) { $value = preg_replace("/\b(select|insert|update|delete)\b/i", '', $value); } return $value; } /** * 对字段值两边加引号,以保证数据库安全 * @param $value 数组值 * @param $key 数组key * @param $quotation */ public function escape_string(&$value, $key = '', $quotation = 1) { if ($quotation) { $q = '\''; } else { $q = ''; } $value = $q . $value . $q; return $value; } public function __destruct() { $this->db->close(); } }
相关推荐
在PHP7中,MySQL数据库操作通常使用mysqli或PDO_MySQL扩展进行,但对于新手来说,创建一个封装好的数据库操作类可以简化很多工作。这个实例主要介绍如何构建一个PHP7中的MySQL数据库操作类,以实现连接、查询、插入...
在这个“php中mysql数据库操作类.zip”压缩包中,很可能包含了一个基于MySQLi或PDO实现的自定义数据库操作类。 一个基础的PHP MySQL数据库操作类通常包括以下组件: 1. **连接函数**:用于建立与MySQL服务器的连接...
- PDO和mysqli都提供了面向对象的API,方便使用类和对象来操作数据库。 - mysqli还提供了一套面向过程的API,对于习惯于使用传统PHP MySQL函数的开发者来说,更易于理解和迁移。 - PDO则没有面向过程的API,但其...
标题提到的"php连接mysql数据库操作类.zip"是一个压缩包,其中包含了一个PHP类,专门用于处理与MySQL数据库的交互,如查询、更新、删除等常见操作。这个类库可能是为了简化数据库操作,提高代码的可读性和可维护性而...
9. **错误处理**:一个良好的数据库操作类会包含错误处理机制,比如捕获并处理MySQLi或PDO抛出的异常,或者提供自定义的错误处理函数。 10. **结果集处理**:查询返回的结果可能被封装为一个结果集对象,提供遍历、...
首先,让我们了解一个基本的PHP MySQL数据库操作类的组成部分: 1. **连接配置**:在类的初始化阶段,通常会包含数据库的连接参数,如主机名(hostname)、用户名(username)、密码(password)和数据库名...
这个压缩包提供的"php可用mysql,mssql,pg数据库操作类"旨在提供一个通用的解决方案,允许开发者轻松地在MySQL、Microsoft SQL Server (MSSQL) 和 PostgreSQL (PGSQL) 之间切换,而无需对代码进行大幅度修改。...
在描述中提到的“丰富的mysql资源”,暗示了这个压缩包可能包含不仅限于数据库操作类的多种MySQL相关资源,比如可能有示例代码、教程文档、数据库设计范例或者是数据库管理工具等,这些资源可以帮助开发者更深入理解...
"php数据库mysql操作类"就是这样的一个工具,它集成了多种数据库操作方法,旨在简化开发流程。 首先,这个数据库操作类通常会包含连接和断开数据库的功能。在PHP中,可以通过mysqli或PDO的构造函数建立到MySQL...
PHP数据库操作类是为了方便开发者更高效、安全地与各种数据库系统(如MySQL、PostgreSQL、SQLite等)进行交互而设计的。本篇文章将围绕"PHP数据库操作类"这个主题,详细介绍相关知识点,并基于提供的文件名(sql_...
7. **关闭数据库连接**:在完成所有数据库操作后,应使用`mysqli_close`或`PDO::disconnect`关闭连接,释放系统资源。 ```php mysqli_close($conn); ``` 这个PHP类可能还包含了错误处理机制,如异常处理和自定义...
【MySQL仿ASP数据库操作类详解】 在PHP中,我们可以创建自定义类来简化数据库操作,类似于ASP中的方式。本文将介绍一个PHP类——MySQLDB,它用于处理MySQL数据库的常见操作,如连接、选择数据库、执行SQL语句、处理...
通过使用这样的数据库连接类,开发者可以更高效、更安全地管理他们的MySQL数据库操作,避免重复编写连接、查询和结果处理的代码。同时,类`db.php`可能还有其他的特性,如日志记录、连接池等,以提升开发效率和系统...
PHP通过mysqli或PDO扩展与MySQL进行通信。使用mysqli,可以编写连接数据库、执行SQL查询、处理结果集的代码。例如,用mysqli_connect()建立连接,mysqli_query()执行查询,mysqli_fetch_array()获取结果行。PDO提供...
在PHP中,MySQL数据库操作通常涉及使用MySQLi或PDO扩展,但这个例子中展示的是一个自定义的数据库操作类,它使用了已经被废弃的原始`mysql`扩展。这个类提供了数据库连接、SQL查询执行、创建数据库以及显示所有...
本篇将详细讲解如何使用PHP编写一个MySQL数据库操作类,以实现对数据库的连接、查询、插入、更新和删除等基本操作。 首先,我们需要创建一个PHP类,例如命名为`MySQLDB`,这个类将包含与数据库交互的方法。在PHP中...
优秀的封装类还会考虑未来扩展,例如支持多种数据库驱动(如PDO_MySQL、mysqli等),方便切换不同的数据库系统。 通过使用这样的PHP数据库操作封装类,开发者可以更专注于业务逻辑,而不是数据库操作的细节,提升...
PHP提供了多种方式与MySQL数据库进行交互,如原生的MySQLi或PDO扩展。然而,为了提高代码的可读性、可维护性和复用性,开发人员通常会创建自定义的数据库操作类。这个名为"class_db.php"的文件很可能就是一个这样的...
这个"完整的php操作MySQL数据库类"提供了一种结构化的、封装好的方式来实现这一目标。它将常见的数据库操作,如连接、查询、插入、更新和删除等,封装成了一系列的方法,方便开发者在项目中调用,提高了代码的可维护...