tp连接数据库

ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。采用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。
如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。

一、配置文件定义

常用的配置方式是在应用目录或者模块目录下面的database.php中添加下面的配置参数:

return [// 数据库类型'type'        => 'mysql',// 数据库连接DSN配置'dsn'         => '',// 服务器地址'hostname'    => '127.0.0.1',// 数据库名'database'    => 'thinkphp',// 数据库用户名'username'    => 'root',// 数据库密码'password'    => '',// 数据库连接端口'hostport'    => '',// 数据库连接参数'params'      => [],// 数据库编码默认采用utf8'charset'     => 'utf8',// 数据库表前缀'prefix'      => 'think_',// 数据库调试模式'debug'       => false,// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)'deploy'      => 0,// 数据库读写是否分离 主从式有效'rw_separate' => false,// 读写分离后 主服务器数量'master_num'  => 1,// 指定从服务器序号'slave_no'    => '',// 是否严格检查字段是否存在'fields_strict'  => true,    
];

type参数支持命名空间完整定义,不带命名空间定义的话,默认采用\think\db\connector作为命名空间,如果使用应用自己扩展的数据库驱动,可以配置为:

// 数据库类型
'type'        => '\org\db\Mysql',

表示数据库的连接器采用 \org\db\Mysql类作为数据库连接驱动,而不是默认的\think\db\connector\Mysql。

每个模块可以设置独立的数据库连接参数,并且相同的配置参数可以无需重复设置,例如我们可以在admin模块的database.php配置文件中定义:

return [// 服务器地址'hostname'    => '192.168.1.100',// 数据库名'database'    => 'admin',    
];

表示admin模块的数据库地址改成 192.168.1.100,数据库名改成admin,其它的连接参数和应用的database.php中的配置一样。

V5.0.6+版本开始,支持Mysql的断线重连机制,默认关闭,需要的话,是数据库配置文件中添加:

// 开启断线重连
'break_reconnect' => true,

连接参数

可以针对不同的连接需要添加数据库的连接参数(具体的连接参数可以参考PHP手册),内置采用的参数包括如下

PDO::ATTR_CASE              => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS      => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES  => false,

在database中设置的params参数中的连接配置将会和内置的设置参数合并,如果需要使用长连接,并且返回数据库的小写列名,可以采用下面的方式定义:

'params' => [\PDO::ATTR_PERSISTENT   => true,\PDO::ATTR_CASE         => \PDO::CASE_LOWER,
],

你可以在params里面配置任何PDO支持的连接参数。

二、方法配置

我们可以在调用Db类的时候动态定义连接信息,例如:

Db::connect([// 数据库类型'type'        => 'mysql',// 数据库连接DSN配置'dsn'         => '',// 服务器地址'hostname'    => '127.0.0.1',// 数据库名'database'    => 'thinkphp',// 数据库用户名'username'    => 'root',// 数据库密码'password'    => '',// 数据库连接端口'hostport'    => '',// 数据库连接参数'params'      => [],// 数据库编码默认采用utf8'charset'     => 'utf8',// 数据库表前缀'prefix'      => 'think_',
]);

或者使用字符串方式:

Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');

字符串连接的定义格式为:
数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集
注意:字符串方式可能无法定义某些参数,例如前缀和连接参数。

如果我们已经在应用配置文件(注意这里不是数据库配置文件)中配置了额外的数据库连接信息,例如:

//数据库配置1
'db_config1' => [// 数据库类型'type'        => 'mysql',// 服务器地址'hostname'    => '127.0.0.1',// 数据库名'database'    => 'thinkphp',// 数据库用户名'username'    => 'root',// 数据库密码'password'    => '',// 数据库编码默认采用utf8'charset'     => 'utf8',// 数据库表前缀'prefix'      => 'think_',
],
//数据库配置2
'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8';

我们可以改成

Db::connect('db_config1');
Db::connect('db_config2');

三、模型类定义

如果在某个模型类里面定义了connection属性的话,则该模型操作的时候会自动连接给定的数据库连接,而不是配置文件中设置的默认连接信息,通常用于某些数据表位于当前数据库连接之外的其它数据库,例如:

//在模型里单独设置数据库连接信息
namespace app\index\model;use think\Model;class User extends Model
{protected $connection = [// 数据库类型'type'        => 'mysql',// 数据库连接DSN配置'dsn'         => '',// 服务器地址'hostname'    => '127.0.0.1',// 数据库名'database'    => 'thinkphp',// 数据库用户名'username'    => 'root',// 数据库密码'password'    => '',// 数据库连接端口'hostport'    => '',// 数据库连接参数'params'      => [],// 数据库编码默认采用utf8'charset'     => 'utf8',// 数据库表前缀'prefix'      => 'think_',];
}

也可以采用DSN字符串方式定义,例如:

//在模型里单独设置数据库连接信息
namespace app\index\model;use think\Model;class User extends Model
{//或者使用字符串定义protected $connection = 'mysql://root:1234@127.0.0.1:3306/thinkphp#utf8';
}

并且支持直接使用数据库连接的配置名称,例如:

//在模型里单独设置数据库连接信息
namespace app\index\model;use think\Model;class User extends Model
{// 直接使用配置参数名protected $connection = 'db_config1';
}

需要注意的是,ThinkPHP的数据库连接是惰性的,所以并不是在实例化的时候就连接数据库,而是在有实际的数据操作的时候才会去连接数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW开发地铁运行安全监控系统

LabVIEW开发地铁运行安全监控系统 最近昌平线发生的故障事件引起了广泛关注,暴露了现有地铁运行监控系统在应对突发情况方面的不足。为了提高地铁系统的运行安全性,并防止类似事件再次发生,提出了一套全面的地铁运行安全监控系统方案。此方案…

MySQL数据库,变量、流程控制与游标

变量 系统变量 系统变量分为全局系统变量(需要添加global关键字)以及会话系统变量(需要添加session关键字)有时将全局系统变量简称为全局变量,将会话系统变量称为local变量。如果不写,默认会话级别。静态…

如何在页面中加入百度地图

官方文档&#xff1a;jspopularGL | 百度地图API SDK (baidu.com) 添加一下代码就可以实现 <!DOCTYPE html> <html> <head><meta name"viewport" content"initial-scale1.0, user-scalableno"/><meta http-equiv"Conten…

超分辨率重建——SAN训练自己数据集及推理测试(详细图文教程)

目录 一、源码包下载二、数据集准备三、预训练权重文件四、训练环境五、训练5.1 超参数修改5.2 训练模型5.2.1 命令方式训练5.2.2 Configuration配置参数方式训练 5.3 模型保存 六、推理测试6.1 超参数修改6.2 测试6.2.1 命令方式测试6.2.2 Configuration配置参数方式测试 6.3 …

响应者链概述

响应者链 iOS事件的3大类型 Touch Events(触摸事件)Motion Events(运动事件&#xff0c;比如重力感应和摇一摇等)Remote Events(远程事件&#xff0c;比如用耳机上得按键来控制手机) 触摸事件 处理触摸事件的两个步骤 寻找事件的最佳响应者事件的响应在响应链中的传递 寻…

Web UI 自动化 元素定位利器

序 元素定位&#xff0c;对于 Web UI 自动化而言&#xff0c;绝对是大家成长道路上的一道绊脚石。 很多初学者&#xff0c;都“死”在了元素定位上&#xff0c;从而失去了学习的兴趣。导致职业规划不得不半途而废~ 那么&#xff0c;今天&#xff0c;我们就使用 Katalon Stu…

深入理解CI/CD与Docker集成:自动化构建和部署的完整指南

在当今软件开发的快节奏环境中&#xff0c;自动化构建和部署是实现敏捷开发和DevOps实践的关键。Docker容器技术为这一过程引入了更高的灵活性和一致性。本文将深入研究如何将持续集成/持续部署&#xff08;CI/CD&#xff09;与Docker集成&#xff0c;提供更详细、实用的示例代…

向华为学习:基于BLM模型的战略规划研讨会实操的详细说明,含研讨表单(二)

上一篇文章&#xff0c;华研荟结合自己的经验和实践&#xff0c;详细介绍了基于BLM模型的战略规划研讨会的设计和组织流程&#xff0c;提高效率的做法。有朋友和我私信沟通说&#xff0c;其实这个流程不单单适合于BLM模型的战略规划研讨会&#xff0c;实际上&#xff0c;使用其…

v851s ssh搭建与使用

ssh 概述: 1. 用来远程登录的一种安全通道协议(常用于linux 、UNIX中); 2. 分为服务端和客户端: 1)服务端即openSSH ,一般属于目标开发板(linux中配置文件路径/etc/ssh/sshd_config); 2)客户端即登录端,常用工具:sercureCRT 、MobaXterm 、Putty等; 1. ssh 服务…

解锁数据探索新时代,JetBrains DataGrip 2023 Mac/win中文版下载

JetBrains DataGrip 2023 Mac/win&#xff0c;作为一款全新的数据库管理和开发工具&#xff0c;为数据工程师、分析师和开发人员提供了强大的功能和工具&#xff0c;帮助他们更高效地处理和分析数据。无论你是使用Mac还是Windows系统&#xff0c;都能够通过这款软件轻松驾驭数据…

springMVC 学习总结(四) 拦截器及统一异常处理

一.拦截器 1.拦截器与过滤器的区别 拦截器 Interceptor 和 过滤器 Filter类似&#xff0c;主要用于拦截用户请求并作出一定处理操作&#xff0c; 但两则也有不同之处&#xff0c;如过滤器只在Servlet前后起作用&#xff0c;是Servlet规范定义的&#xff0c;是Servlt容器才支…

CTF网络安全大赛是干什么的?发展史、赛制、赛程介绍,参赛需要学什么?

CTF&#xff08;Capture The Flag&#xff09;是一种网络安全竞赛&#xff0c;它模拟了各种信息安全场景&#xff0c;旨在提升参与者的网络安全技能。CTF 赛事通常包含多种类型的挑战&#xff0c;如密码学、逆向工程、网络攻防、Web 安全、二进制利用等。 发展史 CTF 的概念…

SpringBoot中处理处理国际化

SpringBoot中处理处理国际化 1. 创建SpringBoot项目2. resource下创建i18n目录3. 右键i18n新建资源包4. 弹框中添加需要支持的国际化语言5. messages.properties中添加需要国际化的键6. application.yaml添加配置7. 国际化工具8. 使用功能9 场景问题 1. 创建SpringBoot项目 2.…

4-Docker命令之docker diff

1.docker diff介绍 docker diff命令是用于比较一个docker容器不同版本提交的文件差异 docker diff命令会列出容器内3种文件状态变化,分别是:A-Add,D-Delete,C-Change 2.docker diff用法 docker diff container [root@centos79 ~]# docker diff --helpUsage: docker d…

条款3:尽量使用const

文章目录 const指针和函数声明const修饰指针const修饰函数const修饰容器const应用在函数中 const限定成员函数避免const重载的代码重复总结 const指针和函数声明 const修饰指针 char greeting[] "Hello"; char* p greeting; // non-const 指针,// non-const 数据…

MATLAB Sub2ind下标值转化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 前言 sub2ind([10,10],1,10) 10行10列 网格内第1行 第10列的数值是多少&#xff1f; 10*10的网格第一列 数值为&#xff1a;1 2 3 4 5 6 7 8 9 10&#xff1b…

Unity利用ZXing库 生成和识别二维码

ZXing 创建及识别二维码 生成二维码 目标 能够生成任意大小的二维码生成的二维码可调整背景颜色和码点的颜色生成的二维码中心可带有小Icon生成的二维码可带边框并可调整边框宽度和颜色 实现 using System.Collections.Generic; using UnityEngine; using ZXing; using ZX…

2023了,前端实现AI电子秤思路分析

前景小知识&#xff1a; 这几年ai这个话题非常火爆&#xff0c;笔者从事零售行业软件开发也接到了新需求&#xff0c;希望实现ai电子秤&#xff0c;老规矩&#xff0c;先看需求 举个栗子&#xff1a; 或许&#xff0c;你已经留意到&#xff0c;当你在某些大型超市超市或生鲜类…

spring 基于注解管理bean @Autowired

目录结构&#xff1a; 代码示例&#xff1a; UserContronller.java package com.atguigu.spring6.autowired.controller;import com.atguigu.spring6.autowired.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springfra…

阿里云对象存储OSS外网流出流量异常增多导致费用上升的解决方法

本文介绍在使用阿里云的对象存储 OSS服务过程中&#xff0c;外网流量消耗异常增多并导致异常的费用支出这一情况的问题发现、问题定位与几种不同的问题解决方法。 细细数来&#xff0c;写博客已经有近3的历史了&#xff0c;这成为了一项已经陪伴我大半人生的工作&#xff1b;也…