yii怎么连数据库

yii怎么连数据库

yii怎么连数据库?

深入理解Yii2.0之连接数据库

Yii使用PDO(PHP Date Object)连接各种各样的数据库,因此,几乎所有主流的数据库,Yii都可以 很好地提供支持。这也是一个成熟框架所应具有的广泛适用性。

推荐学习:yii框架

在对数据库进行任何操作之前,都必须先与数据库服务器建立连接。在Yii应用中,有一个专门的核心 组件(component)用于处理数据库连接,我们很容易可以在配置文件中找到他:

'components' => [    'db' => [        'class' => 'yiidbConnection',        'dsn' => 'mysql:host=localhost;dbname=yii2advanced',        'username' => 'root',        'password' => '',        'charset' => 'utf8',    ],    // ... ...],// ... ...

这里有人肯定已经猜到了,Yii用 yiidbConnection 来表示数据库连接。这个Connection实现了 对于PDO的一个简单封装,并掩盖了各种数据库的区别,实现了一个统一的开发接口。这样,使得你在 编程过程中,可以忽略绝大多数的数据库兼容问题,可以更加专注于功能开发。比如,你不用再担心在 MySQL下不能使用Money类型的字段等等。

数据库Schema

说到实现Connection独立于各种数据库,就不得不提到数据库Schema。Yii提供了各种主流的数据库 Schema,你甚至可以自己写一个Schema以适用自己独特的数据库管理系统(DBMS)。与Schema有关的类 有这么几个:

yiidbSchema 抽象类,用于描述各种不同的DBMS的Schema。

yiidbTableSchema 用于描述表结构。

yiidbColumnSchema 用于描述字段信息。

yiidbpgsql, yiidbmysql, yiidbsqlite, yiidbmssql, yiidboci, yiidbcubird 下的各种schema,用于具体描述各种DBMS。

在 yiidbConnection 中,有一个 $schemaMap 数组,用于建立PDO数据库驱动与具体的 schema 类间的映射关系:

public $schemaMap = [    'pgsql' => 'yiidbpgsqlSchema', // PostgreSQL    'mysqli' => 'yiidbmysqlSchema', // MySQL    'mysql' => 'yiidbmysqlSchema', // MySQL    'sqlite' => 'yiidbsqliteSchema', // sqlite 3    'sqlite2' => 'yiidbsqliteSchema', // sqlite 2    'sqlsrv' => 'yiidbmssqlSchema', // newer MSSQL driver on MS Windows hosts    'oci' => 'yiidbociSchema', // Oracle driver    'mssql' => 'yiidbmssqlSchema', // older MSSQL driver on MS Windows hosts    'dblib' => 'yiidbmssqlSchema', // dblib drivers on GNU/Linux (and maybe other OSes) hosts    'cubrid' => 'yiidbcubridSchema', // CUBRID];

我们可以认为Yii默认情况下支持上述数组中的10种DBMS(6个Schema),这在绝大多数情况下, 是完全足够的。万一你使用了超出这一范围的DBMS,在确保兼容的情况下,你可以自己写一个Schema, 使Yii可以支持该DBMS。

阿里云-虚拟数字人 阿里云-虚拟数字人

阿里云-虚拟数字人是什么? …

阿里云-虚拟数字人 2 查看详情 阿里云-虚拟数字人

Schema基类

yiidbSchema 是一个抽象类,具体的实现依赖于针对不同DBMS的6个子类Schema。擒贼先擒王, 读代码先读基类,我们就先来看看这个 yiidbSchema 吧:

abstract class Schema extends Object{    // 预定义16种基本字段类型,这16种类型是与DBMS无关的,具体到特定的DBMS时,Yii会自动    // 转换成合适的数据库字段类型。    const TYPE_PK = 'pk';    const TYPE_BIGPK = 'bigpk';    const TYPE_STRING = 'string';    const TYPE_TEXT = 'text';    const TYPE_SMALLINT = 'smallint';    const TYPE_INTEGER = 'integer';    const TYPE_BIGINT = 'bigint';    const TYPE_FLOAT = 'float';    const TYPE_DECIMAL = 'decimal';    const TYPE_DATETIME = 'datetime';    const TYPE_TIMESTAMP = 'timestamp';    const TYPE_TIME = 'time';    const TYPE_DATE = 'date';    const TYPE_BINARY = 'binary';    const TYPE_BOOLEAN = 'boolean';    const TYPE_MONEY = 'money';    // 加载表schema,需要子类具体实现    abstract protected function loadTableSchema($name);    // ... ...}

yiidbSchema 一上来就先针对各DBMS间差异最明显的字段数据类型进行统一,提供了16种基本的 字段类型。这16种类型与DBMS无关,在具体到特定的DBMS时,Yii会自动转换成合适的数据库字段类型 。我们在编程中,若需要指定字段类型,就使用这16种。这样的话,就不用考虑使用的类型具体的DBMS 是否支持的问题了。

这16种类型看着就知道是什么意思,我们就不展开讲了。

yiidbSchema::loadTableSchema() 是整个基类中最重要的一语句了,他定义了一个函数,用于 加载表的schema,需要由子类针对特定的DBMS实现。这里,我们以 yiidbmysqlSchema 子类为 例来讲解:

class Schema extends yiidbSchema{    // 定义一个数据类型的映射关系    public $typeMap = [        'tinyint' => self::TYPE_SMALLINT,        'bit' => self::TYPE_INTEGER,        'smallint' => self::TYPE_SMALLINT,        'mediumint' => self::TYPE_INTEGER,        'int' => self::TYPE_INTEGER,        'integer' => self::TYPE_INTEGER,        'bigint' => self::TYPE_BIGINT,        'float' => self::TYPE_FLOAT,        'double' => self::TYPE_FLOAT,        'real' => self::TYPE_FLOAT,        'decimal' => self::TYPE_DECIMAL,        'numeric' => self::TYPE_DECIMAL,        'tinytext' => self::TYPE_TEXT,        'mediumtext' => self::TYPE_TEXT,        'longtext' => self::TYPE_TEXT,        'longblob' => self::TYPE_BINARY,        'blob' => self::TYPE_BINARY,        'text' => self::TYPE_TEXT,        'varchar' => self::TYPE_STRING,        'string' => self::TYPE_STRING,        'char' => self::TYPE_STRING,        'datetime' => self::TYPE_DATETIME,        'year' => self::TYPE_DATE,        'date' => self::TYPE_DATE,        'time' => self::TYPE_TIME,        'timestamp' => self::TYPE_TIMESTAMP,        'enum' => self::TYPE_STRING,    ];}

yiidbmysqlSchema 先是定义了一个映射关系,这个映射关系是MySQL数据库的字段类型与前面 我们提到的16种基本数据类型的映射关系。也就是说,基于MySQL的Schema,使用MySQL的字段类型,会 转换成统一的16种基本数据类型。

表信息(Table Schema)

yiidbTableSchema 类用于描述数据表的信息:

class TableSchema extends Object{    public $schemaName;             // 所属的Schema    public $name;                   // 表名,不包含Schema部分    public $fullName;               // 表的完整名称,可能包含一个Schema前缀。    public $primaryKey = [];        // 主键    public $sequenceName;           // 主键若使用sequence,该属性表示序列名    public $foreignKeys = [];       // 外键    public $columns = [];           // 字段    // ... ...}

从上面的代码来看, yiidbTableSchema 比较简单。上述的属性看一看就大致可以了解是干什么 用的。这里我们点一点,了解下就可以了。

列信息(Column Schema)

yiidbColumnSchema 类用于描述一个字段的信息,让我们来看一看:

class ColumnSchema extends Object{    public $name;               // 字段名    public $allowNull;          // 是否可以为NULL    /**     * @var string abstract type of this column. Possible abstract types include:     * string, text, boolean, smallint, integer, bigint, float, decimal, datetime,     * timestamp, time, date, binary, and money.     */    public $type;               // 字段的类型    /**     * @var string the PHP type of this column. Possible PHP types include:     * `string`, `boolean`, `integer`, `double`.     */    public $phpType;            // 字段类型对应的PHP数据类型    /**     * @var string the DB type of this column. Possible DB types vary according to the type of DBMS.     */    public $dbType;    public $defaultValue;       // 字段默认值    public $enumValues;         // 若字段为枚举类型,该属性用于表示可供枚举的值    /**     * @var integer display size of the column.     */    public $size;    public $precision;          // 若字段为数值,该属性用于表示精度    /**     * @var integer scale of the column data, if it is numeric.     */    public $scale;    /**     * @var boolean whether this column is a primary key     */    public $isPrimaryKey;       // 是否是主键    public $autoIncrement = false;      // 是否是自增长字段    /**     * @var boolean whether this column is unsigned. This is only meaningful     * when [[type]] is `smallint`, `integer` or `bigint`.     */    public $unsigned;           // 是否是unsigned,仅对支持的类型有效    public $comment;            // 字段描述信息    /**     * Converts the input value according to [[phpType]] after retrieval from the database.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value     */    public function phpTypecast($value)    {        if ($value === '' && $this->type !== Schema::TYPE_TEXT && $this->type !== Schema::TYPE_STRING && $this->type !== Schema::TYPE_BINARY) {            return null;        }        if ($value === null || gettype($value) === $this->phpType || $value instanceof Expression) {            return $value;        }        switch ($this->phpType) {            case 'resource':            case 'string':                return is_resource($value) ? $value : (string) $value;            case 'integer':                return (int) $value;            case 'boolean':                return (bool) $value;            case 'double':                return (double) $value;        }        return $value;    }    /**     * Converts the input value according to [[type]] and [[dbType]] for use in a db query.     * If the value is null or an [[Expression]], it will not be converted.     * @param mixed $value input value     * @return mixed converted value. This may also be an array containing the value as the first element     * and the PDO type as the second element.     */    public function dbTypecast($value)    {        // the default implementation does the same as casting for PHP but it should be possible        // to override this with annotation of explicit PDO type.        return $this->phpTypecast($value);    }}

以上就是yii怎么连数据库的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/361369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 03:02:50
下一篇 2025年11月6日 03:04:11

相关推荐

  • Yii框架中如何使用CSS样式?

    如何在Yii框架中引用CSS样式? Yii框架是一个高性能、灵活性强的PHP框架。在开发网站或Web应用程序时,样式表(CSS)是非常重要的一部分,它可以使网站的外观更加美观、统一。在Yii框架中,我们可以通过简单的步骤来引用CSS样式,并让网页中的元素应用这些样式。 步骤1:创建CSS样式文件首先…

    2025年12月24日
    000
  • html5如何隐藏图标_使用CSS隐藏HTML5页面图标【页面】

    可通过移除icon标签、设href为空或data URL、配置HTTP响应头禁用请求、或使用1×1透明PNG图标四种方法隐藏HTML5页面图标。 如果您在HTML5页面中希望隐藏默认显示的网页图标(favicon),则可能是由于浏览器自动加载了默认图标或页面中存在未正确配置的图标链接。以下是实现隐藏…

    2025年12月23日
    000
  • JavaScript中如何将Base64图片转换为ImageData数组

    本教程详细介绍了如何使用JavaScript将Base64编码的图片字符串转换为`ImageData`数组。通过利用HTML Canvas API,我们可以创建一个图像对象,将其绘制到画布上,然后通过`getImageData`方法提取出包含R、G、B、A像素数据的`Uint8ClampedArra…

    2025年12月23日
    000
  • 解决HTML5 Canvas多图绘制覆盖问题:保持分辨率的最佳实践

    在html5 canvas上绘制多张图片时,由于每次设置`canvas.width`或`canvas.height`都会清除画布内容,导致后续图片覆盖之前绘制的图片。本文将深入探讨这一常见问题,并提供两种高效解决方案:通过单次初始化canvas尺寸,或等待所有图片加载完毕后统一绘制,确保多张图片以其…

    2025年12月21日 好文分享
    200
  • 解决Bootstrap模态框内AJAX表单提交导致意外关闭的问题

    本文旨在解决在bootstrap模态框中使用jquery ajax提交表单时,模态框意外关闭的问题。核心原因在于表单提交按钮携带了data-dismiss=”modal”属性。通过移除此属性,并确保ajax请求正确处理表单数据,可以实现模态框内表单的无缝异步提交,提升用户体验…

    2025年12月21日
    100
  • 使用 JavaScript 函数动态添加 CSS 样式

    本文将介绍如何使用 JavaScript 函数动态地将 CSS 样式应用于 HTML 元素,避免使用 document.write() 方法,并采用 appendChild 和 classList.add 等现代 Web 开发技术,实现灵活且可维护的样式控制。我们将通过示例代码,详细讲解如何创建元素…

    2025年12月20日 好文分享
    000
  • 解决SVG中tspan元素getBBox()在Firefox中返回错误值的问题

    在SVG开发中,getBBox()方法用于获取元素的边界框,但在处理嵌套的tspan元素时,Firefox浏览器可能会返回不准确的高度值,甚至在某些情况下返回零。本文将深入探讨这一跨浏览器兼容性问题,并提供两种有效的解决方案:一种是获取父级元素的整体边界框作为替代,另一种是利用getExtentOf…

    2025年12月20日
    000
  • 解决Firefox中SVG tspan getBBox()高度计算不准确问题

    本文探讨了在Firefox浏览器中SVG tspan元素使用getBBox()方法获取高度时出现不准确或返回0的问题。针对这一跨浏览器差异,文章提供了两种解决方案:一是通过获取父级元素的getBBox()来间接获取整体文本高度;二是通过利用SVGTextContentElement的getExten…

    2025年12月20日
    400
  • 解决SVG tspan getBBox() 在Firefox中返回错误值的方案

    本文旨在解决SVG tspan元素在Firefox浏览器中使用getBBox()方法时返回不准确或零值的问题。针对这一跨浏览器兼容性挑战,文章提供了两种有效的解决方案:一是利用父级元素的getBBox()获取整体文本范围,适用于仅需整体高度的场景;二是开发一个基于getExtentOfChar()的…

    2025年12月20日
    100
  • Yii2中VarDumper与Yii::debug实时输出配置指南

    本文旨在解决yii2框架中,开发者在使用`vardumper::dump()`和`yii::debug()`进行调试时,输出内容无法立即显示的问题。核心解决方案是通过配置日志组件的`flushinterval`和`exportinterval`参数,确保日志消息能够即时写入文件,从而实现调试信息的实…

    2025年12月13日
    000
  • 如何在Yii框架中实现条件加载控制器及调试策略

    本文旨在探讨在yii框架及通用web开发中,如何安全有效地实现基于特定条件加载替代控制器或执行调试代码的需求。文章将从根本上解决在不影响生产环境用户的前提下进行测试和调试的挑战,并提供两种主要策略:利用独立的开发/测试环境,以及在受控条件下通过角色权限(rbac)启用调试功能,以确保开发流程的稳定性…

    2025年12月13日
    000
  • Laravel数据加密与解密:实现可逆敏感信息存储的教程

    在开发需要存储敏感信息(如密码管理器中的服务凭据)的应用时,如何在保证数据安全的同时实现可逆的存储与检索是一个常见挑战。本文将深入探讨Laravel框架提供的加密服务,指导您如何使用`Crypt` facade对字符串进行加密和解密,从而安全地存储那些需要原文显示的敏感数据,并强调其与一次性哈希的区…

    2025年12月13日
    000
  • 在Yii2配置中灵活添加自定义文本标签与标题

    本教程详细阐述如何在Yii2框架的配置数组中插入自定义文本标签或标题,以优化表单或设置页面的视觉结构。文章将通过具体的代码示例,指导用户在现有字段之间添加纯文本显示元素,并探讨不同实现方式及其对渲染结果的影响,帮助开发者理解并正确处理此类显示需求。 在Yii2等MVC框架中,我们经常通过结构化的数组…

    2025年12月13日
    000
  • 在PHP中处理POST JSON数据:解决$_POST为空的问题

    本文旨在解决php应用在接收application/json类型的post请求时,$_post超全局变量为空的问题。我们将深入解释$_post的工作机制,并提供一种标准且可靠的方法,通过读取php://input流来获取原始json数据,并进行解析,确保php后端能正确处理json格式的api请求。…

    2025年12月13日
    000
  • php中Yii框架添加redis

    在 Yii 2.x 中添加 Redis 支持需配置 redis 组件并注册到应用,确保已安装 redis 扩展、Redis 服务运行,并在 config/web.php 的 components 中配置 hostname、port 等参数,再通过 Yii::$app->redis 调用测试读写…

    2025年12月13日
    000
  • PHP页面加载超时:文件会话管理优化与解决方案

    本文旨在解决php应用中因文件会话管理不当导致的页面加载超时问题,特别是当出现“maximum execution time exceeded”错误时。我们将深入分析问题根源,提供短期缓解措施,包括优化php内置的会话垃圾回收机制和手动清理策略,并重点推荐采用redis等外部存储作为长期、高性能的会…

    2025年12月13日
    000
  • Yii2 日志与调试输出深度指南

    本文旨在解决 yii2 框架中调试信息(如 `yii::debug` 和 `vardumper::dump`)无法实时输出到日志文件或控制台的问题。通过详细解析 yii2 的日志机制,重点介绍 `filetarget` 配置中的 `flushinterval` 和 `exportinterval` …

    2025年12月13日
    000
  • 高效批处理更新:使用ActiveRecord优化多行多列数据更新

    本文旨在解决使用ActiveRecord循环更新多行数据时效率低下及可能遇到的问题。通过对比循环更新和数据库层面的批处理更新,我们将详细阐述为何后者是更优解,并提供基于ActiveRecord的批处理更新代码示例,以实现性能优化和数据更新的原子性与可靠性。 在开发数据库驱动的应用程序时,经常需要对数…

    2025年12月13日
    000
  • 在Yii2表单配置中插入自定义文本标签或标题

    本教程详细阐述如何在yii2的动态表单配置数组中,正确地插入非输入型的文本标签或章节标题,以增强表单的可读性和组织性。文章将通过示例代码演示如何构建此类配置项,并重点强调前端渲染逻辑对这些特殊标签的处理方式,确保它们能被正确识别和展示。 引言 在开发复杂的Web表单时,除了各种输入字段外,我们经常需…

    2025年12月13日
    000
  • Yii设置邮箱发文件的方法

    Yii框架需借助yii2-swiftmailer扩展实现邮件发送,配置mailer组件并设置SMTP参数,通过attach()或attachContent()添加附件,注意路径、编码及授权码等细节。 Yii 框架本身不直接提供邮件发送功能,需借助第三方扩展(如 yii2-swiftmailer)实现…

    2025年12月13日
    000

发表回复

登录后才能评论
关注微信