先说好,麻烦各位手下留情,头破血流的写了这么一个类,鄙视的话请温柔些。主要觉得DB类里有面向对象,有PDO,有sql语句,还有
try...catch.这些都是刚教的,融合融合写在一起也加深下理解,写到后面写嗨了,就真想写个以后一直能用的类,现在这个样子还算满意。有写的不合适的地方,大家多提意见,其他的我选择性忽略。
多说几句废话,好多同学刚开始的学面向对象的时候都很懵,我也一样,然后我就不耻下问的去问度娘,度娘说了一大堆废话,翻来覆去的总是那几句。在我心生恨意,低头不语的时候,忽然悟了,不是悟了什么是面向对象,是悟了度娘为什么要把这几句废话翻来覆去的说。原来重点不在于什么是面向对象,而在于你是不是
“明白”面向对象。好吧!我也开始废话了。我的意思是说,如果你从来没有吃过盐,那不论我怎么解释什么是咸,你都不会“明白”对吧。人总是喜欢用比较的方式来理解一个新事物,当发现这个事物居然在经验中没有合适比较的东西时候,就会有点懵,就会不“明白”。就像要用个模板来,套的住的部分能“明白”,套不住的部分,通过比较区别也能“明白”。现在面向对象编程没有合适模板来套,就傻了。有人说,别废话!敢不敢来直接点的。好吧,直接的答案就是把模板能套的都套上去,把没有模板套的变成模板。“这个东西就是这样!”,“你不停的练把它记住就好了”。这两句话熟悉不?你们老师有木有给你们说过,其实目的就是让你把不“明白”的东西练熟,记牢。然后你就“明白”了。
度娘翻来覆去的废话也是想给我说明这个道理吧!明白了这个道理后,我把老师写的DB类敲了6遍,其他类也没放过,然后写了下面的类。额,我意思不是下面类全抄老师的,大部分都是我自己思路哇!算了,不解释,解释就是掩饰是吧?要真不解释就是默认对吧?恩,我懂。。。
开始贴代码,把数据库连接,用户名,密码什么的一改就能用,你会的。连接建立后,echo一下对象就有各种属性,方法说明了。也希望大家能在面向对象的康庄大道上一路狂飚,嗨不嗨自己知道。。。。。
-
- class db
- {
- public $DB=null;
- public $DB_TYPE="mysql";
- public $DB_HOST="localhost";
- public $DB_NAME="db49";
- public $DB_USER="root";
- public $DB_PWD="123";
- public $DB_CHARSET="utf8";
- public $allTableNames=array();
- private $tableName=null;
- private $stmt=null;
- private $fields=array();
- public $pk=null;
-
-
-
- //类实例化传参数的格式为(数据库类别,主机地址,数据库名,用户名,密码,字符集,如留空将按默认连接)
- public function
__construct($type="mysql",$host="localhost",$dbname="db49",$user="root",$pass="123456",$charset="utf8"){
- //$cons=func_get_args();
- //var_dump($type);
- //var_dump($host);
- //var_dump($name);
- //exit;
- $this->DB_TYPE=$type;
- $this->DB_HOST=$host;
- $this->DB_NAME=$dbname;
- $this->DB_USER=$user;
- $this->DB_PWD=$pass;
- $this->DB_CHARSET=$charset;
- $this->connect();
- $this->DB->setAttribute(PDO::ATTR_EMULATE_PREPARES,true);
- $this->DB->query('SET NAMES'.$this->charset);
- $this->getTablesName();
- $this->DB->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
- $this->DB->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
,true);
- $this->DB->setAttribute(PDO::ATTR_AUTOCOMMIT,0);
-
-
- }
-
- public function __destruct(){
- $this->close();
-
- }
-
- public function close(){
- $this->DB=null;
- }
-
-
-
- private function connect(){
- try{
- $this->DB=new
PDO($this->DB_TYPE.":host=".$this->DB_HOST.";dbname=".$this->DB_NAME,$this->DB_USER,$this->DB_PWD);
- }catch(PDOException $e){
- die("数据库连接错误:".$e->getMessage());
- }
- }
-
-
- //获取表名
- public function getTablesName(){
- try{
- $this->stmt=$this->DB->query('show tables');
- //var_dump($this->DB->errorinfo());
- while($row=$this->stmt->fetch(PDO::FETCH_NUM)){
- $this->allTableNames[]=$row[0];
- }
- return $this->allTableNames;
- $this->stmt=null;
- }catch(PDOException $e){
- die("获取数据库表名失败".$e->getMessage());
- }
-
- }
-
-
- //设定使用的表名
- public function usetable($tname){
- try{
- if(in_array($tname,$this->allTableNames)){
- $this->tableName=$tname;
- $this->stmt=$this->DB->query("desc
".$this->tableName);
- $this->fieldsall=$this->stmt->fetchAll(PDO::FETCH_ASSOC);
- foreach ($this->fieldsall as $row){
- $this->fields[]=$row['Field'];
- if($row['Key']=="PRI"){
- $this->pk=$row['Field'];
- }
- }
- $table['tablename']=$this->tableName;
- $table['prikey']=$this->pk;
- return $table;
- $this->stmt=null;
- }else{
- echo
"数据库未找到:在库'".$this->allTableNames."'中查找表'".$tname."'失败";
- }
- }catch(PDOException $e){
- die("获取数据库字段失败".$e->getMessage());
- }
- }
-
-
-
- //查看已设定的表的所有字段
- public function seefields(){
- foreach ($this->fields as $row){
-
- echo "字段名:".$row['Field']." ,类型:".$row['Type']."
,是否为空:".$row['Null']." ,是否为主键:".$row['Key']."
,默认值:".$row['Default']." ,额外设定:".$row['Extra']."
";
- }
-
- }
-
-
-
- //插入方法,传入变量格式为("字段名","值","字段名2","值2".....)
- public function insert($post=array()){
- //var_dump(func_get_args());
- //var_dump($post);
- $param=func_get_args();
- //var_dump($param);
- if(!empty($param)){
- if(count($param)%2!=0){
- echo "对不起,参数传递需要成对";
- exit;
- }
- for($i=0;$i
- if($i%2==0){
- $fields[]=$param[$i];
- }else{
- $value[]=$param[$i];
- }
- }
- for($i=0;$i
- if(in_array($fields[$i],$this->fields) &&
$fields[$i]!=$this->pk){
- $fieldslist[]=$fields[$i];
- $valuelist[]=$value[$i];
- }else{
- continue;
- }
- }
-
- }
-
- try{
- $sql="insert into `{$this->tableName}`
(`".implode('`,`',$fieldslist)."`)
values('".implode("','",$valuelist)."')";
- $this->DB->beginTransaction();
- $stmtrow=$this->DB->exec($sql);
- $this->DB->commit();
- return $stmtrow;
- }catch(PDOException $e){
- $this->DB->rollback();
- die("插入字段失败:".$e->getMessage());
-
- }
- }
-
-
-
- //where字句设定为传入变量的第一项,其后所有传入参数为set字句的选项,格式为"字段名=值",
- public function update(){
- $param=func_get_args();
- //var_dump(func_get_args());
- //将where语句从数组中提取出来
- $tWhere=$param[0];
- //将where语句的值加上前单引号,后单引号在sql语句拼装时加上
- $tWhere=str_replace("=","='",$tWhere);
- //将where语句从数组中删除,剩下的都是set的语句
- array_shift($param);
- //将数组中的语句拼装成set语句
- $tSet=implode("',",$param);
- //将set语句的值加上前单引号
- $tSet=str_replace("=","='",$tSet);
- //测试传入的where字句是否正确
- $sqltest="select * from `{$this->tableName}` where
".$tWhere."'";
- try{
- $stmt=$this->DB->query($sqltest);
- if($stmt->rowCount()<=0){
- throw new Exception("where语句设定有误");
- }
- }catch(Exception $e){
- die( $e->getMessage());
- }
- //拼装更新用sql语句
- $sql="update `{$this->tableName}` set ".$tSet."' where
".$tWhere."'";
- try{
- $this->DB->beginTransaction();
- $stmtrow=$this->DB->exec($sql);
- $this->DB->commit();
- return $stmtrow;
- }catch(PDOException $e){
- $this->DB->rollback();
- die("更新失败:".$e->getMessage());
-
- }
- }
-
- //接受传入的主键值为删除依据
- public function del($id){
- //拼装sql语句
- $sql="delete from `{$this->tableName}` where
{$this->pk}='{$id}'";
- echo $sql;
- try{
- $stmt=$this->DB->exec($sql);
- if($stmt<=0){
- throw new Exception ("从新检查键值");
- }
- return $stmt;
- }catch(Exception $e){
- die("删除键值为:".$id."失败,失败原因:".$e->getMessage());
- }
- }
-
-
- //传入参数为(用逗号分隔的字段名或*号,where字句,order by字句,limit字句,如果中间没有条件,用双引号留空)
- public function select($fields,$where,$order,$limit){
- $sql="select {$fields} FROM {$this->tableName}";
- if($where!=""){
- $sql.=" WHERE ".$where;
- }
- if($order!=""){
- $sql.=" ORDER BY ".$order;
- }
- if($limit!=""){
- $sql.=" LIMIT ".$limit;
- }
- try{
- $stmt=$this->DB->query($sql);
- $result=$stmt->fetchAll();
- $stmt=null;
- return $result;
- }catch(PDOException $e){
- echo $e->getMessage();
- }
-
-
- }
-
-
-
- //输出该类的所有可用方法,属性和说明
- public function __toString(){
- $str=
"您当前使用用户名'{$this->DB_USER}'已建立对库'{$this->DB_NAME}'中数据表'{$this->tableName}'的连接
";
- $str.="查询该库中所有数据表,请查询该对象的'allTableNames'属性数组
";
- $st.="选定数据表,请使用该对象的'usetable'方法,参数为表名";
- $str.="查询已选择数据表中的所有字段属性,请调用该对象的'seefields'方法
";
- $str.="查询已选择数据表中的主键,请查询该对象的'pk'属性
";
- $str.="插入数据请使用该对象的'insert'方法,传递参数使用格式为(\"字段名\",\"值\",\"字段名2\",\"值2\".....)
";
- $str.="更新数据请使用该对象的'update'方法,传递参数第一项为where字句条件,其后需更新的字段,格式为(\"条件字段名=值\",\"更新字段名=值\",[\"更新字段名2=值2\"],.....)
";
- $str.="删除数据请使用该对象的'del'方法,接受主键值为删除条件
";
- $str.="
查询数据请使用该对象的'select'方法,传递参数的第一项为要查询的字段名,多个字段使用逗号分隔,全选使用*号,
参数第二项为'where'字句的条件字段,
参数第三项为'order
by'字句的条件字段,
参数第四项为'limit'条件的条件字段,使用逗号分隔起始值和长度数值,第二三四项如果无要求请使用双引号留空
";
- return $str;
-
- }
- }
原文地址:
阅读(563) | 评论(0) | 转发(0) |