封装PDO连接数据库代码
废话不说直接上代码:
<?php
class DB
{
protected static $_connect;
protected $dsn, $pdo;
protected $_data, $_count, $_lastInsertId; /**
* 构造函数
*
* @return DB
*/
private function __construct($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset, $dbms)
{
try {
$this->dsn = $dbms.':host='.$dbHost.';dbname='.$dbName;
$this->pdo = new PDO($this->dsn, $dbUser, $dbPasswd);
$this->pdo->exec('SET character_set_connection='.$dbCharset.', character_set_results='.$dbCharset.', character_set_client=binary');
} catch (PDOException $e) {
$this->outputError($e->getMessage());
}
} /**
* 获取返回结果、行数及最新插入数据的id
*
*/
public function data(){
return $this->_data;
}
public function count(){
return $this->_count;
}
public function lastInsertId(){
return $this->_lastInsertId;
} /**
* 防止克隆
*
*/
private function __clone() {} /**
* Singleton instance
*
* @return Object
*/
public static function connect($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset="utf8", $dbms="mysql")
{
if (self::$_connect === null) {
self::$_connect = new self($dbHost, $dbUser, $dbPasswd, $dbName, $dbCharset, $dbms);
}
return self::$_connect;
} /**
* Go 增删改查覆盖
*
* @param String $strSql SQL语句
* @param Array $arrayInputValue 替换占位符的值
* @return Object
*/
public function go($strSql, $arrayInputValue){
$handle=strtolower(preg_split("/\s+/",$strSql)[0]);//----获取sql语句第一个词(可能是select、update、delete、insert或replace)
if(strpos("/insert/delete/update/select/replace",$handle)>0){
$stmt = $this->pdo->prepare($strSql);
$stmt->execute($arrayInputValue);
$this->getPDOError();
$this->_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$this->_count=$stmt->rowCount();// ----如果是覆盖旧数据,rowCount不准确
$this->_lastInsertId=$this->pdo->lastInsertId();
return $this;
}else{
echo "<br>请检查sql语句是否有误!<br>";
}
} /**
* execSql
*
* @param String $strSql
* @return Int
*/
public function execSql($strSql)
{
$result = $this->pdo->exec($strSql);
$this->getPDOError();
return $result;
} /**
* 获取字段最大值
*
* @param string $table 表名
* @param string $field_name 字段名
* @param string $where 条件
*/
public function getMaxValue($table, $field_name, $where = '')
{
$strSql = "SELECT MAX(".$field_name.") AS MAX_VALUE FROM $table";
if ($where != '') $strSql .= " WHERE $where";
$stmt = $this->pdo->prepare($strSql);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$maxValue = $data[0]["MAX_VALUE"];
if ($maxValue == "" || $maxValue == null) {
$maxValue = 0;
}
return $maxValue;
} /**
* 获取指定列的数量
*
* @param string $table
* @param string $field_name
* @param string $where
* @return int
*/
public function getCount($table, $field_name, $where = '')
{
$strSql = "SELECT COUNT($field_name) AS NUM FROM $table";
if ($where != '') $strSql .= " WHERE $where";
$stmt = $this->pdo->prepare($strSql);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $data[0]["NUM"];
} /**
* 获取指定列的总和
*
* @param string $table
* @param string $field_name
* @param string $where
* @return int
*/
public function getSum($table, $field_name, $where = '')
{
$strSql = "SELECT SUM($field_name) AS SN FROM $table";
if ($where != '') $strSql .= " WHERE $where";
$stmt = $this->pdo->prepare($strSql);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $data[0]["SN"];
} /**
* 预处理执行
*/
public function prepareSql($sql=''){
return $this->pdo->prepare($sql);
} /**
* 执行预处理
*/
public function execute($presql){
return $this->pdo->execute($presql);
} /**
* pdo属性设置
*/
public function setAttribute($p,$d){
$this->pdo->setAttribute($p,$d);
} /**
* beginTransaction 事务开始
*/
public function beginTransaction()
{
$this->pdo->beginTransaction();
} /**
* commit 事务提交
*/
public function commit()
{
$this->pdo->commit();
} /**
* rollback 事务回滚
*/
public function rollback()
{
$this->pdo->rollback();
} /**
* getPDOError 捕获PDO错误信息
*/
private function getPDOError()
{
if ($this->pdo->errorCode() != '00000') {
$arrayError = $this->pdo->errorInfo();
$this->outputError($arrayError[2]);
}
} /**
* 输出错误信息
*
* @param String $strErrMsg
*/
private function outputError($strErrMsg)
{
throw new Exception('MySQL Error: '.$strErrMsg);
} /**
* 关闭数据库连接
*/
public function close()
{
$this->pdo = null;
}
}
?>
如何使用:
<?php
require "db.class.php";//----引入文件
$pdo=DB::connect("localhost","root","[密码]","[数据库名]");//--创建PDO并连接数据库
$sql="……";//----注:这里sql语句占位符必须用“?”表示
$pdo->go($sql, array("[value1]","[value2]",...));//---执行sql语句(所有sql语句均可用go函数执行) var_dump($pdo->result());//----打印结果集(如果是select语句返回的是代表结果集的数组,如果是其他语句返回的是空数组)
echo $pdo->count();//-----如果是select打印的是结果集包含的数据数量,如果是delete或update打印的是删除或更改的数据数量
echo $pdo->lastInsertId();//------如果是insert语句,$pdo->lastInsertId()表示最新插入数据的id $pdo->close();//----关闭连接
?>
封装PDO连接数据库代码的更多相关文章
- 【转】php pdo连接数据库 解决中文乱码问题(wordpress mysql 问号?? ??)
原文链接:http://blog.csdn.net/ysydao/article/details/11002295 PHP 用pdo连接数据库时出现中文乱码问题解决办法 1.array(PDO::MY ...
- 封装PDO函数
funPDO.php <?php /** * @title: 封装PDO函数 * * @Features: * 1. 封装 SELECT ,INSERT,DELETE,UPDATE 操作 @do ...
- PDO连接数据库
PDO连接数据库 PDO简介和配置 php.ini extension=php_pdo.dll extension=php_pdo_myysql.dll PDO连接MYSQL new PDO(&quo ...
- 使用PDO连接数据库 查询和插入乱码的解决方法
问题:PDO连接数据库后,查询和插入中文到数据库,出现乱码,如图: 解决方法: 法1: try{ $opts_values = array(PDO::MYSQL_ATTR_INIT_COMMAND=& ...
- AngularJS之使用服务封装可复用代码
创建服务组件 在AngularJS中创建一个服务组件很简单,只需要定义一个具有$get方法的构造函数, 然后使用模块的provider方法进行登记: //定义构造函数 var myServicePro ...
- 对百度WebUploader的二次封装,精简前端代码之图片预览上传(两句代码搞定上传)
前言 本篇文章上一篇: 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传) 此篇是在上面的基础上扩展出来专门上传图片的控件封装. 首先我们看看效果: 正文 使用方式同 ...
- 玩转UITableView系列(一)--- 解耦封装、简化代码、适者生存!
UITableView这个iOS开发中永远绕不开的UIView,那么就不可避免的要在多个页面多种场景下反复摩擦UITableView,就算是刚跳进火坑不久的iOS Developer也知道实现UITa ...
- volley+okhttp封装,一行代码就可访问网络
volley+okhttp封装,一行代码就可访问网络 前言: 我写这个可能不会完全的教会你去怎么封装一个网络框架,我的目的在于让你不需要你自己封装就可以访问网络,或者说互相学习也可以,我只是想让你大概 ...
- 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...
随机推荐
- 【JVM】4、JVM类加载机制
一.先看看编写出的代码的执行过程: 二.研究类加载机制的意义 从上图可以看出,类加载是Java程序运行的第一步,研究类的加载有助于了解JVM执行过程,并指导开发者采取更有效的措施配合程序执行. 研究类 ...
- Codeforces633G(SummerTrainingDay06-I dfs序+线段树+bitset)
G. Yash And Trees time limit per test:4 seconds memory limit per test:512 megabytes input:standard i ...
- HDU2643(SummerTrainingDay05-P 第二类斯特林数)
Rank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Python数据模型
引言 像大多数人一样,我在对一直传统的面向过程语言C一知半解之后,走进了面向对象的世界,尽管对OOP一无所知,还好Python还保留有函数式编程,这使得我才不那么抵触,直到现在,习惯了面向对象之后,也 ...
- Wampserver配置与本地建站
☆根目录修改问题 /.修改运行根目录 1.修改apache配置,将服务请求定位到新目录下 →左击wampserver,点击Apache打开httpd.conf文件,Ctrl+f搜索documentro ...
- Javascript经典算法学习1:产生随机数组的辅助类
辅助类 在几个经典排序算法学习部分,为方便统一测试不同算法,新建了一个辅助类,主要功能为:产生指定长度的随机数组,提供打印输出数组,交换两个元素等功能,代码如下: function ArraySort ...
- 微信公众号本地断点调试(frp反向代理或Remote Debugger)
问题描述: 需要开发微信授权和订阅推送,但是感觉调试不方便,就试着几种方式.因为是用的C#开发,Visual Studio工具自带配套的远程工具 (Remote Debugger).但是感觉不稳定,容 ...
- SD从零开始45-46
[原创] SD从零开始45 运输流程的控制 运输业务场景的例子Examples 一个公司可使用不同的运输业务场景,通过不同的处理类型或者运输方式来刻画: 要模型化这些不同的装运,你可以在配置中定义装运 ...
- 使用ArcGIS Pro编辑在线三维服务图层
ArcGIS Pro 从2.2版本起,提供了编辑在线三维服务图层的功能.通过该功能,我们可以直接在Pro中编辑发布的三维服务图层Web Scene Layer. 我们知道三维场景服务支持包含多种类型的 ...
- 8 张脑图入门 JavaScript - 基础面试不倒
8 张脑图入门 JavaScript - 基础面试不倒 转载请注明出处 第一:JavaScript 的变量 第二:JavaScript 运算符 第三:JavaScript 数组 第四:JavaScri ...