<?php
/*************************************************************
数据库连接类
*************************************************************/
class Db{
static private $_instance=null;
static private $conn=null;
private $table;
private $where;
private $data;
private $field="*";
private $arrk=array();
private $arrv=array();
function __construct(){
$username=config("database.username");
$password=config("database.password");
$servername=config("database.servername");
$dbname=config("database.dbname");
$dns="mysql:host=".$servername.";dbname=".$dbname;
self::$conn=new PDO($dns,$username,$password);
self::$conn->exec("set names utf8");
}
/*
获取实例
*/
static function get_instance(){
if (self::$_instance==null) {
# code...
self::$_instance=new self;
}
return self::$_instance;
}
/*
获取数据库连接
*/
static function get_conn(){
if (self::$conn==null) {
new self;
}
return self::$conn;
}
function setTable($table=''){
//表
$this->table=$table;
return self::$_instance;
}
function data($data){
//数据
//$data=array('account'=>'15','password'=>'15','username'=>"十五");
// (account,password,username) values('1','1','1'),('2','2','2') ";
$i=1;
foreach ($data as $key => $value) {
# code...
$v[$i]="?";
$arrk[$i]=$key;
$arrv[$i]=$value;
$i++;
}
$this->arrv=$arrv;
$v1="(".implode(",", $v).")";
$this->data="(".implode(",", $arrk).")"." values ".$v1;
return self::$_instance;
}
function field($field=array()){
//字段
if ($field==null) {
# code...
$this->field="*";
}else{
$this->field=implode(",",$field);
}
return self::$_instance;
}
function where($where=array()){
//条件
// $where=array("account"=>1,'username'=>"杨");
if ($where==null) {
# code...
$this->where='';
}
else{
$i=1;
foreach ($where as $key => $value) {
$arrk[$i]=$key."=?";
$arrv[$i]=$value;
$i++;
}
$this->arrv=$arrv;
$this->where=" where ".implode(" and ",$arrk);
}
return self::$_instance;
}
/*
查:不允许无条件查询
*/
function select($field=array(),$where=array()){
if (func_num_args()) { //获取参数个数,使用这种方法,至少传递一个参数,可以是array()
$this->field($field);
$this->where($where);
}
$sql="select ".$this->field." from ".$this->table.$this->where;
echo $sql;
exit();
$stmt=$this->bind($sql);
$res=$stmt->fetchAll(PDO::FETCH_ASSOC);
return $res;
}
/*
增:暂时实现插入一条数据
*/
function insert($data=array()){
if (func_num_args()) { //获取参数个数,用来区分不用的调用方式
$this->data($data);
}
//$sql="insert into users (account,password,username) values('1','1','1'),('2','2','2') ";
$sql="insert into ".$this->table.$this->data;
$stmt=$this->bind($sql);
return $stmt->rowCount(); //返回影响条数
}
/*
删
*/
function delete($where=array()){
if (func_num_args()) { //获取参数个数,用来区分不用的调用方式
$this->where($where);
}
//$sql="delete from users where id=1";
$sql="delete from ".$this->table.$this->where;
$stmt=$this->bind($sql);
return $stmt->rowCount();
}
/*
改:没有完全使用参数绑定
*/
function update($data,$where){
if (func_num_args()) { //获取参数个数,用来区分不用的调用方式
$this->where($where);
}
//update person set number=null,name=null where;
$i=1;
foreach ($data as $key => $value) {
# code...
$arrk[$i]=$key."=".$value;
$i++;
}
$v=implode(",", $arrk);
$sql="update ".$this->table." set ".$v.$this->where;
$stmt=$this->bind($sql);
$res=$stmt->rowCount();
return $r;
}
/*
实现预处理,动态参数绑定,执行sql语句
*/
function bind($sql){
$stmt=self::$conn->prepare($sql);
foreach ($this->arrv as $key => $value) { //动态参数绑定
$stmt->bindValue($key,$value);
}
$stmt->execute();
return $stmt;
}
}
/**********************************************************************
单例模式:保证系统中只有一个实例
1.this是指向对象实例的一个指针
2.self是类本身的引用self::$pdo,Db::$pdo
3.parent是对父类的引用
4.直接通过Db::connect()调用静态函数
5.静态成员变量只有new Db的时候初始化值
6.静态函数只能访问静态成员变量,不能访问普通成员变量
7.通过定义私有构造函数,拷贝函数,阻止外部实例化类,因为私有属性只能在函数内部调用
************************************************************************/
github:https//github.com/comeonjy/php