PHP封装DB类

<?php

namespace DB;
use PDO;
/*require_once("SQL.class.php");
use SQL\SQL;*/

/**
* DB类
*/
class DB
{

private $dbmethod = ‘‘;//数据库类型
private $dbhost = ‘‘;//数据库主机名
private $dbport = ‘‘;//数据库端口
private $dbname = ‘‘;//使用的数据库
private $dbuser = ‘‘;//数据库连接用户名
private $dbpass = ‘‘;//对应的密码
private $charset = ‘‘;//数据库编码
private $pdo = ‘‘;
private static $_instance;//单例模式

/**
******************************************************************************************
* *
* 单例模式 *
* *
* @param $_instance 静态变量给用户提供唯一线程 *
* *
* *
******************************************************************************************/
public static function getInstance(){
if (!self::$_instance instanceof self) {
self::$_instance = new self();

}
return self::$_instance;
}

/**
******************************************************************************************
* *
* 防止克隆 已经覆盖此方法 *
* *
* *
* *
* *
******************************************************************************************/


private function __clone(){
echo "ERROR....禁止克隆";
}

/**
******************************************************************************************
* *
* 那个啥 构造函数在实例创建的时候调用, 多用来初始化数据 *
* @param $dbmethod *
* @param $dbhost *
* @param $dbport *
* @param $dbname *
* @param $dbuser *
* @param $dbpass *
* @param $charset *
* *
******************************************************************************************/
private function __construct(&$dbmethod=null,&$dbhost=null,&$dbport=null,&$dbname=null,&$dbuser=null,&$dbpass=null,&$charset=null)
{
//初始化数据
$this->dbmethod = $dbmethod ?? ‘mysql‘;
$this->dbhost = $dbhost ?? ‘localhost‘;
$this->dbport = $dbport ?? ‘3306‘;
$this->dbname = $dbname ?? ‘user‘;
$this->dbuser = $dbuser ?? ‘root‘;
$this->dbpass = $dbpass ?? ‘123456‘;
$this->charset = $charset ?? ‘utf8‘;
//echo $dbmethod.‘-‘.$dbhost.‘-‘.$dbname.‘-‘.$dbuser.‘-‘.$dbpass;
$dsn="$this->dbmethod:
host=$this->dbhost;
port=$this->dbport;
dbname=$this->dbname;
charset=$this->charset";

try{
//连接数据库
//var_dump(new PDO($dsn,$this->dbuser,$this->dbpass)
$this->pdo = new PDO($dsn,$this->dbuser,$this->dbpass);
// 设置sql语句查询如果出现问题 就会抛出异常
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

echo "PDO连接".$this->dbmethod."成功";

}catch(PDOException $e){
die("连接失败: ".$e->getMessage());
}


}


//初始化数据
//预留


/**
******************************************************************************************
* *
* 目前DB类只支持增删改查 *
* @param *
* 数据库增删改查思路: *
* 1、如果是直接传入sql语句,那么怎么使用预处理? *
* 2、如果是传入参数太多,那么会不会太繁杂?,弄得自己都不知道怎么用了 *
* 3、创建一个适合自己用的数据库操作方法,还是创建一个适合大众用的数据库操作方法 ? *
* 4、我觉得应该是创建一个适合于自己用的就行,项目都是个人全栈,那么不需要适用于别人 *
* 5、从什么地方入手?我会用到execute()预编译 那么就需要我在类方法内部生成一个sql语句 *
* 6、那既然这样我就只需要传入参数就行,不需要传入一个sql语句 *
* 7、在内部建立sql语句,这需要比较了解sql语句的一系列参数,需要熟悉mysql语法 *
* 8、Select [select选项] 字段列表[字段别名]/* from 数据源 [where 字句] *
* [group by子句 ][having 子句][order by 子句][limit 子句] , *
* 开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句-> *
* ORDER BY子句->SELECT子句->LIMIT子句->最终结果 *
* 9、按照上述语法我们来创建sql和其需要的参数,最后进行预编译 *
* 10、下面我们用代码来验证上面的理论 *
******************************************************************************************/
public function query($obj){
if (is_object($obj)) {
Goto jump;
}else{
echo "请传入一个对象,我在第".__LINE__."行";
exit;
}
jump:
foreach ($obj as $key => $value) {
//操作数据方法
if ("method" == $key && $value) {
$sql.=strtoupper($value);
}
//要查询的字段
if ("fiel_list" == $key && $value) {
foreach ($value as $list) {
$sql.=" $list ";

}
}
//要查询的表
if ("table" == $key && $value) {
$sql.= " FROM $value ";
}
//条件查询
if ("where" == $key && $value) {
$sql.=" where ";
foreach ($value as $k => $where) {
$sql.=" $k=:$k and ";
$param[$k] = $where;
}
//从末尾删除4个字符串
$sql = substr_replace($sql,"",-4);

}
//分组查询
if ("group" == $key && $value) {
$sql.="group by $value ";

}
//条件查询
if ("having" == $key && $value) {
$sql.=" having ";
foreach ($value as $k => $having) {
$sql.=" $k=:$k and ";
$param[$k] = $having;
}
$sql = substr_replace($sql,"",-4);
}
//顺序查询
if ("order" == $key && $value) {
$sql.=" order by $value ";

}
//限制查询
if ("limit" == $key && $value) {
$sql.=" limit ".$value ;

}


}

echo "$sql";
var_dump($param);
//预处理
$stmt = $this->pdo->prepare($sql);
//3.执行
$stmt->execute($param);
while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
echo "<br>";
}



}

/**
* *****************************学***习***笔***记******************************************
* @param PDOStatement一些常用方法↓↓↓↓↓↓↓↓ *
* 1、$result->rowCount()."<br>";//总行数 *
* 2、$result->columnCount()."<br>";//总列数 *
* 3、$result->fetchColumn();取的是第0列 然后指针下移 *
* 4、$result->fetchAll(PDO::FETCH_ASSOC);//返回二维关联数组 *
* 5、$result->fetch(PDO::FETCH_ASSOC);//返回①维关联数组,指针下移 *
* 第5条推荐使用while来获取每一条数据源 *
* while ( $row = $result->fetch(PDO::FETCH_ASSOC) ) { *
* $rows[] = $row; *
* } *
******************************************************************************************/

 

 


/**
******************************************************************************************
* *
* 这个是析构方法 用来销毁变量 会在实例变成垃圾的时候调用 *
* *
* @param *
* *
* *
* *
******************************************************************************************/
/* private function __destruct(){
echo "该实例已经销毁";
}
*/

public function getpdo(){
//访问私有属性pdo
return $this->pdo;
}

 

 

}


$link = DB::getInstance();

var_dump($link);
$sql = "INSERT INTO user (username,password,email,iphone) VALUES (‘yishenghan‘,‘ysh19990711‘,‘812040713@qq.com‘,‘18280513907‘)";
$sql = "SELECT * FROM user";
$sql = (object) [
"method" => "select",
"fiel_list" => ["*"],
"table" => ‘user‘,
"where" => ["username" => "yishenghan ","password" => "ysh19990711",],
"group" => "id",
"having" => ["email" => "812040713@qq.com","iphone" => "18280513907"],
"order" => "id DESC",
"limit" => "3,5",

];
/*$sql="CREATE TABLE user (
id int NOT NULL AUTO_INCREMENT,
username varchar(255) NULL,
password varchar(255) NULL,
email varchar(255) NULL,
iphone varchar(255) NULL,
PRIMARY KEY (id),
UNIQUE INDEX id(id)
)";*/


$link->query($sql);
?>

PHP封装DB类

上一篇:.NET之生成数据库全流程


下一篇:这就尴尬了 管信息的机构被曝信息泄露