仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1207|回复: 19
打印 上一主题 下一主题

[学习教程] PHP编程:用PHP入手下手你的MVC (二)笼统数据库接口

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-4 00:13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
PHP原始为Personal Home Page的缩写,已经正式更名为 "PHP: Hypertext Preprocessor"。注意不是“Hypertext Preprocessor”的缩写,这种将名称放到定义中的写法被称作递归缩写。数据|数据库   2、笼统数据库接口(使用数据操作办理类)
在用mvc形式开辟的时分,model层担任数据库的一切操作,为了对数据库的操作停止一致的办理,咱们需求界说一个数据库操作办理类,由他来代替一切的数据库操作,也就是全部体系中只要这个数据库操作办理类,可以直接对数据库停止操作,假如其他的类需求对数据库停止操作,那它就必需挪用和经由过程这个类来完成。
上面的Db类就是一个如许的类。
<?php
/**************************************************************
*        descript : mysql数据库操作办理类
*
*          author : 大龄青年
*           Email :wenadmin@sina.com
*                 qq : 303015292
*             msn : wenguangqing@hotmail.com
*************************************************************/
/*
* example 1:  获得序列
*    <?
*    $db = new Db();
*    $result = $db->getSeq('art_id', 2, 1);
*    ?>
*/
/*
* example 2:  分页查询
*    <?
*    $db = new Db();
*    $result = $db->&queryPage('select id,name from table', 2, 10, DB_FETCH_ASSOC);
*    foreach($result as $row)
*     echo $row['id'],'------'.$row['name'].'<br>';
*    ?>
*/
/*
* example 3:  拔出数据
*    <?
*    $db = new Db();
*    $result = $db->execute("insert into table (id, name) values(1,'name')");
*    if($result>0)     echo '拔出数据胜利';
*    else                   echo '拔出数据掉败';
*    ?>
*/
/*
* 界说数据库联接选项
* @var  DB_HOST       string   数据库主机称号或地址
* @var  DB_NAME       string   数据库称号
* @var  DB_USER       string   数据库用户称号
* @var  DB_PWD        string   数据库用户的暗码
* @var  DB_PCONNECT   boolean  是不是创立耐久毗连
*/
define('DB_HOST', 'localhost');
define('DB_NAME', 'test');
define('DB_USER', 'root');
define('DB_PWD', '');
define('DB_PCONNECT', true);
/*
*界说前往数据查询了局的类型
* @var  DB_FETCH_ASSOC   int  了局挪用体例:$result['name']
* @var  DB_FETCH_NUM     int  了局挪用体例:$result[0]
* @var  DB_FETCH_BOTH    int  了局挪用体例:$result['name'] 或 $result[0]
* @var  DB_FETCH_OBJECT  int  了局挪用体例:$result->name
*/
define('DB_FETCH_ASSOC', 0);
define('DB_FETCH_NUM', 1);
define('DB_FETCH_BOTH', 2);
define('DB_FETCH_OBJECT', 3);
/*
*界说默许序列产生器的称号
*/
define('DB_SEQUENCE_TABLENAME', 'sequences');

class Db{
    /*
     * 以后数据库联接选项
     */
    var $dbHost = DB_HOST;
    var $dbName = DB_NAME;
    var $dbType = 'Mysql';
    var $dbUser = DB_USER;
    var $dbPwd = DB_PWD;
    var $pcnn = DB_PCONNECT;
    /*
     * 以后数据库毗连
     */
    var $cnn = '';
    /*
     * 数据查询了局的前往类型
     */
    var $queryFetchType = DB_FETCH_ASSOC;
    /*
     * 初始化函数
     */
function Db(){
        $this->cnn = ($this->pcnn? mysql_connect($this->dbHost, $this->dbUser, $this->dbPwd):
                                                         mysql_connect($this->dbHost, $this->dbUser, $this->dbPwd))  or
                                                        $this->_halt('数据库毗连毛病');
        mysql_select_db($this->dbName, $this->cnn) or $this->_halt('数据库选择毛病');
    }
    /*
     *  数据查询函数
     *
     * @param $sql        string  数据查询语句
     * @param $fetchType  int     数据查询了局的前往类型
     *
     * @return            array   数据查询了局
     */
    function &query($sql, $fetchType=DB_FETCH_ASSOC){
        $data = array();
        $rs = &mysql_query($sql, $this->cnn) or $this->_halt('数据查询毛病', $sql);
        $exe = $this->_getCommand($fetchType);
        while($row=&$exe($rs))
        $data[] = &$row;
        return $data;
    }
    /*
     *  分页数据查询函数
     *
     * @param $sql        string  数据查询语句
     * @param $page       int     以后预查询页码
     * @param $pageSize   int     每页显示几何条记载
     * @param $fetchType  int     数据查询了局的前往类型
     *
     *         数据查询了局,和数据的分页信息
     * @return    array('pageSize'    => 每页显示的条数
     *                  'recordCount' => 总记载数
     *                  'pageCount'   => 总页数
     *                  'page'        => 以后页码
     *                  'isFirst'     => 是不是第一页
     *                  'isLast'      => 是不是最初一页
     *                  'start'       => 前往了局的第一条记载的序号
     *                  'sql'         => 查询的sql语句
     *                  'data'        => 查询失掉的数据了局
     *                 )
     *                 数据查询了局,和数据的分页信息
     */
    function &queryPage($sql, $page=1, $pageSize=20, $fetchType=DB_FETCH_ASSOC){
        $countSql = preg_replace('|SELECT.*FROM|i','SELECT COUNT(*) count FROM', $sql);
        $data['pageSize'] = (int)$pageSize<1? 20: (int)$pageSize;
        $data['recordCount'] = $this->getOne($countSql, 'count');
        $data['pageCount'] = ceil($data['recordCount']/$data['pageSize']);
        $data['page'] = $data['pageCount']==0? 0: ((int)$page<1? 1: (int)$page);
        $data['page'] = $data['page']>$data['pageCount']? $data['pageCount']:$data['page'];
        $data['isFirst'] = $data['page']>1? false: true;
        $data['isLast'] = $data['page']<$data['pageCount']? false: true;
        $data['start'] = ($data['page']==0)? 1: ($data['page']-1)*$data['pageSize']+1;
        $data['sql'] = $sql.' LIMIT '.($data['start']-1).','.$data['pageSize'];
        $data['data'] = &$this->query($data['sql'], $fetchType);
        return $data;
    }
    /*
     *  停止数据查询只前往第 1 行的数据
     *
     * @param $sql        string  数据查询语句
     * @param $fetchType  int     数据查询了局的前往类型
     *
     * @return            array   数据查询了局
     */
    function &queryRow($sql, $fetchType=DB_FETCH_ASSOC){
        $rs = &mysql_query($sql, $this->cnn) or $this->_halt('单行数据查询毛病', $sql);
        $exe = $this->_getCommand($fetchType);
        return $exe($rs);
    }
    /*
     *  停止数据查询只前往第 1 行第 n 列的数据
     *
     * @param $sql        string  数据查询语句
     * @param $field      int     前往数据列的称号 或 数字序号
     *
     * @return            string  前往单个字段的值
     */
    function &getOne($sql, $field = 0){
        $rs = &mysql_query($sql, $this->cnn) or $this->_halt('单个数据查询毛病', $sql);
        $row = mysql_fetch_array($rs);
        return $row[$field];
    }
    /*
     *  停止sql语句,包括 DELECT / INSERT / UPDATE.....的履行语句
     *
     * @param $sql        string  数据查询语句
     *
     * @return            string  前往该语句影响的数据行数
     */
    function execute($sql){
        $rs = mysql_query($sql) or $this->_halt('语句履行毛病', $sql);
        return mysql_affected_rows($this->cnn);
    }
    /*
     *  失掉最初一次拔出数据的编号
     */
    function getInsertId(){
        return mysql_insert_id($this->cnn);
    }
    /*
     *  序列产生器,用来生成不反复的序列值
     *
     * @param $fieldName    string  序列的称号
     * @param $step         int     序列号距离
     * @param $start        int     序列号的肇端数值
     *
     * @return              int     新的序列值
     */
    function getSeq($fieldName, $step=1, $start=1){
        $table = DB_SEQUENCE_TABLENAME;
        $step = (int)$step;
        $start = (int)$start;
        $rs = mysql_query("UPDATE $table SET seq_num=seq_num+($step) WHERE seq_name='$fieldName'");
        if(!$rs || mysql_affected_rows($this->cnn)<1){
            $rs = mysql_query('SELECT * FROM '.DB_SEQUENCE_TABLENAME, $this->cnn);
            if(!$rs){
                $sql = "CREATE TABLE $table (
                               seq_name VARCHAR( 20 ) NOT NULL ,
                               seq_num BIGINT( 20 ) DEFAULT 1 NOT NULL ,
                               PRIMARY KEY (seq_name))";
                $rs = mysql_query($sql) or $this->_halt('创立序列产生器表掉败', $sql);
            }
            $rs = mysql_query("INSERT INTO $table VALUES('$fieldName', $start)") or
                       $this->_halt('添加新序列毛病', $sql);
            $seq = $start;
        }else{
            $seq = &$this->getOne("SELECT seq_num FROM $table WHERE seq_name='$fieldName'");
        }
        return $seq;
    }

    function _getCommand($fetchType){
        switch($fetchType){
            case DB_FETCH_ASSOC: $exe = 'mysql_fetch_assoc'; break;
            case DB_FETCH_NUM: $exe = 'mysql_fetch_row'; break;
            case DB_FETCH_BOTH: $exe = 'mysql_fetch_array'; break;
            case DB_FETCH_OBJECT: $exe = 'mysql_fetch_object'; break;
            default: $exe = 'mysql_fetch_array'; break;
        }
        return $exe;
    }

    function _halt($msg){
        $errNo = mysql_errno($this->cnn);
        $errStr = mysql_error($this->cnn);
        die("数据库毛病:$msg<br> $errNo : $errStr");
    }
}
?>


用C语言重新编写,包括可以访问数据库。他将这些程序和一些表单直译器整合起来,称为 PHP/FI。PHP/FI 可以和数据库连接,产生简单的动态网页程序。
深爱那片海 该用户已被删除
沙发
发表于 2015-2-4 10:02:10 | 只看该作者
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
变相怪杰 该用户已被删除
板凳
发表于 2015-2-6 17:48:06 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
莫相离 该用户已被删除
地板
发表于 2015-2-13 00:56:49 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
简单生活 该用户已被删除
5#
发表于 2015-2-14 05:06:04 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
爱飞 该用户已被删除
6#
发表于 2015-2-21 20:04:34 | 只看该作者
爱上php,他也会爱上你。
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-6 21:17:54 | 只看该作者
对于懒惰的朋友,我推荐php的集成环境xampp或者是wamp。这两个软件安装方便,使用简单。但是我还是强烈建议自己动手搭建开发环境。
若相依 该用户已被删除
8#
发表于 2015-3-13 09:10:09 | 只看该作者
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
若天明 该用户已被删除
9#
发表于 2015-3-13 09:10:10 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
再现理想 该用户已被删除
10#
发表于 2015-3-17 21:09:44 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
柔情似水 该用户已被删除
11#
发表于 2015-3-19 15:27:26 | 只看该作者
实践是检验自己会不会的真理。
冷月葬花魂 该用户已被删除
12#
 楼主| 发表于 2015-3-20 05:55:16 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
再见西城 该用户已被删除
13#
发表于 2015-3-30 06:29:53 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
飘飘悠悠 该用户已被删除
14#
发表于 2015-4-1 11:04:48 | 只看该作者
Ps:以上纯属原创,如有雷同,纯属巧合
谁可相欹 该用户已被删除
15#
发表于 2015-4-6 18:11:25 | 只看该作者
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
透明 该用户已被删除
16#
发表于 2015-4-12 15:28:50 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
分手快乐 该用户已被删除
17#
发表于 2015-4-26 04:20:34 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
蒙在股里 该用户已被删除
18#
发表于 2015-5-3 11:51:01 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
飘灵儿 该用户已被删除
19#
发表于 2015-5-6 09:09:31 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
金色的骷髅 该用户已被删除
20#
发表于 2015-6-19 21:44:42 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-13 12:25

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表