zoukankan      html  css  js  c++  java
  • 调用数据库的五种方式

    ThinkPHP 内置了抽象数据库访问层,把不同的数据库操作封装起来。我们只需要使用
    公共的 Db 类进行操作,无须针对不同的数据库写不同的代码和底层实现。Db 类会自动调用
    相应的数据库驱动来处理。

    一、全局配置定义  

     common/conf/config.php 

    'DB_TYPE'=>'mysql', //数据库类型
    'DB_HOST'=>'localhost', //服务器地址
    'DB_NAME'=>'thinkphp', //数据库名
    'DB_USER'=>'root', //用户名
    'DB_PWD'=>'123456', //密码
    'DB_PORT'=>3306, //端口
    'DB_PREFIX'=>'think_', //数据库表前缀,因为建立的数据表名称为think_user

    在 Home/Controller/UserController.calss.php 中

    <?php
    namespace HomeController;
    use ThinkController;
    use ThinkModel;//加载数据库模块
    
    class UserController extends Controller {
        public function model() {
            $user = new Model('User');//User最好大写
    var_dump($user->select()); //select是选择数据表中的数据
      }
    }

    二、PDO专用定义

      common/conf/config.php  

        'DB_TYPE'=>'pdo',
        'DB_USER'=>'root',
        'DB_PWD'=>'123456',
        'DB_PREFIX'=>'think_',
        'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',

    在 Home/Controller/UserController.calss.php 不变

    三、直接在 Home/Controller/UserController.calss.php 写,不需要在  common/conf/config.php  插入任何代码

    <?php
    namespace HomeController;
    use ThinkController;
     use ThinkModel; 
    
    class UserController extends Controller {
        public function model() {
            $user = new Model('User','think_','mysql://root:123456@localhost/thinkphp');//User中的U 建议大写
            var_dump($user->select());    
        }
    }

    最后说一点,就是model()函数内的 $user = new Model('User'); 可以替换为 $user = M ('User');  这时,可不在引用 use ThinkModel; 

    四、除了使用 Model 基类和 M()方法,还有一种对应数据表的模型定义,比如:UserModel。

    这种模型类并非必须定义的,只有当存在独立的业务逻辑或者属性的时候才需要。

    首先在 Home/Model 下新建 UserModel.class.php ,内部代码为:

    <?php
    namespace HomeModel;
    use ThinkModel;
    
    class UserModel extends Model {
    //这里面是不用插入代码的 }

    然后在 Home/controller/UserController.class.php 写入下列代码:

    <?php
    namespace HomeController;
    use ThinkController;
    use HomeModelUserModel;
    
    class UserController extends Controller {
        public function model() {
            $user = new UserModel();
            var_dump($user->select());    
    
        }
    }

    记得在 common/conf/config.php 写入下列连接数据库的代码

    <?php
    return array(
        //PDO专用定义
        'DB_TYPE'=>'pdo',
        'DB_USER'=>'root',
        'DB_PWD'=>'6Vpsu9GdGHe26cxR',
        'DB_PREFIX'=>'think_',
        'DB_DSN'=>'mysql:host=localhost;dbname=thinkphp;charset=UTF8',
        
        //页面调试工具Trace
       'SHOW_PAGE_TRACE'=>true,
    
    );

    这是在浏览器调用 Home/controller/UserController.class.php ,就能得到数据库中的信息,

    为什么 UserModel 模型类没有指定任何表即可直接访问呢?因为这种模型类基本是直
    接操作数据表的,所以在命名规范上和数据表名是对应的。(建立的数据表名称是thinkphp.think_user,其中thinkphp是数据库名,think_user是数据表名)

    虽然使用模型类和数据表对应较为方便,但当有时我们需要更换表名、前缀、附加数据
    库名等,就需要一些字段定义的操作。为了更加方便的了解数据表的变化,我们使用一下页
    面 Trace 工具,可以时时的查询 SQL 的变化。在 common/conf/config.php 中插入

    //页面Trace,调试辅助工具
     'SHOW_PAGE_TRACE' => true, 

    这时,在浏览器的右下角处出现:

    ,点击该图标,点击SQL,出现下图

    这时,在 Home/Model/UserModel.class.php 中写入下列代码:

    <?php
    namespace HomeModel;
    use ThinkModel;
    
    class UserModel extends Model {
        protected $tablePrefix = 'tp_';//重新定义表前缀
    }

    这时点击调试,则可发现:

    浏览器在出现

    类似的,下图是改变数据库的其他类型:

    <?php
    namespace HomeModel;
    use ThinkModel;
    
    class UserModel extends Model {
        //protected $tablePrefix = 'tp_';   改变数据表的前缀 -> tp_user
        //protected $tableName='abc';  改变数据表的名字 ->  think_abc
        //protected $trueTableName='abc';改变数据表的整个名字 ->  thinkphp.abc
        //protected $dbName='abc';改变数据库的名字->  abc.think_user
    }

    注:

    如果你仅仅使用 CURD 等数据库基本操作,我们建议使用基于 Model 基类的 M()方法。
    使用 M()方法由于不需要加载具体的模型类(比如 UserModel 类),所以性能会更高。

    五、

    当然,如果有必要使用具体的模型类时,ThinkPHP 还提供了 D()方法来直接是实例化
    模型类,并且还可以免去引入命名空间等操作。

    在 Home/controller/UserController.class.php 中

    //实例化UserModel类
    $user = D('User');
    var_dump($user->select());

    PS:使用 D()方法比直接使用模型类更加的智能,如果在 HomeModelUserModel  找

    不到该模型类,那么就会去公共模块下找 CommonModelUserModel  去找。如果还找不到,
    就会直接实例化基类 Model()类,也就是等同于使用 M()方法。
    D()方法可以直接调用当前模块的模型类,那么如果跨模块调用的话,那怎么处理呢?
    比如 Admin 后台模块,可以使用目录声明。
    //跨模块实例化
     $user = D('Admin/User'); 
    有时,你可能想使用原生的 SQL 语句进行操作数据库。那么可以采用实例化空模型基
    类或者空 M()方法。

    //空 M()方法
    $user = M(); //或者new Model();空基类
    var_dump($user->query("SELECT * FROM think_user WHERE user='蜡笔小新'"));

    附录:

    字段定义:
      每个模型类操作着每个对应的数据表,在大多数情况下,系统会自动获取当前数据表的
    字段信息。而当模型类第一次实例化时,系统会自动缓存字段,并且永久缓存,除非删除了
    运行时缓存或者设置不缓存。
      如果调试模式下,则不会生成字段缓存文件,每次都是从数据表里重新获取。生成缓存
    的目的显而易见,就是为了快速响应。ThinkPHP 默认是开启字段缓存,因为在实际运行中,
    不会更改字段结构。
      字段缓存文件保存在 Runtime/Data/_fields/目录里,当你在开发阶段,字段和表会经常
    变动,所以要关闭缓存。关闭缓存的方法为:
    // 关闭字段缓存
     'DB_FIELDS_CACHE'=> false //开启了调试模式,自动关闭 
    PS:如果开启缓存状态,新增了字段,那么可能新字段无法刷新出来,必须删除
     /Data/_fields  文件夹,重新获取字段。
    //查看字段结构
     var_dump($user->getDbFields()); 
    你也可以使用手动定义数据表字段的方式取代字段缓存方式,这种方式可以提高性能,
    避免 IO 开销。

    //手动定义数据表字段,_pk表示主键
     class UserModel s extends Model {
     protected $fields =  array('id', 'user', '_pk'=>'id');
    }
    //type 定义每个字段的类型,可以永远字段验证
     class UserModel s extends Model {
     protected $fields =  array('id', 'user', '_pk'=>'id',
    'type'=> array('id'=>'smallint','user'=>'varchar'));
    }

     举例

    在 index.php 中设置:

    // 关闭字段缓存
     'DB_FIELDS_CACHE'=> false //开启了调试模式,自动关闭 

    然后在 Home/controller/UserController.class.php 中

    <?php
    
    namespace HomeController;
    use ThinkController;
    use ThinkModel;
    
    class UserController extends Controller {
       
        public function model() {        
            $user = new Model('User');
            var_dump($user->getDbFields());
        }
    }

    这时在浏览器中刷新后就会显示数据表的字段:

    这时在数据表中添加一段数据:

    但刷新后浏览器中的数据表的字段还是不变,

    在 index.php 中打开调试后 'DB_FIELDS_CACHE'=> ture; 这时再刷新

    则添加的新的字段也会显示

  • 相关阅读:
    js去前后空格
    IE7以上支持Fiddler 监听本地
    IE8 scriptX print 无法使用的bug
    那些相见恨晚的 JavaScript 技巧
    oracle sql
    JS人民币金额转大写程序
    div自适应高度
    .NET Remoting 使用最佳实践,(部分翻译)
    对DataTable 进行Distinct操作
    用财富的眼光看知识管理
  • 原文地址:https://www.cnblogs.com/jacson/p/4467683.html
Copyright © 2011-2022 走看看