Db.class.PHP 數據庫連接文件
<?php
// 連接數據庫
class Db {
static public function getDB() {
try {
$pdo = new PDO(DB_DSN, DB_USER, DB_PWD);
$pdo->setAttribute(PDO::ATTR_PERSISTENT, true); // 設置數據庫連接爲持久連接
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 設置拋出錯誤
$pdo->setAttribute(PDO::ATTR_ORACLE_NULLS, true); // 設置當字符串爲空轉換爲 SQL 的 NULL
$pdo->query('SET NAMES utf8'); // 設置數據庫編碼
} catch (PDOException $e) {
exit('數據庫連接錯誤,錯誤信息:'. $e->getMessage());
}
return $pdo;
}
}
?>
Model.class.php 數據庫操作文件
<?php
/**
* 數據庫操作類庫
*/
class Model {
/**
* 數據庫添加操作
* @param string $tName 表名
* @param array $field 字段數組
* @param array $val 值數組
* @param bool $is_lastInsertId 是否返回添加ID
* @return int 默認返回成功與否,$is_lastInsertId 爲true,返回添加ID
*/
public function add($tName, $field, $val, $is_lastInsertId=FALSE) {
try {
if (!is_array($field) || !is_array($val)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$field = $this->formatArr($field);
$val = $this->formatArr($val, false);
if (!$is_lastInsertId) {
$row = $pdo->exec("INSERT INTO {$tName} ({$field}) VALUES ({$val})");
$pdo = null;
return $row;
} else {
$pdo->exec("INSERT INTO {$tName} ({$field}) VALUES ({$val})");
$lastId = $pdo->lastInsertId();
$pdo = null;
return $lastId;
}
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 數據庫修改操作
* @param string $tName 表名
* @param array $field 字段數組
* @param array $val 值數組
* @param string $condition 條件
* @return int 受影響的行數
* $result2 = $m->update('dr_1_special_buy',array('isread'=>0), 'isread=1');
* 這個值數組不好寫,這是一個例子
*/
public function update($tName, $fieldVal, $condition) {
try {
if (!is_array($fieldVal) || !is_string($tName) || !is_string($condition)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
foreach ($fieldVal as $k=>$v) {
$upStr .= $k . '=' . '\'' . $v . '\'' . ',';
}
$upStr = rtrim($upStr, ',');
$row = $pdo->exec("UPDATE {$tName} SET {$upStr} WHERE {$condition}");
$pdo = null;
return $row;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 數據庫刪除操作(注:必須添加 where 條件)
* @param string $tName 表名
* @param string $condition 條件
* @return int 受影響的行數
*/
public function del($tName, $condition) {
try {
if (!is_string($tName) || !is_string($condition)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$row = $pdo->exec("DELETE FROM {$tName} WHERE {$condition}");
return $row;
$pdo = null;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 返回表總個數
* @param string $tName 表名
* @param string $condition 條件
* @return int
*/
public function total($tName, $condition='') {
try {
if (!is_string($tName)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$re = $pdo->query("SELECT COUNT(*) AS total FROM {$tName}" . ($condition=='' ? '' : ' WHERE ' . $condition));
foreach ($re as $v) {
$total = $v['total'];
}
return $total;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 數據庫刪除多條數據
* @param string $tName 表名
* @param string $field 依賴字段
* @param array $ids 刪除數組
* @return int 受影響的行數
*/
public function delMulti($tName, $field, $ids) {
try {
if (!is_string($tName) || !is_array($ids)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
foreach ($ids as $v) {
$delStr .= $v . ',';
}
$delStr = rtrim($delStr, ',');
$row = $pdo->exec("DELETE FROM {$tName} WHERE {$field} IN ({$delStr})");
$pdo = null;
return $row;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 獲取表格的最後主鍵(注:針對 INT 類型)
* @param string $tName 表名
* @param string $primaryName 依賴字段
* @return int
*/
public function lastId($tName, $primaryName) {
try {
if (!is_string($tName) || !is_string($primaryName)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$re = $pdo->query("SELECT {$primaryName} FROM {$tName} ORDER BY {$primaryName} DESC LIMIT 1");
$lastId = null;
foreach ($re as $v) {
$lastId = $v[$primaryName];
}
$pdo = null;
return $lastId;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 返回全部數據,返回 PDOStatement 對象
* @param string $sql
* @return PDOStatement
*/
public function getAll($sql) {
try {
if (!is_string($sql)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$result = $pdo->query($sql);
$pdo = null;
return $result;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 檢查數據是否已經存在(依賴條件),可用於用戶註冊
* @param string $tName 表名
* @param string $field 依賴的字段
* @return bool
*/
public function isExists($tName, $condition) {
try {
if (!is_string($tName) || !is_string($condition)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$result = $pdo->query("SELECT COUNT(*) AS total FROM {$tName} WHERE {$condition}");
foreach ($result as $v) {
$b = $v['total'];
}
$pdo = null;
if ($b) {
return true;
} else {
return false;
}
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 檢查數據是否已經存在(依賴 int 主鍵)
* @param string $tName 表名
* @param string $primary 主鍵
* @param int $id 主鍵值
* @return bool
*/
public function isExistsByIntPrimary($tName, $primary, $id) {
try {
if (!is_string($tName) || !is_string($primary) || !is_int($id)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$result = $pdo->query("SELECT COUNT(*) AS total FROM {$tName} WHERE {$primary} = ". $id);
foreach ($result as $v) {
$b = $v['total'];
}
$pdo = null;
if ($b) {
return true;
} else {
return false;
}
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 預處理添加數據(推薦使用)
* @param string $tableName 表格名
* @param array $fieldArr 字段名數組
* @param array $valArr 字段值數組
* @param bool $mult 是否添加多條數據,如果是那麼 $valArr 爲二維數組
* @return int 返回添加的記錄數,添加單條爲1,多條爲多
*/
public function insert($tableName, $fieldArr, $valArr, $mult=FALSE) {
try {
if (!is_string($tableName) || !is_array($fieldArr) || !is_array($valArr) || !is_bool($mult)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$fields = $this->formatArr($fieldArr);
$arrCount = count($fieldArr);
$mark = $this->formatMark($arrCount);
$stmt = $pdo->prepare("INSERT INTO {$tableName} ({$fields}) VALUES ({$mark})");
if (!$mult) {
$row = $stmt->execute($valArr); // 添加單條數據
} else {
$row = 0;
for ($i=0; $i<count($valArr); $i++) {
if ($stmt->execute($valArr[$i])) {
$row++;
}
}
}
$pdo = null;
return $row;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 預處理刪除(注:針對主鍵爲 INT 類型,推薦使用)
* @param string $tName 表名
* @param string $primary 主鍵字段
* @param int or array or string $ids 如果是刪除一條爲 INT,多條爲 array,刪除一個範圍爲 string
* @return int 返回受影響的行數
*/
public function remove($tName, $primary, $ids, $mult=FALSE) {
try {
if (!is_string($tName) || !is_string($primary) || (!is_int($ids) && !is_array($ids) && !is_string($ids)) || !is_bool($mult)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$stmt = $pdo->prepare("DELETE FROM {$tName} WHERE {$primary}=?");
if (!$mult) {
$stmt->bindParam(1, $ids);
$row = $stmt->execute();
} else {
if (is_array($ids)) {
$row = 0;
foreach ($ids as $v) {
$stmt->bindParam(1, $v);
if ($stmt->execute()) {
$row++;
}
}
} elseif (is_string($ids)) {
if (!strpos($ids, '-')) exit($this->getError(__FUNCTION__, __LINE__));
$split = explode('-', $ids);
if (count($split)!=2 || $split[0]>$split[1]) exit($this->getError(__FUNCTION__, __LINE__));
$i = null;
$count = $split[1]-$split[0]+1;
for ($i=0; $i<$count; $i++) {
$idArr[$i] = $split[0]++;
}
foreach ($idArr as $id) {
$idStr .= $id . ',';
}
$idStr = rtrim($idStr, ',');
$row = $pdo->exec("DELETE FROM {$tName} WHERE {$primary} in ({$idStr})");
}
}
return $row;
$pdo = null;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 返回單條數據
* @param string $tName 表名
* @param string $condition 條件
* @param string or array $fields 返回的字段,默認是*
* @return PDOStatement
*/
public function getOne($tName, $condition, $fields="*") {
try {
if (!is_string($tName) || !is_string($condition) || !is_string($fields)) exit($this->getError(__FUNCTION__, __LINE__));
$pdo = Db::getDB();
$data = $pdo->query("SELECT {$fields} FROM {$tName} WHERE {$condition} LIMIT 1");
$pdo = null;
return $data;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 返回全部數據
* @param string $tName 表名
* @param string $fields 返回字段,默認爲*
* @param string $condition 條件
* @param string $order 排序
* @param string $limit 顯示個數
* @return PDOStatement
*/
public function fetchAll($tName, $fields='*', $condition='', $order='', $limit='') {
try {
if (!is_string($tName) || !is_string($fields) || !is_string($condition) || !is_string($order) || !is_string($limit)) exit($this->getError(__FUNCTION__, __LINE__));
$fields = ($fields=='*' || $fields=='') ? '*' : $fields;
$condition = $condition=='' ? '' : " WHERE ". $condition ;
$order = $order=='' ? '' : " ORDER BY ". $order;
$limit = $limit=='' ? '' : " LIMIT ". $limit;
$pdo = Db::getDB();
$re = $pdo->query("SELECT {$fields} FROM {$tName} {$condition} {$order} {$limit}");
return $re;
} catch (PDOException $e) {
exit($e->getMessage());
}
}
/**
* 格式化數組(表結構和值)
* @param array $field
* @param bool $isField
* @return string
*/
private function formatArr($field, $isField=TRUE) {
if (!is_array($field)) exit($this->getError(__FUNCTION__, __LINE__));
if ($isField) {
foreach ($field as $v) {
$fields .= $v.',';
}
} else {
foreach ($field as $v) {
$fields .= '\''.$v.'\''.',';
}
}
$fields = rtrim($fields, ',');
return $fields;
}
/**
* 格式化問號,批量替換掉
* @param int $count 數量
* @return string 返回格式化後的字符串
*/
private function formatMark($count) {
if (!is_int($count)) exit($this->getError(__FUNCTION__, __LINE__));
if ($count==1) return '?';
for ($i=0; $i<$count; $i++) {
$str .= '?,';
}
return rtrim($str, ',');
}
/**
* 錯誤提示
* @param string $fun
* @return string
*/
private function getError($fun, $line) {
return __CLASS__ . '->' . $fun . '() line<font color="red">'. $line .'</font> ERROR!';
}
}
?>
config.inc.php 數據庫配置文件
<?php
header('Content-Type:text/html;Charset=utf-8');
define('ROOT_PATH', dirname(__FILE__)); // 網站根目錄
define('UPDIR', '/upload/'); // 上傳文件路徑
define('DB_DSN', 'mysql:host=localhost;dbname=ajaxtest');
define('DB_USER', 'root');
define('DB_PWD', 'root');
// 自動加載文件類
function __autoload($className) {
require_once ROOT_PATH . '/includes/'. ucfirst($className) .'.class.php';
}
?>
article.php 文章調取處理文件
<?php
/**
* $Id: article.php
*/
require_once './config.inc.php';
$m = new Model();
$result = $m->fetchAll('article', '*', '', ''); // 調用model類中的fetchAll方法,查詢數據
echo '<table align="center" border="1" width="1100" style="border-collapse:collapse;font-size:14px;" bordercolor="#666">';
echo '<caption><h1>數據輸出</h1></caption>';
echo '<tr height="25"><th>ID</th><th>Title</th><th>Author</th><th>Source</th><th>Date</th></tr>';
foreach ($result as $v) {
echo "<tr height='21'><td align='center'>{$v['id']}</td><td>{$v['title']}</td><td align='center'>{$v['author']}</td><td align='center'>{$v['source']}</td><td align='center'>{$v['date']}</td></tr>";
}
echo '<tr><td align="right" colspan="5">'.$page->fpage().'</td></tr>';
echo '</table>';
?>
數據庫設計