PDO是php数据库连接工具,需要先开启扩展。
如果已经开启PDO,则能检测到PDO类,反之说明未开启。
<?php
if(!class_exists("PDO")){
echo "<p>PDO扩展未开启</p>";
}
//1、实例化PDO
$host = "localhost";
$port = 3306;
$dbname = "test";
$username = "test";
$password = "PyMpefrFXSyENaHs";
$dsn="mysql:host=$host;port=$port;dbname=$dbname;charset=utf8";
$pdo = new PDO($dsn,$username,$password);
// 进行查询
$sql = "select rand();";
$sth = $pdo -> prepare($sql);
$sth -> execute();
$res1 = $sth -> fetchAll();
echo '<pre>';
print_r($res1);
echo '</pre>';
对PDO进行简单的封装,以便能自动分页:
<?php
/**
* Class DB 数据库封装类
* @author zfh
*/
class DB
{
/**
* 私有化构造方法
*/
private function __construct()
{
}
/**
* 私有克隆方法
*/
private function __clone()
{
}
private static array $dbConfig = array(
'db' => 'mysql',
'host' => 'localhost',
'port' => 3306,
'dbname' => "fwefku",
'user' => "fewfku",
'pwd' => "XxtEfewfxX3C2WPx",
'charset' => "utf8"
);
private static $conn; // 唯一连接对象(单例模式)
private static $sql; // 最后一次执行的sql信息
/** 获取连接对象
* @return PDO|void
*/
public static function getConn()
{
if (self::$conn) {
return self::$conn;
} else {
$db = self::$dbConfig['db'];
$host = self::$dbConfig['host'];
$port = self::$dbConfig['port'];
$dbname = self::$dbConfig['dbname'];
$user = self::$dbConfig['user'];
$pwd = self::$dbConfig['pwd'];
$charset = self::$dbConfig['charset'];
$dsn = "$db:host=$host;port=$port;dbname=$dbname;charset=$charset;";
if (!class_exists("PDO")) {
die("<p style='color: red'>错误:PDO扩展未开启</p>");
} else {
self::$conn = new PDO($dsn, $user, $pwd, array(
PDO::MYSQL_ATTR_FOUND_ROWS => true, // 获取匹配的数据条数,而不是影响条数
PDO::ATTR_PERSISTENT => true, // 保持长连接
PDO::ATTR_EMULATE_PREPARES => false, // 禁止模拟预处理
PDO::ATTR_STRINGIFY_FETCHES => false // 不要自动转String
));
return self::$conn;
}
}
}
/** 获取上次的sql
* @return mixed
*/
public static function getSql()
{
return self::$sql;
}
/** 存储上次执行的sql
* @param $pre
*/
public static function setSql($pre)
{
ob_start();
$pre->debugDumpParams();
self::$sql = ob_get_clean();
}
/**
* 获取一个值(单行单列)
* @param string $sql
* @param array $args
* @return mixed
*/
public static function getOne(string $sql,array $args=array())
{
$DB = self::getConn();
$pre = $DB->prepare($sql);
$pre->execute($args);
self::setSql($pre);
$res = $pre->fetch(PDO::FETCH_NUM);
if(empty($res)){
return $res; // 空数组,直接返回
}else{
return $res[0];
}
}
/**
* 查询多行单列、或单行多列,封装为一个数组
* @param string $sql
* @param array $args
* @return mixed
*/
public static function getArr(string $sql,array $args=array())
{
$DB = self::getConn();
$pre = $DB->prepare($sql);
$pre->execute($args);
self::setSql($pre);
// 先假设为多行多列
$res = $pre->fetchAll(PDO::FETCH_ASSOC);
$res2 = array();
if (count($res) > 1) {
foreach ($res as $k => $v) { // 多行单列,取第一列
$res2[] = current($v);
}
} else {
if (empty($res)) { // 空数组,直接返回
return $res;
} else {
$res2 = $res[0]; // 单行多列,取第一行
}
}
return $res2;
}
/**
* 查询多条数据,并且封装为二维数组
* @param string $sql
* @param array $args
* @return mixed
*/
public static function getArrList(string $sql,array $args=array())
{
$DB = self::getConn();
$pre = $DB->prepare($sql);
$pre->execute($args);
self::setSql($pre);
return $pre->fetchAll(PDO::FETCH_ASSOC);
}
/**
* 自动分页查询,封装为纯数组格式
* @param int $page
* @param int $pageSize
* @param string $sql
* @param array $args
* @return array
*/
public static function getPage(int $page, int $pageSize, string $sql,array $args=array())
{
// 封装并返回结果
$data = array();
$data['pageInfo'] = self::getPageInfo($page,$pageSize,$sql);
$data['list'] = self::getPageList($page,$pageSize,$sql,$args);
return $data;
}
/**
* 获取分页数据统一接口
* @param int $page
* @param int $pageSize
* @param string $sql
* @param array $args
* @return array
*/
public static function getPageList(int $page,int $pageSize,string $sql,array $args=array()){
$db = self::$dbConfig['db'];
$db = strtolower($db); // 规范化命名,转小写
$method = "getPageList_".$db;
if(!method_exists(DB::class,$method)){
die("方法:".$method." 不存在");
}else{
// 灵活扩展,使用动态反射,获取 getPageList_数据库名() 方法返回的数据
return self::$method($page,$pageSize,$sql,$args);
}
}
/** mysql 分页数据获取
* @param int $page
* @param int $pageSize
* @param string $sql
* @param array $args
* @return mixed
*/
private static function getPageList_mysql(int $page,int $pageSize,string $sql,array $args=array()){
// 查询数据
$r_start = ($page - 1) * $pageSize;
$listSql = $sql . " limit $r_start,$pageSize";
return self::getArrList($listSql,$args);
}
/**
* 获取分页提示
* @param int $page
* @param int $pageSize
* @param string $sql
* @param array $args
* @return array
*/
public static function getPageInfo(int $page,int $pageSize,string $sql,array $args=array()){
// 取得总数
$total = self::count($sql,$args);
// 封装info
$pageInfo = array();
$pageInfo['page'] = $page; // 当前页数
$pageInfo['pageSize'] = $pageSize; // 页面大小
$pageInfo['totalCount'] = $total; // 总条数
$pageInfo['totalPage'] = ceil($total / $pageSize); // 总页数
return $pageInfo;
}
/**
* 新增、更新、删除语句
* @param string $sql
* @param array $args
* @return mixed
*/
public static function update(string $sql,array $args=array())
{
$DB = self::getConn();
$pre = $DB->prepare($sql);
$pre->execute($args);
self::setSql($pre);
return $pre->rowCount();
}
/** 计算sql总数
* @param string $sql
* @param array $args
* @return mixed
*/
public static function count(string $sql,array $args=array())
{
// 不要使用 rowCount ,其浪费内存且性能低,此外已经设定改为found_rows,所以rowCount可能在select得不到正确数据
$DB = self::getConn();
$pre = $DB->prepare("select count(*) total from ( " . $sql . " ) tmp_count");
$pre->execute($args);
self::setSql($pre);
$res = $pre->fetch(PDO::FETCH_ASSOC);
return (int)$res['total'];
}
/** 获取数据库一些基础信息
* @return mixed
*/
public static function getDbInfo()
{
$DB = self::getConn();
$info['autoCommit'] = $DB->getAttribute(PDO::ATTR_AUTOCOMMIT); // 事务的自动提交{1.是,2.否}
$info['dbType'] = $DB->getAttribute(PDO::ATTR_DRIVER_NAME);
$info['version'] = $DB->getAttribute(PDO::ATTR_SERVER_VERSION);
$info['info'] = $DB->getAttribute(PDO::ATTR_SERVER_INFO);
return $info;
}
/** 获取最后一个插入的自增主键
* @param string $sql
* @param array $args
* @return int|string
*/
public static function lastInsertId(string $sql,array $args=array())
{
$DB = self::getConn();
$res = self::update($sql,$args);
if ($res) {
return $DB->lastInsertId();
} else {
return 0;
}
}
/**
* 开启事务
*/
public static function begin(){
$DB = self::getConn();
$DB->setAttribute(PDO::ATTR_AUTOCOMMIT, false);
$DB->beginTransaction();
}
/**
* 提交事务
*/
public static function commit(){
$DB = self::getConn();
$DB->commit();
$DB->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
}
/**
* 事务回滚
*/
public static function rollBack(){
$DB = self::getConn();
$DB->rollBack();
$DB->setAttribute(PDO::ATTR_AUTOCOMMIT, true);
}
}
$res = DB::getPage(1,10,"select * from user where utype=:utype",[1]);
var_dump($res);
//$res1 = DB::getPage(1,2,"select * from user where utype=?",[1]);
本篇完,还有疑问?留下评论吧