您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“PHP數(shù)據(jù)庫(kù)表操作的封裝類及用法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“PHP數(shù)據(jù)庫(kù)表操作的封裝類及用法”吧!
數(shù)據(jù)庫(kù)表結(jié)構(gòu):
CREATE TABLE `test_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `nickname` varchar(45) NOT NULL, `r` tinyint(4) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `test_blog` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `title` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
設(shè)置字符編碼:
header('Content-Type: text/html; charset=utf-8');
引入Table類:
require 'Table.php';
設(shè)置數(shù)據(jù)庫(kù)參數(shù):
Table::$__host = '127.0.0.1:3306'; Table::$__user = 'root'; Table::$__pass = '123456'; Table::$__name = 'test'; Table::$__charset = 'utf8';
創(chuàng)建實(shí)體對(duì)象:
Table類有三個(gè)參數(shù): $table, $pk, $pdo=null
$table: 表名稱.
$pk: 主鍵名稱. 不支持聯(lián)合主鍵
$pdo: 獨(dú)立的PDO對(duì)象. 一般不需要傳
Notice: Table類是表操作的封裝,不是Model層的基類,所以不支持表前綴,表前綴應(yīng)該在Model層實(shí)現(xiàn)
$userTable = new Table('test_blog'); $blogTable = new Table('test_blog');
插入數(shù)據(jù):
$user = array( 'username' => "admin1", 'password' => "admin1", 'nickname' => "管理員1", 'r' => mt_rand(0, 5), ); echo $userTable->insert($user)->rowCount(), "\n"; echo $userTable->lastInsertId(), "\n";
批量插入數(shù)據(jù):
$fields = array('username','password','nickname','r'); for ($i=2; $i<=100; $i++) { $rows[] = array("admin$i", "admin$i", "管理員$i", mt_rand(0, 5)); } $userTable->batchInsert($fields, $rows);
查詢所有數(shù)據(jù):
select方法返回一個(gè)PDOStatement對(duì)象, fetchAll返回多行, fetch返回單行
var_dump($userTable->select()->fetchAll());
field自定義:
var_dump($userTable->select('id,nickname')->fetchAll());
where查詢:
var_dump($userTable->where('id > ?', 50)->select()->fetchAll());
where and條件:
var_dump($userTable->where('id > ?', 6)->where('id in (?)', array(5,7,9)) ->select()->fetchAll());
where or條件:
var_dump($userTable->where('id = ? OR id = ?', 6, 8)->select()->fetchAll());
group分組 having過(guò)濾:
var_dump($userTable->group('r')->having('c between ? and ?', 10, 20) ->select('*, r, count(*) as c')->fetchAll());
order排序:
var_dump($userTable->order('r desc, id')->select()->fetchAll());
limit 行數(shù):
跳過(guò)30行 返回10行
var_dump($userTable->limitOffset(10, 30)->select()->fetchAll());
查詢單行:
var_dump($userTable->where('id = ?', 6)->select()->fetch());
根據(jù)主鍵查詢數(shù)據(jù):
var_dump($userTable->find(4));
update更新數(shù)據(jù):
$user = array( 'username' => 'admin4-1', 'nickname' => '管理員4-1', ); echo $userTable->where('id = ?', 4)->update($user)->rowCount(), "\n";
replace替換數(shù)據(jù):
使用了MySQL的REPLACE語(yǔ)句
$user = array( 'id' => 4, 'username' => 'admin4', 'password' => 'admin4', 'nickname' => '管理員4', 'r' => mt_rand(0, 5), ); echo $userTable->replace($user)->rowCount(), "\n";
刪除數(shù)據(jù):
echo $userTable->where('id = ?', 4)->delete()->rowCount(), "\n";
分頁(yè)查詢
第2頁(yè), 每頁(yè)10行數(shù)據(jù):
var_dump($userTable->page(2, 10)->select()->fetchAll());
分頁(yè)查詢的總行數(shù):
$userTable->where('r=?', 3)->order('id desc')->page(2, 10) ->select()->fetchAll(); echo $userTable->count(), "\n";
復(fù)雜查詢:
var_dump($userTable->where('id > ?', 1)->where('id < ?', 100) ->group('r')->having('c between ? and ?', 1, 100)->having('c > ?', 1) ->order('c desc')->page(2, 3)->select('*, count(*) as c')->fetchAll());
自增:
$id = 2; // 加一 var_dump($userTable->where('id = ?', $id)->plus('r')->find($id)); // 減一 var_dump($userTable->where('id = ?', $id)->plus('r', -1)->find($id)); // 多列 var_dump($userTable->where('id = ?', $id)->plus('r', 1, 'r', -1)->find($id));
自增,并獲得自增后的值:
$id = 2; // 加一 echo $userTable->where('id = ?', $id)->incr('r'), "\n"; // 減一 echo $userTable->where('id = ?', $id)->incr('r', -1), "\n";
save 保存修改:
判斷數(shù)據(jù)中是否存在主鍵字段,如果存在主鍵字段就update數(shù)據(jù),反之insert數(shù)據(jù)
// 修改 $user = array( 'id' => 3, 'nickname' => '管理員3-3', ); echo $userTable->save($user)->rowCount(), "\n"; var_dump($userTable->find(3)); // 添加 $user = array( 'username' => 'admin11', 'password' => 'admin11', 'nickname' => '管理員11', 'r' => mt_rand(0, 5), ); echo $userTable->save($user)->rowCount(), "\n"; $id = $userTable->lastInsertId(); var_dump($userTable->find($id));
生成外表測(cè)試數(shù)據(jù):
$users = $userTable->select('id')->fetchAll(); $id = 0; foreach ($users as $user) { for ($i=0; $i<10; $i++) { $id++; $blog = array( 'user_id' => $user['id'], 'title' => "blog$id", ); $blogTable->insert($blog); } }
Table類不支持JOIN查詢
需要的朋友可以手寫sql語(yǔ)句,使用query方法來(lái)執(zhí)行.或者自己修改Table類來(lái)支持JOIN
獲取外表數(shù)據(jù):
$blogs = $blogTable->where('id in (?)', array(1,12,23,34,56,67,78,89,90,101)) ->select()->fetchAll(); // 獲取外表數(shù)據(jù) key為外表id value為外表行數(shù)據(jù) var_dump($userTable->foreignKey($blogs, 'user_id') ->fetchAll(PDO::FETCH_UNIQUE)); var_dump($userTable->foreignKey($blogs, 'user_id', '*,id') ->fetchAll(PDO::FETCH_UNIQUE)); var_dump($userTable->foreignKey($blogs, 'user_id', 'id,username,nickanem,id') ->fetchAll(PDO::FETCH_UNIQUE)); // 獲取外表數(shù)據(jù) 返回鍵值對(duì)數(shù)組 key為id value為username var_dump($userTable->foreignKey($blogs, 'user_id', 'id,username') ->fetchAll(PDO::FETCH_KEY_PAIR));
PDOStatement::fetchAll 示例:
// 獲取映射數(shù)據(jù) var_dump($userTable->select('*, id')->fetchAll(PDO::FETCH_UNIQUE)); // 獲取數(shù)組 var_dump($userTable->select('nickname')->fetchAll(PDO::FETCH_COLUMN)); // 獲取鍵值對(duì) var_dump($userTable->select('id, nickname')->fetchAll(PDO::FETCH_KEY_PAIR)); // 獲取數(shù)據(jù)分組 var_dump($userTable->select('r, id, nickname')->fetchAll(PDO::FETCH_GROUP)); // 獲取數(shù)據(jù)分組 var_dump($userTable->select('r, id')->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN)); // 獲取數(shù)據(jù)分組 var_dump($userTable->select('r, nickname')->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_KEY_PAIR)); // 獲取對(duì)象 指定獲取方式,將結(jié)果集中的每一行作為一個(gè)屬性名對(duì)應(yīng)列名的對(duì)象返回。 var_dump($userTable->select()->fetchAll(PDO::FETCH_OBJ)); // 獲取對(duì)象 指定獲取方式,返回一個(gè)所請(qǐng)求類的新實(shí)例,映射列到類中對(duì)應(yīng)的屬性名。 // Note: 如果所請(qǐng)求的類中不存在該屬性,則調(diào)用 __set() 魔術(shù)方法 var_dump($userTable->select()->fetchAll(PDO::FETCH_CLASS)); // 獲取對(duì)象 指定獲取方式,更新一個(gè)請(qǐng)求類的現(xiàn)有實(shí)例,映射列到類中對(duì)應(yīng)的屬性名。 var_dump($userTable->select()->fetchAll(PDO::FETCH_INTO)); // 獲取自定義行 var_dump($userTable->select()->fetchAll(PDO::FETCH_FUNC, function($id, $username, $password, $r){ return array('id'=>$id, 'name'=>"$username - $password - $r"); })); // 獲取單一值 var_dump($userTable->select()->fetchAll(PDO::FETCH_FUNC, function($id, $username, $password, $r){ return "$id - $username - $password - $r"; }));
Table類源代碼:
<?php /** * @author dotcoo zhao <dotcoo at 163 dot com> */ /** * 模型 */ class Table { /** * @var PDO */ public static $__pdo = null; // 默認(rèn)PDO對(duì)象 public static $__host = '127.0.0.1'; // 默認(rèn)主機(jī) public static $__user = 'root'; // 默認(rèn)賬戶 public static $__pass = '123456'; // 默認(rèn)密碼 public static $__name = 'test'; // 默認(rèn)數(shù)據(jù)庫(kù)名稱 public static $__charset = 'utf8'; // 默認(rèn)字符集 /** * @var PDO */ public $_pdo = null; // PDO對(duì)象 public $_table = null; // 表名 public $_pk = 'id'; // paramry public $_where = array(); // where public $_where_params = array(); // where params public $_count_where = array(); // count where public $_count_where_params = array(); // count where params public $_group = ''; // group public $_having = array(); // having public $_having_params = array(); // having params public $_order = null; // order public $_limit = null; // limit public $_offset = null; // offset public $_for_update = ''; // read lock public $_lock_in_share_model = ''; // write lock /** * Table Construct * @param string $table_name * @param string $pk * @param string $prefix * @param PDO $pdo */ function __construct($table=null, $pk=null, PDO $pdo=null) { $this->_table = isset($table) ? $table : $this->_table; $this->_pk = isset($pk) ? $pk : $this->_pk; $this->_pdo = $pdo; } /** * @return PDO */ public function getPDO() { if (isset($this->_pdo)) { return $this->_pdo; } if (isset(self::$__pdo)) { return self::$__pdo; } $dsn = sprintf("mysql:host=%s;dbname=%s;charset=%s;", self::$__host, self::$__name, self::$__charset); $options = array( PDO::ATTR_PERSISTENT => true, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ); return self::$__pdo = new PDO($dsn, self::$__user, self::$__pass, $options); } /** * 執(zhí)行語(yǔ)句 * @param string $sql * @return PDOStatement */ public function query($sql) { $params = func_get_args(); array_shift($params); return $this->queryParams($sql, $params); } /** * 執(zhí)行語(yǔ)句 * @param string $sql * @return PDOStatement */ public function queryParams($sql, array $params) { $sqls = explode('?', $sql); $sql_new = array_shift($sqls); $params_new = array(); foreach ($sqls as $i => $sql_item) { if (is_array($params[$i])) { $sql_new .= str_repeat('?,', count($params[$i])-1).'?'.$sql_item; $params_new = array_merge($params_new, $params[$i]); } else { $sql_new .= '?'.$sql_item; $params_new[] = $params[$i]; } } $stmt = $this->getPDO()->prepare($sql_new); foreach ($params_new as $i => $param) { switch (gettype($param)) { case 'integer': $stmt->bindValue($i+1, $param, PDO::PARAM_INT); break; case 'NULL': $stmt->bindValue($i+1, $param, PDO::PARAM_NULL); break; default : $stmt->bindValue($i+1, $param); } } // echo $sql_new, "\n"; var_dump($params_new); // exit(); $stmt->executeResult = $stmt->execute(); $this->reset(); return $stmt; } /** * 查詢數(shù)據(jù) * @param string $field * @return PDOStatement */ public function select($columns='*') { $params = array_merge($this->_where_params, $this->_having_params); $sql = "SELECT $columns FROM `{$this->_table}`"; $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where); $sql .= empty($this->_group) ? '' : ' GROUP BY '. $this->_group; $sql .= empty($this->_having) ? '' : ' HAVING '. implode(' AND ', $this->_having); $sql .= empty($this->_order) ? '' : ' ORDER BY '. $this->_order; if (isset($this->_limit)) { $sql .= ' LIMIT ?'; $params[] = $this->_limit; if (isset($this->_offset)) { $sql .= ' OFFSET ?'; $params[] = $this->_offset; } } $sql .= $this->_for_update; $sql .= $this->_lock_in_share_model; $this->_count_where = $this->_where; $this->_count_where_params = $this->_where_params; return $this->queryParams($sql, $params); } /** * 添加數(shù)據(jù) * @param array $data * @return PDOStatement */ public function insert(array $data) { $sql = "INSERT `{$this->_table}` SET"; $params = array(); foreach ($data as $col=>$val) { $sql .= " `$col` = ?,"; $params[] = $val; } $sql{strlen($sql)-1} = ' '; return $this->queryParams($sql, $params); } /** * 批量插入數(shù)據(jù) * @param array $names * @param array $rows * @param number $batch * @return Table */ public function batchInsert(array $fields, array $rows, $batch=1000) { $i = 0; $sql = "INSERT `{$this->_table}` (`".implode('`, `', $fields)."`) VALUES "; foreach ($rows as $row) { $i++; $sql .= "('".implode("','", array_map('addslashes', $row))."'),"; if ($i >= $batch) { $sql{strlen($sql)-1} = ' '; $this->query($sql); $i = 0; $sql = "INSERT `{$this->_table}` (`".implode('`, `', $fields)."`) VALUES "; } } if ($i > 0) { $sql{strlen($sql)-1} = ' '; $this->query($sql); } return $this; } /** * 更新數(shù)據(jù) * @param array $data * @return PDOStatement */ public function update(array $data) { $sql = "UPDATE `{$this->_table}` SET"; $params = array(); foreach ($data as $col=>$val) { $sql .= " `$col` = ?,"; $params[] = $val; } $sql{strlen($sql)-1} = ' '; $sql .= empty($this->_where) ? '' : 'WHERE '. implode(' AND ', $this->_where); $params = array_merge($params, $this->_where_params); return $this->queryParams($sql, $params); } /** * 替換數(shù)據(jù) * @param array $data * @return PDOStatement */ public function replace(array $data) { $sql = "REPLACE `{$this->_table}` SET"; $params = array(); foreach ($data as $col=>$val) { $sql .= " `$col` = ?,"; $params[] = $val; } $sql{strlen($sql)-1} = ' '; $sql .= empty($this->_where) ? '' : 'WHERE '. implode(' AND ', $this->_where); $params = array_merge($params, $this->_where_params); return $this->queryParams($sql, $params); } /** * 刪除數(shù)據(jù) * @return PDOStatement */ public function delete() { $sql = "DELETE FROM `{$this->_table}`"; $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where); return $this->queryParams($sql, $this->_where_params); } /** * 重置所有 * @return Table */ public function reset() { $this->_where = array(); $this->_where_params = array(); $this->_group = null; $this->_having = array(); $this->_having_params = array(); $this->_order = null; $this->_limit = null; $this->_offset = null; $this->_for_update = ''; $this->_lock_in_share_model = ''; return $this; } /** * where查詢條件 * @param string $format * @return Table */ public function where($format) { $args = func_get_args(); array_shift($args); $this->_where[] = $format; $this->_where_params = array_merge($this->_where_params, $args); return $this; } /** * group分組 * @param string $columns * @return Table */ public function group($columns) { $this->_group = $columns; return $this; } /** * having過(guò)濾條件 * @param string $format * @return Table */ public function having($format) { $args = func_get_args(); array_shift($args); $this->_having[] = $format; $this->_having_params = array_merge($this->_having_params, $args); return $this; } /** * order排序 * @param string $columns * @return Table */ public function order($order) { $this->_order = $order; return $this; } /** * limit數(shù)據(jù)偏移 * @param number $offset * @param number $limit * @return Table */ public function limitOffset($limit, $offset=null) { $this->_limit = $limit; $this->_offset = $offset; return $this; } /** * 獨(dú)占鎖,不可讀不可寫 * @return Table */ public function forUpdate() { $this->forUpdate = ' FOR UPDATE'; return $this; } /** * 共享鎖,可讀不可寫 * @return Table */ public function lockInShareMode() { $this->_lock_in_share_model = ' LOCK IN SHARE MODE'; return $this; } /** * 事務(wù)開始 * @return bool */ public function begin() { return $this->getPDO()->beginTransaction(); } /** * 事務(wù)提交 * @return bool */ public function commit() { return $this->getPDO()->commit(); } /** * 事務(wù)回滾 * @return bool */ public function rollBack() { return $this->getPDO()->rollBack(); } /** * page分頁(yè) * @param number $page * @param number $pagesize * @return Table */ public function page($page, $pagesize = 15) { $this->_limit = $pagesize; $this->_offset = ($page - 1) * $pagesize; return $this; } /** * 獲取自增ID * @return int */ public function lastInsertId() { return $this->getPDO()->lastInsertId(); } /** * 獲取符合條件的行數(shù) * @return int */ public function count() { $sql = "SELECT count(*) FROM `{$this->_table}`"; $sql .= empty($this->_count_where) ? '' : ' WHERE '. implode(' AND ', $this->_count_where); return $this->queryParams($sql, $this->_count_where_params)->fetchColumn(); } /** * 將選中行的指定字段加一 * @param string $col * @param number $val * @return Table */ public function plus($col, $val = 1) { $sets = array("`$col` = `$col` + $val"); $args = array_slice(func_get_args(), 2); while (count($args) > 1) { $col = array_shift($args); $val = array_shift($args); $sets[] = "`$col` = `$col` + $val"; } $sql = "UPDATE `{$this->_table}` SET ".implode(', ', $sets); $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where); $params = array_merge(array($val), $this->_where_params); $this->queryParams($sql, $params); return $this; } /** * 將選中行的指定字段加一 * @param string $col * @param number $val * @return int */ public function incr($col, $val = 1) { $sql = "UPDATE `{$this->_table}` SET `$col` = last_insert_id(`$col` + ?)"; $sql .= empty($this->_where) ? '' : ' WHERE '. implode(' AND ', $this->_where); $params = array_merge(array($val), $this->_where_params); $this->queryParams($sql, $params); return $this->getPDO()->lastInsertId(); } /** * 根據(jù)主鍵查找行 * @param number $id * @return array */ public function find($id) { return $this->where("`{$this->_pk}` = ?", $id)->select()->fetch(); } /** * 保存數(shù)據(jù),自動(dòng)判斷是新增還是更新 * @param array $data * @return PDOStatement */ public function save(array $data) { if (array_key_exists($this->_pk, $data)) { $pk_val = $data[$this->_pk]; unset($data[$this->_pk]); return $this->where("`{$this->_pk}` = ?", $pk_val)->update($data); } else { return $this->insert($data); } } /** * 獲取外鍵數(shù)據(jù) * @param array $rows * @param string $fkey * @param string $field * @param string $key * @return PDOStatement */ public function foreignKey(array $rows, $fkey, $field='*') { $ids = array(); foreach($rows as $row) { $ids[] = $row[$fkey]; } // $ids = array_column($rows, $fkey); if (empty($ids)) { return new PDOStatement(); } return $this->where("`{$this->_pk}` in (?)", $ids)->select($field); } }
到此,相信大家對(duì)“PHP數(shù)據(jù)庫(kù)表操作的封裝類及用法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。