class Model{
public $table; //操作的表;
private $opt; //查询的参数;
private $pri; //表的主键;
private $lastSql; //最后一条sql语句;
private $error; public function __construct($table = ''){
$this->table = $table; $db = @mysql_connect('127.0.0.1' , 'root' , 'admin'); //这里应该通过配置读取进来
if (!$db)
exit('抱歉!数据库链接失败!');
mysql_select_db('tpplh') or exit('对不起,没有这个数据库'); //数据库的选择 mysql_query("SET NAMES utf8"); //设定数据库字符集;
$this->getPrimary($table); //获取主键;
$this->opt(); //初始化查询参数;
} public function getLastSql(){
return $this->lastSql;
} public function getError(){
return $this->error();
} #获取表的主键
private function getPrimary($table){
$this->lastSql = ' DESC ' . $table;
$result = $this->query($this->lastSql);
foreach ($result as $v) {
if ($v['Key'] == 'PRI') {
$this->pri = $v['Field'];
return;
}
}
} #初始化查询参数
private function opt(){
$this->opt = array('table' => $this->table , 'pri' => $this->pri , 'where' => '' , 'orderby' => '' , 'having' => '' , 'orderway' => '' , 'group' => '' , 'limit' => '' , 'fields' => '*');
} #临时表切换,不用另外在实例化类了;
public function table($table){
$this->opt['table'] = $table;
return $this; //返回切换后的对象;
} public function save($data = null){
return $this->update($data);
} #update更改
public function update($data = null){
if (is_null($data))
$data = $_POST;
if (!is_array($data))
return false;
if (isset($data[$this->pri])) { //如果里面有主键;就让where条件临时变为主键
$this->opt['where'] = ' WHERE ' . $this->pri . '=' . $data[$this->pri];
}
if (!$this->opt['where']) {
echo '增删改操作,必须要带where条件!';
exit;
}
$set = ''; //set字符串容器;
foreach ($data as $n => $v) {
$set .= $n . "='" . $v . "',";
}
$set = rtrim($set , ','); //去掉后面多余的逗号;
$this->lastSql = "UPDATE " . $this->opt['table'] . ' SET ' . $set . $this->opt['where'];
return $this->exe($this->lastSql);
} #delete删除:delete from 表名 where 条件;
public function delete(){
$where = $this->opt['where'];
if (!$where) {
echo 'delete必须设置条件';
exit;
}
$this->lastSql = "DELETE FROM {$this->opt['table']} $where";
return $this->exe($this->lastSql);
} #insert条件
public function insert($data = null){
if (is_null($data))
$data = $_POST;
if (!is_array($data))
return false;
$field = $value = "";
$field = implode("," , array_keys($data));
foreach ($data as $name => $v) {
$value .= "'" . addslashes($v) . "',";
}
$value = substr($value , 0 , -1);
$this->lastSql = "INSERT INTO " . $this->opt['table'] . "($field) VALUES($value)";
return $this->exe($this->lastSql);
} public function add($data = null){
return $this->insert($data);
} #limit 语句:
public function limit($arg){
$this->opt['limit'] = " LIMIT $arg";
return $this;
} #order 语句:
public function order($arg){
$this->opt['orderby'] = " ORDER BY $arg";
return $this;
} #orderway 语句:
public function orderway($arg){
$this->opt['orderway'] = " $arg";
return $this;
} #group 语句:
public function group($arg){
$this->opt['group'] = " GROUP BY $arg";
return $this;
} #where 条件
public function where($arg){
$this->opt['where'] = " WHERE $arg";
return $this;
} #having 语句
public function having($arg){
$this->opt['where'] = " HAVING $arg";
return $this;
} #fields 语句
public function field($arg){
$this->opt['fields'] = " $arg";
return $this;
} #count 语句 统计数量
public function count(){
$this->lastSql = "select count(*) as t from " . $this->opt['table'] . $this->opt['where'];
$count = $this->query($this->lastSql);
return $count[0]['t'];
} #select 语句
public function select(){
$this->lastSql = "SELECT {$this->opt['fields']} FROM {$this->opt['table']}{$this->opt['where']}{$this->opt['orderby']}{$this->opt['orderway']}{$this->opt['group']}{$this->opt['having']}{$this->opt['limit']}";
//echo $this -> lastSql;die;
$this->opt(); //查询完执行opt方法重新初始化参数;
return $this->query($this->lastSql);
} #find 通过主键来查询
public function find($arg = null){
if ($this->pri and $arg) {
$this->opt['where'] = " WHERE {$this->pri}=$arg";
} else {
$this->opt['limit'] = " LIMIT 1";
}
return $this->select();
} #发送增,删,改sql,成功返回最后一条的id或受影响条数;
public function exe($sql){
$this->lastSql = $sql;
if (mysql_query($sql)) {
$result = mysql_insert_id() ? mysql_insert_id() : mysql_affected_rows(); //如果该表有一个自增的id,就返回自增的id,如果没有就返回受影响的条数;
return $result;
}
} #发送查询的sql语句,返回查询结果数组;
public function query($sql){
$this->lastSql = $sql;
$result = mysql_query($sql);
if (!$result)
return $this->error();
$rows = array(); //用于存储查询的数据;
while ($row = mysql_fetch_assoc($result)) {
$rows[] = $row;
}
return $rows;
} private function error(){
return $this->error = mysql_error(); //输出mysql产生的错误信息;
}
}
?>

总结如下:

  1. 链式部分就是对类中属性的进行更改,属性可以是数组
  2. 在链式部分最后返回的都是$this
  3. 在最后输出方法中获取链式更改掉的属性进行操作

通过一个简单的数据库操作类了解PHP链式操作的实现的更多相关文章

  1. PHP链式操作输出excel(csv)

    工作中经常会遇到产品运营让导出一些简单的比较规范的数据,这时候要是有一个简单的方法可以用就简单多了.下面是我的一个输出简单的excel(csv)的方法类,用到了链式操作.说到链式操作,在jquery中 ...

  2. PHP 链式操作

    所谓链式操作最简单的理解就是 操作完毕之后再返回对象$this 想必大家工作中基本都快用烂了得东西. 下面就是一个链式操作MYSQL数据库类. 最常见的链式操作 每一个方法操作之后,返回一个对象,直到 ...

  3. C++中的链式操作

    代码编译环境:Windows7 32bits+VS2012. 1.什么是链式操作 链式操作是利用运算符进行的连续运算(操作).它的特点是在一条语句中出现两个或者两个以上相同的操作符,如连续的赋值操作. ...

  4. 自定义php-mysqli工具增强类,支持链式调用

    <?php /*数据库访问类,支持链式访问 *function table($table):表名 *function where($where):条件 *function field(...$f ...

  5. thinkphp5.1中使用链式操作的坑

    1.在进行tp5->tp5.1的时候,没有想太多,直接使用之前的代码:结果在该操作中,多次调用该get方法,tp5.1的链式操作一直保持了之前的搜索条件,截图如下:(具体的代码没有展示) 2.然 ...

  6. 用php实现一个简单的链式操作

    最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...

  7. js实现一个简单的链式操作

    如何实现一个链式操作 function person() {} person.prototype = { setname: function(name) { this.name = name retu ...

  8. ThinkPHP 数据库操作(三) : 查询方法、查询语法、链式操作

    查询方法 条件查询方法 where 方法 可以使用 where 方法进行 AND 条件查询: Db::table('think_user') ->where('name','like','%th ...

  9. PHP设计模式:类自动载入、PSR-0规范、链式操作、11种面向对象设计模式实现和使用、OOP的基本原则和自动加载配置

    一.类自动载入 SPL函数 (standard php librarys) 类自动载入,尽管 __autoload() 函数也能自动加载类和接口,但更建议使用 spl_autoload_registe ...

随机推荐

  1. 如何查看 Apache 的版本

    查看 Apache 服务器版本的命令行为: httpd -v 或者 apachectl -v 例如:用 Xshell 连接到服务器后,输入:httpd -v 或者:apachectl -v 返回: S ...

  2. 《PHP和MySQL Web开发》精彩的地方收录

    1.用SESSION来做的购物车,做成数组,用isbn对应书的数量作为二维数组保存 $new GET传值加入购物车,submit是修改数量,提交后的表单,通过历遍原来的数组,对应isbn修改最新的数量 ...

  3. 最新区分兼容IE6/IE7/IE8/IE9/FF的CSS HACK写法和Css if hack条件语法操作说明

    自从安装了IE8.0正式版本!木头 就对基本的几个 CSS HACK的做一下归纳!希望对网页前端布局DIV+CSS的实施者有所帮助! 本文就主要以:IE6+IE7+IE8+IE9+FF为主要研究对象 ...

  4. WPF-控件-ControlTemplate生成的控件

    <Window x:Class="由ControlTemplate生成的控件.MainWindow" xmlns="http://schemas.microsoft ...

  5. Input event驱动

    Input event驱动 Linux 专门对输入设备. 键盘,鼠标,手柄,触摸屏.按键.封装一个类驱动. 主要统一与应用程序接口.这一类的设备结点都是在/dev/input/eventn( 0< ...

  6. ios状态栏调整 简单动画的知识点

    首先状态栏式view的属性,所以在viewController中直接重写: /** 修改状态栏 */ - (UIStatusBarStyle)preferredStatusBarStyle { // ...

  7. Java 执行 SQL 脚本文件

    转自:http://blog.csdn.net/hongmin118/article/details/4588941 package com.unmi.db; import java.io.FileI ...

  8. java集合类(四)About Set

    接上篇:java集合类(三)About Iterator & Vector(Stack) 之前,在比较java常见集合类的时候,就了解到一点有关Set的特性.实现类及其要求等,读者可以去温习下 ...

  9. 查看系统网络连接打开端口、系统进程、DOS打开文件

    问题描述: DOS查看系统网络连接打开端口.打开的服务 问题解决: (1)DOS查看系统网络连接打开端口 注: 使用    netstat 命令,可以查看系统打开的端口 (2)查看和关闭系统打开进程 ...

  10. BT5之Metasploit[MSF]连接postgresql数据库

    1,先查看postgresql的端口,默认是自动开启的,端口7337 .   root@bt:~# netstat -tnpl |grep postgres tcp        0      0 1 ...