仓酷云

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

[学习教程] PHP网页编程之一个PHP数据库操作类源码

[复制链接]
深爱那片海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:52:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
大家如果能懂得“熟能生巧”的道理也就明白了这并不是浪费时间,同时这也可以减轻板主的负担,让他们有时间去处理更难的问题。   <?php
class Core{
  /*对数组停止承继*/
  static function inHerit(&#36;arr_orgin,&#36;arr_output){
    return array_merge(&#36;arr_orgin,&#36;arr_output);

  }
   /*打印毛病*/
  static function throwError(&#36;errmsg){
    echo '<p>error:'.&#36;errmsg.'</p>';
    exit();
  }
}
?>
<?php
class db{
    private &#36;result = array();
    private &#36;connector = array();
    private &#36;configs = array();
    private &#36;active = 0;
    private &#36;default_config = array(
        'dbtype' => 'mysql',
          'index' => 0,'user' => 'root', 'pwd' => '' ,'host' => 'localhost' ,'port'=> 3306,'charset' => 'utf8' ,'dbname' => null
    );
   
   /*初始化*/
   public function __construct(&#36;config = array()){
     if(&#36;config) &#36;this->connect(&#36;config);
   }
    public function __destruct(){
       foreach(&#36;this->connector as &#36;index => &#36;connect)
           &#36;this->{'_'.&#36;this->configs[&#36;index]['dbtype'].'_close'}(&#36;connect);
            
   }
    private function _mysql_close(&#36;connect){
      mysqli_close(&#36;connect);
   }
   /*选择毗连*/
   public function selectConnect(&#36;index){
        return  isset(&#36;this->connector[&#36;index]) && ((&#36;this->active = &#36;index) || true);
   }
   /*创立毗连*/
   public function connect(&#36;config){
     (!isset(&#36;config['index'])) && &#36;config['index'] = &#36;this->default_config['index']++  ;
      &#36;config = Core::inHerit(&#36;this->default_config,&#36;config);
     !in_array(&#36;config['dbtype'],array('mysql')) &&  Core::throwError('未撑持的数据库类型');
     extract(&#36;config);
     &#36;this->configs[&#36;index] = &#36;config;
     &#36;this->{'_'.&#36;config['dbtype'].'_connect'}(&#36;user, &#36;pwd,&#36;host,&#36;dbname,&#36;charset,&#36;index,&#36;port);
   
   }
   private function _mysql_connect(&#36;user = 'root', &#36;pwd = '' ,&#36;host = 'localhost' ,&#36;dbname = null,&#36;charset = 'utf8' ,&#36;index = 0 ,&#36;port = 3306){
     &#36;this->connector[&#36;index] =  mysqli_connect ( &#36;host, &#36;user, &#36;pwd , null, &#36;port) or Core::throwError(mysql_error());
     &#36;this->active = &#36;index;
     if(&#36;dbname) &#36;this->selectDb(&#36;dbname,&#36;charset);
   }
   
   /*获得以后毗连*/
   private function _getConnect(){
     return &#36;this->connector[&#36;this->active];
   }
   /*获得以后毗连利用的数据库类型 带参数主动拼接为函数名*/
   private function _getDbTypeFunc(&#36;funcname = null){
     &#36;dbtype = &#36;this->configs[&#36;this->active]['dbtype'];
     return &#36;funcname?'_'.&#36;dbtype.'_'.&#36;funcname:&#36;dbtype;
   }
   /*选择数据库*/
   public function selectDb(&#36;dbname,&#36;charset){
     mysqli_select_db(&#36;this->_getConnect(),&#36;dbname) or Core::throwError(mysql_error());
     &#36;this->_mysql_query('set names '.&#36;charset);
   }
   
   /*履行语句*/
   private function _mysql_query(&#36;sql){
    &#36;result = mysqli_query(&#36;this->_getConnect(),&#36;sql) or Core::throwError(mysql_error());
    return &#36;result;
   }
    private function _mysql_bind_by_name(&#36;sql , &#36;sqlv){
        &#36;sql_param = array();
        
        &#36;getparam = &#36;getparam2 =   '\w+?';// &#36;getparam = array_keys(&#36;sqlv); implode('|',&#36;getparam);
        preg_match_all('/:('.&#36;getparam.')\b/iU',&#36;sql,&#36;getparam) or   Core::throwError('参数绑定毛病');
        
        &#36;getparam = &#36;getparam[1];
        &#36;getparam = array_flip(&#36;getparam);
         count(&#36;getparam) != count(&#36;sqlv) || array_diff_key(&#36;getparam,&#36;sqlv) &&  Core::throwError('参数不婚配');
         &#36;sql = preg_replace('/:('.&#36;getparam2.')\b/iU','?',&#36;sql)  ;
               
        &#36;sqlv = array_merge(&#36;getparam,&#36;sqlv);
        
        unset(&#36;getparam2);
        unset(&#36;getparam);
        
        
        &#36;stmt = mysqli_prepare(&#36;this->_getConnect(),&#36;sql) or Core::throwError('wrong sql:'.&#36;sql);
        
        
        &#36;ptype = '';
        &#36;bindparam = array(&#36;stmt,'');
   
        foreach (&#36;sqlv as &#36;k => &#36;v){
            &#36;ptype .= &#36;this->_getParamType(&#36;k);
            &#36;bindparam[] = &#36;v;
            }
        &#36;bindparam[1] = &#36;ptype;
   
        call_user_func_array('mysqli_stmt_bind_param',&#36;bindparam);
        return &#36;this->_mysql_stmt_exec(&#36;stmt,&#36;sql);
   }
    private function _mysql_bind_in_sort(){
       &#36;argus = func_get_args() ;
       &#36;sql = array_shift(&#36;argus);
       &#36;stmt = mysqli_prepare(&#36;this->_getConnect(),&#36;sql) or Core::throwError('wrong sql:'.&#36;sql);
       &#36;pcount = mysqli_stmt_param_count(&#36;stmt);
      
       &#36;pcount != count(&#36;argus)  && Core::throwError('参数不婚配');
       &#36;ptype = str_repeat('s',&#36;pcount);
       array_splice(&#36;argus, 0, 0 ,array(&#36;stmt,&#36;ptype));
       call_user_func_array('mysqli_stmt_bind_param',&#36;argus);
        return &#36;this->_mysql_stmt_exec(&#36;stmt,&#36;sql);
   }
    private function _mysql_stmt_exec(&#36;stmt,&#36;sql){
         mysqli_stmt_execute(&#36;stmt);
         if(&#36;this->isSelect(&#36;sql)){ ///前往值绑定
            
            mysqli_stmt_bind_result(&#36;stmt,&#36;a);
             while (&#36;stmt->fetch()) {
                    print_r(&#36;a);
                    echo '<br/>';
                }
         }
         &#36;stmt->close();
   
   }
    /*依据参数模式利用分歧函数*/
   private function _mysql_iquery(&#36;sql , &#36;sqlv = array()){
     if (&#36;sqlv){
         if (is_array(&#36;sqlv))
             return  &#36;this->_mysql_bind_by_name(&#36;sql , &#36;sqlv);
         else{
             &#36;argus = func_get_args() ;
             return call_user_func_array(array(&#36;this,'_mysql_bind_in_sort'),&#36;argus);
         }
     }else{
         return &#36;this->_mysql_query(&#36;sql,&#36;sqlv);
     }
   }

  /*依据键名前缀辨别数据类型*/
  private function _getParamType(&#36;key){
     &#36;r = 's';
     /*首字母小写 第二个字母大写 则第一个字母为形式前缀*/
     &#36;mode = array(
       'i' => 'i','s' => 's','d' => 'd','b' => 'b'   
     );
     if (strlen(&#36;key) >= 2 &&  &#36;key[0] == strtolower(&#36;key[0]) && &#36;key[1] == strtoupper(&#36;key[1]) && in_array(&#36;key[0],&#36;mode))
        &#36;r = &#36;mode[&#36;key[0]];
   
     return &#36;r;
  }
/*剖析sql语句 判别行动*/
  private function _cmdType(&#36;sql){
      return substr(strtolower(&#36;sql),0,strpos(&#36;sql,' '));
        
   }
   /*剖析sql语句是不是为select语句*/
   private function isSelect(&#36;sql){
        return  'select' == &#36;this->_cmdType(&#36;sql);
   }
   public function query(&#36;sql , &#36;sqlv = array()){
       &#36;func = &#36;this->_getDbTypeFunc('iquery');
      
       &#36;argus = func_get_args() ;
       &#36;argus[0] = trim(&#36;argus[0]);
       return call_user_func_array(array(&#36;this,&#36;func),&#36;argus);
   }

}
?>
<?php
&#36;d = array(
  'dbname' => 'test',
  'charset' => 'latin1'
  );
&#36;db = new db(&#36;d);
//数组体例绑定参数
&#36;sqlv = array('iId1'=>'14','id2' => 30);
&#36;r = &#36;db -> query("select id from toselect where   id > :iId1 and id < :id2 ",&#36;sqlv);
//尺度体例绑定参数
&#36;r = &#36;db -> query("select content from toselect where   id > ? ",13);
var_dump(&#36;r);
?>
会MYSQL吗?会,我会把我的信息在数据库里插入删除啦
蒙在股里 该用户已被删除
沙发
发表于 2015-2-4 06:39:27 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
简单生活 该用户已被删除
板凳
发表于 2015-2-6 19:33:10 | 只看该作者
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
再见西城 该用户已被删除
地板
发表于 2015-2-18 10:44:00 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
因胸联盟 该用户已被删除
5#
发表于 2015-2-25 09:19:39 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
透明 该用户已被删除
6#
发表于 2015-3-7 19:08:56 | 只看该作者
Apache不是非得用80或者8080端口的,我刚开始安得时候就是80端口老占用,就用了个 81端口,结果照常,就是输localhost的时候,应该输入为 localhost:81
兰色精灵 该用户已被删除
7#
发表于 2015-3-15 12:07:00 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
爱飞 该用户已被删除
8#
发表于 2015-3-19 07:44:04 | 只看该作者
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
分手快乐 该用户已被删除
9#
发表于 2015-3-25 14:30:15 | 只看该作者
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
10#
发表于 2015-3-27 09:08:24 | 只看该作者
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
柔情似水 该用户已被删除
11#
发表于 2015-4-3 04:40:46 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
乐观 该用户已被删除
12#
发表于 2015-4-4 16:11:49 | 只看该作者
因为blog这样的可以让你接触更多要学的知识,可以接触用到类,模板,js ,ajax
变相怪杰 该用户已被删除
13#
发表于 2015-4-4 17:14:24 | 只看该作者
写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。
谁可相欹 该用户已被删除
14#
发表于 2015-4-7 20:45:45 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
若相依 该用户已被删除
15#
发表于 2015-4-14 22:12:29 | 只看该作者
写的比较杂,因为我也是个新手,不当至于大家多多指正。
小魔女 该用户已被删除
16#
发表于 2015-4-25 01:06:22 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
金色的骷髅 该用户已被删除
17#
发表于 2015-5-6 08:11:37 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
只想知道 该用户已被删除
18#
发表于 2015-6-10 15:51:59 | 只看该作者
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
飘灵儿 该用户已被删除
19#
发表于 2015-6-30 22:18:27 | 只看该作者
本文当是我的笔记啦,遇到的问题随时填充
再现理想 该用户已被删除
20#
发表于 2015-7-4 10:53:54 | 只看该作者
有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 03:12

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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