-
21.获得最后一次SQL语句 public static function getLastSql(){ $link=self::$link; if(!$link)return false; return self::$queryStr; } 22.获得最后一次插入语句产生的AUTO_INCREMENT public static function getLastInsertId(){ $link=self::$link; if(!$link)return false; //在每次在execute()中执行SQL语句成功后获得self::$lastInsertId return self::$lastInsertId; } 23.获取服务器版本 public static function getDbVerion(){ $link=self::$link; if(!$link)return false; //在构造函数中链接数据库成功时获得self::$dbVersion return self::$dbVersion; } 24.获得数据库中的说有表 public static function showTables(){ $tables=array(); if(self::query("SHOW TABLES")){ $result=self::getAll(); foreach($result as $key=>$val){ $tables[$key]=current($val); } } return $tables; }查看全部
-
20.删除记录的操作 public static function delete($table,$where=null,$order=null,$limit=0){ $sql="DELETE FROM {$table} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); return self::execute($sql); }查看全部
-
19.更新记录 参数1为关联数组,键名为列名 public static function update($data,$table,$where=null,$order=null,$limit=0){ foreach($data as $key=>$val){ $sets.=$key."='".$val."',"; } //$sets最后会多一个逗号(上面连接字符串时定义所有的$val后面都添加了逗号).所有要去掉 $sets=rtrim($sets,','); $sql="UPDATE {$table} SET {$sets} ".self::parseWhere($where).self::parseOrder($order).self::parseLimit($limit); return self::execute($sql); }查看全部
-
18.添加记录的操作 参数1为关联数组,键名为列名,键值为数据; 参数2为 string public static function add($data,$table){ //获取关联数组内的所有键名,存储在索引字符串并返回 $keys=array_keys($data); //给$keys所有值添加单引号 array_walk($keys,array('PdoMySQL','addSpecialChar')); $fieldsStr=join(',',$keys); $values="'".join("','",array_values($data))."'"; $sql="INSERT {$table}({$fieldsStr}) VALUES({$values})"; //执行插入并返回受影响行条数; return self::execute($sql); }查看全部
-
17.对解析限制显示条数limit函数添加功能(判断其是否为数字) public static function parseLimit($limit){ $limitStr=''; if(is_array($limit)){ //count(array,mode)返回数组中元素的数目。mode=0:返回第一维数组元素数目, mode=1:返回所有数组元素数目 if(count($limit)>1){ $limitStr.=' LIMIT '.$limit[0].','.$limit[1]; }else{ $limitStr.=' LIMIT '.$limit[0]; } }elseif(is_string($limit)&&!empty($limit)){ $limitStr.=' LIMIT '.$limit; //判断是否为数字 }elseif(is_numeric($limit)&&!empty($limit)){ $limitStr.=' LIMIT '.$limit; } return $limitStr; }查看全部
-
15.对分组结果通过Having子句进行二次删选 //设置的Having条件必须为字符串且有值,否则返回空字符串 public static function parseHaving($having){ $havingStr=''; if(is_string($having)&&!empty($having)){ $havingStr.=' HAVING '.$having; } return $havingStr; } 16.解析Order by //设置的Order by条件必须为 数组 或 有字符的字符串,否则返回空字符串 public static function parseOrder($order){ $orderStr=''; if(is_array($order)){ //join()拼接数组成字符串 $orderStr.=' ORDER BY '.join(',',$order); }elseif(is_string($order)&&!empty($order)){ $orderStr.=' ORDER BY '.$order; } return $orderStr; } 17.解析限制显示条数limit //设置的limit条件必须为 数组 或 有字符的字符串,否则返回空字符串 public static function parseLimit($limit){ $limitStr=''; if(is_array($limit)){ if(count($limit)>1){ //从第$limit[0]条记录往下去$limit[1]条记录 //防止用户输入多于两个的数组值,所有不用jion(),implode()等函数 $limitStr.=' LIMIT '.$limit[0].','.$limit[1]; }else{ $limitStr.=' LIMIT '.$limit[0]; //从第一条记录开始往下去$limit[0]条记录 } }elseif(is_string($limit)&&!empty($limit)){ $limitStr.=' LIMIT '.$limit; } return $limitStr; }查看全部
-
12.执行普通查询 public static function find($tables,$where=null,$fields='*',$group=null,$having=null,$order=null,$limit=null){ $sql='SELECT '.self::parseFields($fields).' FROM '.$tables .self::parseWhere($where) .self::parseGroup($group) .self::parseHaving($having) .self::parseOrder($order) .self::parseLimit($limit); $dataAll=self::getAll($sql); //count(array,mode)返回数组中元素的数目。mode=0:返回第一维数组元素数目, mode=1:返回所有数组元素数目 return count($dataAll)==1?$dataAll[0]:$dataAll; } 13.解析Where条件 //设置的where条件必须为字符串且有值,否则返回空字符串 public static function parseWhere($where){ $whereStr=''; if(is_string($where)&&!empty($where)){ $whereStr=' WHERE '.$where; } return $whereStr; } 14.解析group by条件 //设置的group by条件必须为 数组 或 有字符的字符串,否则返回空字符串 public static function parseGroup($group){ $groupStr=''; if(is_array($group)){ //implode()拼接数组成字符串 $groupStr.=' GROUP BY '.implode(',',$group); }elseif(is_string($group)&&!empty($group)){ $groupStr.=' GROUP BY '.$group; } return $groupStr; }查看全部
-
11.通过反引号引用字段 /*解释一下这里不用做处理的原因,就是说,如果用'`'引用起来的这种就如 select name ,esc from user where id=1;这里的esc是保留字会报错, select name ,`desc` from user where id=1;这样就可以执行,同理 select name,user.desc from user where id=1,也是同样可以执行的; 所以这里的判断就是判断这两种情况。*/ //测参数是否为'*' 或 是否已经拥有'.' 或 是否拥有反引号,如果是则不处理,如果没有则给参数添加单引号(参数为引用传递) public static function addSpecialChar(&$value){ if($value==='*'||strpos($value,'.')!==false||strpos($value,'`')!==false){ //不用做处理 }elseif(strpos($value,'`')===false){ //如果没有单引号,添加单引号 $value='`'.trim($value).'`'; } return $value; }查看全部
-
9.根据主键查找记录 public static function findById($tabName,$priId,$fields='*'){ $sql='SELECT %s FROM %s WHERE id=%d'; return self::getRow(sprintf($sql,self::parseFields($fields),$tabName,$priId)); } 10.解析字段 public static function parseFields($fields){ if(is_array($fields)){ //为数组时 //array_walk()对数组中的每个元素应用用户自定义函数(或方法),第二个参数表示:调用的自定义方法为PdoMySQL::addSpecialChar() //PdoMySQL::addSpecialChar()给参数添加单引号(参数为引用传递) array_walk($fields,array('PdoMySQL','addSpecialChar')); $fieldsStr=implode(',',$fields); }elseif(is_string($fields)&&!empty($fields)){ if(strpos($fields,'`')===false){ //字符串中没有单引号 $fields=explode(',',$fields); array_walk($fields,array('PdoMySQL','addSpecialChar')); $fieldsStr=implode(',',$fields); }else{ $fieldsStr=$fields; } }else{ $fieldsStr='*'; } return $fieldsStr; }查看全部
-
7.获得存放结果集中一条记录的关联数组 public static function getRow($sql=null){ if($sql!=null){ self::query($sql); } $result=self::$PDOStatement->fetch(constant("PDO::FETCH_ASSOC")); return $result; } 8.执行增删改操作,返回受影响的记录的条数 public static function execute($sql=null){ //获取连接标识符 $link=self::$link; if(!$link) return false; //保存本次查询语句 self::$queryStr=$sql; //判断之前是否有结果集,如果有的话,释放结果集 if(!empty(self::$PDOStatement))self::free(); //POD::exec()方法返回受影响的记录的条数 或 false $result=$link->exec(self::$queryStr); //查看本次查询是否有错误,如果有则打印本次错误信息 self::haveErrorThrowException(); if($result){ //保存上一步插入操作产生AUTO_INCREMENT self::$lastInsertId=$link->lastInsertId(); //保存上一步操作产生受影响的记录的条数 self::$numRows=$result; return self::$numRows; }else{ return false; } }查看全部
-
5.自定义异常处理程序 public static function throw_exception($errMsg){ echo '<div > '.$errMsg.' </div>'; } 6.释放结果集 public static function free(){ self::$PDOStatement=null; }查看全部
-
3.查询语句(只能执行一条SQL语句) public static function query($sql=''){ //获取连接标识符 $link=self::$link; if(!$link) return false; //判断之前是否有结果集,如果有的话,释放结果集 if(!empty(self::$PDOStatement))self::free(); //保存本次查询语句 self::$queryStr=$sql; //预处理语句只能执行一条SQL语句 self::$PDOStatement=$link->prepare(self::$queryStr); $res=self::$PDOStatement->execute(); //查看本次查询是否有错误,如果有则打印本次错误信息 self::haveErrorThrowException(); return $res; } 4.查看最近一次 查询 或 连接 是否有错误,如果有则打印本次错误信息并返回false public static function haveErrorThrowException(){ $obj=empty(self::$PDOStatement)?self::$link: self::$PDOStatement; $arrError=$obj->errorInfo(); //错误信息数组下标为[0]的值为'00000'表示没有错误 if($arrError[0]!='00000'){ //获取错误信息并抛出异常 self::$error='SQLSTATE: '.$arrError[0].' <br/>SQL Error: '.$arrError[2].'<br/>Error SQL:'.self::$queryStr; self::throw_exception(self::$error); return false; } if(self::$queryStr==''){ self::throw_exception('没有执行SQL语句'); return false; } }查看全部
-
2.获取存放结果集中所有记录的关联数组 public static function getAll($sql=null){ if($sql!=null){ self::query($sql); } $result=self::$PDOStatement->fetchAll(constant("PDO::FETCH_ASSOC")); return $result; }查看全部
-
1.构造函数解析下篇 1.2).参数设置完成后的链接部分 //判断静态变量self::$link是否还没有没有被赋值(即之前没有数据库被连接) //即在之前没有连接其他数据库情况下,才能开始本次数据库的连接 if(!isset(self::$link)){ //保存本次连接参数 $configs=self::$config; if(self::$pconnect){ //开启长连接,添加到配置数组中 $configs['params'][constant("PDO::ATTR_PERSISTENT")]=true; } try{ self::$link=new PDO($configs['dsn'],$configs['username'],$configs['password'],$configs['params']); }catch(PDOException $e){ self::throw_exception($e->getMessage()); } //连接失败 if(!self::$link){ self::throw_exception('PDO连接错误'); return false; } //设置字符集 self::$link->exec('SET NAMES '.DB_CHARSET); //获取服务器版本 self::$dbVersion=self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION")); //设置连接成功标志符 self::$connected=true; //释放临时存放连接参数变量 unset($configs); } }查看全部
-
1.构造函数解析上篇 1.1).参数获取与判断部分 public function __construct($dbConfig=''){ //PHP将所有以 __(两个下划线)开头的类方法保留为魔术方法 if(!class_exists("PDO")){ //判断是否加载了PDO扩展 self::throw_exception('不支持PDO,请先开启'); } if(!is_array($dbConfig)){ //判断是否传参给构造函数,如果没有传参则取默认值 $dbConfig=array( 'hostname'=>DB_HOST, 'username'=>DB_USER, 'password'=>DB_PWD, 'database'=>DB_NAME, 'hostport'=>DB_PORT, 'dbms'=>DB_TYPE, 'dsn'=>DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME ); } //如果用户传参,但没有填写必填 //用户没有填写主机名,则抛出自定义异常程序 if(empty($dbConfig['hostname']))self::throw_exception('没有定义数据库配置,请先定义'); //获取用户连接参数,保存到自定义变量中 self::$config=$dbConfig; //用户没有填写驱动的连接选项,则赋空数组为默认值 if(empty(self::$config['params']))self::$config['params']=array();查看全部
举报
0/150
提交
取消