PHP PDO_MYSQL 链式操作 非链式操作类
Posted 落花之语
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP PDO_MYSQL 链式操作 非链式操作类相关的知识,希望对你有一定的参考价值。
<?php /* vim: set expandtab tabstop=4 shiftwidth=4: */ // +----------------------------------------------------------------------+ // | PHP version 5 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2004 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 3.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available through the world-wide-web at the following url: | // | http://www.php.net/license/3_0.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | [email protected] so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Original Author <[email protected]> | // | Your Name <[email protected]> | // +----------------------------------------------------------------------+ // // $Id:$ class pdomysql { public $dbtype = ‘mysql‘; public $dbhost = ‘127.0.0.1‘; public $dbport = ‘3306‘; public $dbname = ‘test‘; public $dbuser = ‘root‘; public $dbpass = ‘‘; public $charset = ‘utf-8‘; public $stmt = null; public $DB = null; public $connect = true; // 是否長连接 public $debug = true; private $parms = array(); private $sql = array( "db" => "", "from" => "", "where" => "", "order" => "", "limit" => "" ); /** * 构造函数 */ public function __construct() { $this->connect(); $this->DB->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $this->DB->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $this->execute(‘SET NAMES ‘ . $this->charset); } /** * 析构函数 */ public function __destruct() { $this->close(); } /** * *******************基本方法开始******************** */ /** * 作用:连結数据库 */ public function connect() { try { $this->DB = new PDO($this->dbtype . ‘:host=‘ . $this->dbhost . ‘;port=‘ . $this->dbport . ‘;dbname=‘ . $this->dbname, $this->dbuser, $this->dbpass, array( PDO::ATTR_PERSISTENT => $this->connect )); } catch(PDOException $e) { die("Connect Error Infomation:" . $e->getMessage()); } } /** * 关闭数据连接 */ public function close() { $this->DB = null; } /** * 對字串進行转義 */ public function quote($str) { return $this->DB->quote($str); } /** * 作用:获取数据表里的欄位 * 返回:表字段结构 * 类型:数组 */ public function getFields($table) { $this->stmt = $this->DB->query("DESCRIBE $table"); $result = $this->stmt->fetchAll(PDO::FETCH_ASSOC); $this->stmt = null; return $result; } /** * 作用:获得最后INSERT的主鍵ID * 返回:最后INSERT的主鍵ID * 类型:数字 */ public function getLastId() { return $this->DB->lastInsertId(); } /** * 作用:執行INSERTUPDATEDELETE * 返回:执行語句影响行数 * 类型:数字 */ public function execute($sql) { $this->getPDOError($sql); return $this->DB->exec($sql); } /** * 获取要操作的数据 * 返回:合併后的SQL語句 * 类型:字串 */ private function getCode($table, $args) { $code = ‘‘; if (is_array($args)) { foreach ($args as $k => $v) { if ($v == ‘‘) { continue; } $code.= "`$k`=‘$v‘,"; } } $code = substr($code, 0, -1); return $code; } public function optimizeTable($table) { $sql = "OPTIMIZE TABLE $table"; $this->execute($sql); } /** * 执行具体SQL操作 * 返回:运行結果 * 类型:数组 */ private function _fetch($sql, $type) { $result = array(); $this->stmt = $this->DB->query($sql); $this->getPDOError($sql); $this->stmt->setFetchMode(PDO::FETCH_ASSOC); switch ($type) { case ‘0‘: $result = $this->stmt->fetch(); break; case ‘1‘: $result = $this->stmt->fetchAll(); break; case ‘2‘: $result = $this->stmt->rowCount(); break; } $this->stmt = null; return $result; } /** * *******************基本方法結束******************** */ /** * *******************Sql操作方法开始******************** */ /** * 作用:插入数据 * 返回:表內記录 * 类型:数组 * 參数:$db->insert(‘$table‘,array(‘title‘=>‘Zxsv‘)) */ public function add($table, $args) { $sql = "INSERT INTO `$table` SET "; $code = $this->getCode($table, $args); $sql.= $code; return $this->execute($sql); } /** * 修改数据 * 返回:記录数 * 类型:数字 * 參数:$db->up($table,array(‘title‘=>‘Zxsv‘),array(‘id‘=>‘1‘),$where * =‘id=3‘); */ public function up($table, $args, $where) { $code = $this->getCode($table, $args); $sql = "UPDATE `$table` SET "; $sql.= $code; $sql.= " Where $where"; return $this->execute($sql); } /** * 作用:刪除数据 * 返回:表內記录 * 类型:数组 * 參数:$db->del($table,$condition = null,$where =‘id=3‘) */ public function del($table, $where) { $sql = "DELETE FROM `$table` Where $where"; return $this->execute($sql); } /** * 作用:获取單行数据 * 返回:表內第一条記录 * 类型:数组 * 參数:$db->fetOne($table,$condition = null,$field = ‘*‘,$where =‘‘) */ public function fetOne($table, $field = ‘*‘, $where = false) { $sql = "SELECT {$field} FROM `{$table}`"; $sql.= ($where) ? " WHERE $where" : ‘‘; return $this->_fetch($sql, $type = ‘0‘); } /** * 作用:获取所有数据 * 返回:表內記录 * 类型:二維数组 * 參数:$db->fetAll(‘$table‘,$condition = ‘‘,$field = ‘*‘,$orderby = ‘‘,$limit * = ‘‘,$where=‘‘) */ public function fetAll($table, $field = ‘*‘, $orderby = false, $where = false) { $sql = "SELECT {$field} FROM `{$table}`"; $sql.= ($where) ? " WHERE $where" : ‘‘; $sql.= ($orderby) ? " ORDER BY $orderby" : ‘‘; return $this->_fetch($sql, $type = ‘1‘); } /** * 作用:获取單行数据 * 返回:表內第一条記录 * 类型:数组 * 參数:select * from table where id=‘1‘ */ public function getOne($sql) { return $this->_fetch($sql, $type = ‘0‘); } /** * 作用:获取所有数据 * 返回:表內記录 * 类型:二維数组 * 參数:select * from table */ public function getAll($sql) { return $this->_fetch($sql, $type = ‘1‘); } /** * 作用:获取首行首列数据 * 返回:首行首列欄位值 * 类型:值 * 參数:select `a` from table where id=‘1‘ */ public function scalar($sql, $fieldname) { $row = $this->_fetch($sql, $type = ‘0‘); return $row[$fieldname]; } /** * 获取記录总数 * 返回:記录数 * 类型:数字 * 參数:$db->fetRow(‘$table‘,$condition = ‘‘,$where =‘‘); */ public function fetRowCount($table, $field = ‘*‘, $where = false) { $sql = "SELECT COUNT({$field}) AS num FROM $table"; $sql.= ($where) ? " WHERE $where" : ‘‘; return $this->_fetch($sql, $type = ‘0‘); } /** * 获取記录总数 * 返回:記录数 * 类型:数字 * 參数:select count(*) from table */ public function getRowCount($sql) { return $this->_fetch($sql, $type = ‘2‘); } //链式操作开始 public function from($tableName) { $this->sql["from"] = "FROM " . $tableName; return $this; } public function db($tableName) { $this->sql["db"] = $tableName; return $this; } public function where($_where = ‘1=1‘) { $this->sql["where"] = "WHERE " . $_where; return $this; } public function order($_order = ‘id DESC‘) { $this->sql["order"] = "ORDER BY " . $_order; return $this; } public function limit($_limitstart="30",$_limitend = ‘0‘) { if ($_limitend=="0"){ $this->sql["limit"] = "LIMIT 0," . $_limitstart; }else{ $this->sql["limit"] = "LIMIT $_limitstart," . $_limitend; } return $this; } /** * 获取所有記录 * 返回:所有記录 * 类型:array * 參数: $pdomysql->from(‘dbname‘)->limit(30)->where(‘1=1‘)->select(); */ public function select($_select = ‘*‘) { //return "SELECT " . $_select . " " . (implode(" ", $this->sql)); $sql="SELECT " . $_select . " " . (implode(" ", $this->sql)); return $this->_fetch($sql, $type = ‘1‘); } /** * 获取一条記录 * 返回:一条記录 * 类型:array * 參数: $pdomysql->from(‘dbname‘)->limit(30)->where(‘1=1‘)->find(); */ public function find($_find = ‘*‘){ $this->sql[‘limit‘]=‘limit 1‘; $sql="SELECT " . $_find . " " . (implode(" ", $this->sql)); return $this->_fetch($sql, $type = ‘0‘); } /** * 插入一条数据 * 返回:执行结果 * 类型:bool * 參数: $pdomysql->db(‘dbname‘)->insert(array(‘col1‘="sadsd")); */ public function insert($_insert=array()){ $table=$this->sql[‘db‘]; $sql = "INSERT INTO `$table` SET "; $code = $this->getCode($table, $args); $sql.= $code; return $this->execute($sql); } /** * 删除 * 返回:删除结果 * 类型:bool * 參数: $pdomysql->from(‘dbname‘)->where(‘1=1‘)->delete(); */ public function delete(){ $sql="DELETE " . (implode(" ", $this->sql)); return $this->execute($sql); } public function update(){ } //链式操作end /** * *******************Sql操作方法結束******************** */ /** * *******************错误处理开始******************** */ /** * 設置是否为调试模式 */ public function setDebugMode($mode = true) { return ($mode == true) ? $this->debug = true : $this->debug = false; } /** * 捕获PDO错误信息 * 返回:出错信息 * 类型:字串 */ private function getPDOError($sql) { $this->debug ? $this->errorfile($sql) : ‘‘; if ($this->DB->errorCode() != ‘00000‘) { $info = ($this->stmt) ? $this->stmt->errorInfo() : $this->DB->errorInfo(); echo ($this->sqlError(‘mySQL Query Error‘, $info[2], $sql)); exit(); } } private function getSTMTError($sql) { $this->debug ? $this->errorfile($sql) : ‘‘; if ($this->stmt->errorCode() != ‘00000‘) { $info = ($this->stmt) ? $this->stmt->errorInfo() : $this->DB->errorInfo(); echo ($this->sqlError(‘mySQL Query Error‘, $info[2], $sql)); exit(); } } /** * 寫入错误日志 */ private function errorfile($sql) { echo $sql . ‘<br />‘; $errorfile = __DIR__ . ‘/dberrorlog.php‘; $sql = str_replace(array( " ", " ", " ", " ", " ", " " ) , array( " ", " ", " ", " ", " ", " " ) , $sql); if (!file_exists($errorfile)) { $fp = file_put_contents($errorfile, "<?PHP exit(‘Access Denied‘); ?> " . $sql); } else { $fp = file_put_contents($errorfile, " " . $sql, FILE_APPEND); } } /** * 作用:运行错误信息 * 返回:运行错误信息和SQL語句 * 类型:字符 */ private function sqlError($message = ‘‘, $info = ‘‘, $sql = ‘‘) { $html = ‘‘; if ($message) { $html.= $message; } if ($info) { $html.= ‘SQLID: ‘ . $info; } if ($sql) { $html.= ‘ErrorSQL: ‘ . $sql; } throw new Exception($html); } /** * *******************错误处理結束******************** */ }
以上是关于PHP PDO_MYSQL 链式操作 非链式操作类的主要内容,如果未能解决你的问题,请参考以下文章
PHP链式操作通过call和callstatic魔术方法的实现,以及phpstorm通过注释去追踪function