让WordPress正式支持SQLite

WordPress可以(也可以)用于任何类型的网站,无论其大小或复杂性如何。一些常见的使用卡包括:

  • 单页登陆点
  • 只有几个页面的简单公司网站。这些站点通常很少更新,本质上是具有管理功能的静态站点。
  • 简单的单用户博客
  • 复杂的新闻网站
  • 电子商务网站
  • 全面的CMS解决方案

WordPress的成功部分是因为它是可扩展的、可挂钩的,并且可以使用和调整来完成几乎所有的网络任务。

然而,WordPress的一个方面从未改变,无论WP的用例和受欢迎程度如何增加:数据库。WordPress需要MySQL数据库MySQL数据库 MySQL是一个关系数据库管理系统。数据库是存储内容、配置和其他选项的结构化数据集合。https://www.mysql.com/./MariaDB将安装在现场。可以说,MySQL仅在某些场景中是最佳的:“中间层”的站点类型范围。

大型网站通常根据其特定需求实现自定义数据库堆栈,因此超出了本提案的范围。

在光谱的低端,有一些小而简单的站点。这些网站数量众多,包括所有博客、公司页面和没有数千用户或数千帖子的网站等。这些网站并不总是需要MySQL/MariaDB数据库的复杂性。对专用MySQL服务器的要求增加了它们的托管成本和安装的复杂性。在低端服务器上,它还降低了性能,因为相同的“盒子”需要同时满足菲律宾比索菲律宾比索 WordPress主要使用的web脚本语言。WordPress需要PHP 5.6.20或更高版本和MySQL/MariaDB服务器。

理想的场景

理想情况下,WordPress允许我们在安装期间选择数据库类型。这可以通过使用安装指南或wp-config.php中的简单常量来完成。为了实现这一点,WordPress需要有一个数据库抽象层。在CMS领域,这不是一个创新或激进的想法;Drupal拥有坚实的数据库抽象层已有十多年了。Laravel、Symfony和其他人还包括允许使用多种数据库类型的ORM。

为WordPress构建一个数据库抽象层将是一项艰巨的任务,尽管在未来的某个时候,我们可能必须承担这项任务,以确保项目的持续发展和寿命。

中间地带

作为中间点,我们可以为底层实现一个解决方案:中小型网站和博客。这些网站不一定需要一个成熟的MySQL数据库。

SQLite似乎非常适合:

  • 它是全球使用最广泛的数据库
  • 它是跨平台的,可以在任何设备上运行
  • 默认情况下,它包含在所有PHP安装中(除非明确禁用)
  • WordPress的最低要求是一个简单的PHP服务器,而不需要单独的数据库服务器。 
  • SQLite支持降低了主机成本,降低了能耗,并降低了低端服务器的性能成本。

在WordPress中实现SQLite核心核心 核心是运行WordPress所需的一组软件。核心开发团队构建WordPress。

目前,在WordPress中使用SQLite很简单;有一些实施已经存在并发展了8年多。它们经过了彻底的测试,证明可以无缝工作。这些实现是插入式的wp-content/db-php用户可以添加到其安装中的文件;它们不难使用。 

然而,大多数人并没有意识到这一点。他们没有意识到他们可以选择购买更便宜的托管sans-mysql,然后使用SQLite数据库安装WordPress。他们也不必知道……毕竟,他们只需要一个简单的公司网站或博客博客 (与网络、站点相比)

WordPress可以通过在Core中包含一个现有的SQLite实现来正式支持SQLite。我们需要确保它得到适当的测试和支持,此外,还需要提高认识并向用户公开选项。

为什么这应该在Core中,而不是插件插件 插件是一个包含一组功能的软件,可以添加到WordPress网站。他们可以扩展功能或为WordPress网站添加新功能。WordPress插件是用PHP编程语言编写的,并与WordPres无缝集成。这些可以在WordPress.org插件目录中免费https://wordpress.org/插件/或者可以是第三方基于成本的插件? 

选择数据库类型应该在首次安装站点时发生。这不是事后应该做的事情,因为这需要将数据从一个数据库迁移到另一个数据库,这通常会很复杂。 

WordPress在Core中包含了MySQL实现,因此如果我们支持SQLite,那么该实现应该与之共存

数据迁移迁移 将网站的代码、数据库和媒体文件从一台服务器移动到另一台服务器。通常在更换托管公司时进行。可以(并且应该)在一个插件中,以方便现有站点的迁移,如果他们希望这样做,但数据库引擎本身属于Core。 

这将确保实现得到适当的支持、适当的测试,WordPress将能够从中受益,详见下一节。

SQLite的好处是什么?

在WordPress中正式支持SQLite可能会有很多好处。一些值得注意的问题包括:

  • 提高了低端服务器和环境的性能。
  • WordPress在因系统要求而无法进入的市场中的增长潜力。
  • 使用安装“场景”的托管市场增长潜力。
  • 降低能耗–提高WordPress项目的可持续性。
  • 进一步推动WordPress为每个人“实现出版民主化”的使命。
  • 更容易贡献给WordPress–下载文件并运行内置PHP服务器,无需任何其他设置。
  • 更易于使用自动化测试套件。
  • 站点可以是“可移植的”和自包含的。

接下来的步骤

接下来的步骤需要在本提案的评论部分进行讨论。如果大家一致同意在WordPress Core中实现SQLite,那么接下来的步骤大致如下:

  • 创建必要的Trac公司Trac公司 Edgewall Software的一个开源项目,用作WordPress的错误跟踪和项目管理工具。门票
  • 决定如何定义数据库类型。最简单的场景是数据库类型中的常数wp-config.php允许用户选择他们的新站点是否使用MySQL或SQLite数据库,但在稍后的讨论中可能会提出其他解决方案。
  • 将SQLite实现移植到WordPress Core,应用必要的更改,如编码标准、代码内文档、迁移测试等。
  • 用SQLite测试WordPress核心功能
  • 外联插件开发人员进行测试。

2022年WCEU期间,在走廊以非官方身份详细讨论了数据库抽象和使用SQLite的主题。这篇帖子是这些对话的精华,将讨论带到更广泛的社区进行认真考虑。

道具@齐拉达姆,@马马杜卡,@乔诺埃尔德斯杨,@推特新闻,@谢尔盖·比留科夫,@约斯特德瓦尔克,@丁戈德,@遗骸,@克里许,@威廉巴顿,@成本开发,@亚当西尔弗斯坦,@贾维尔卡萨雷斯,@罗宾开发者,@美国国家电视台,@杰西贝尔审查并对本提案作出贡献。

#数据库,#安装,#性能,#持续性

4.6中的dbDelta()更新

dbDelta()是一个帮助根据指定的SQL语句修改数据库的函数。在WordPress 4.6中,此功能已被更新,以解决一些长期存在的错误。

标准化索引定义

以前,dbDelta()将索引定义的原始SQL数据与显示索引自。这需要特定的格式,因此不必重新创建索引。但直到现在,这种格式还没有得到保证。请参阅[37583]:

  • dbDelta()现在解析原始索引定义以提取类型、名称和列。有了这些数据,就建立了一个规范化的定义(#20263,#34873).
  • 核心核心 核心是运行WordPress所需的一组软件。核心开发团队构建WordPress。现在标准化大写类型(#34871)以及“KEY”。”“INDEX”只是“KEY”的同义词。
  • ASC和DESC定义目前未被使用MySQL数据库MySQL数据库 MySQL是一个关系数据库管理系统。数据库是存储内容、配置和其他选项的结构化数据集合。https://www.mysql.com/.,dbDelta()现在也忽略了他们(#34959).
  • 索引定义中的空格不再创建重复索引(#34869).

勾选所有内容

索引名称(#20263),索引列名(#20263),索引更改查询中的名称(#20263)和其他查询(#31679)现在用反勾号转义,以提高与保留关键字名称的兼容性。

支持空格键

dbDelta()已经支持了空间字段(由于不检查字段类型),所以也可以使用空间键支持来实现这一点。请参阅#36948.

 

如果您正在使用dbDelta()在您的插件插件 插件是一个包含一组功能的软件,可以添加到WordPress网站。他们可以扩展功能或为WordPress网站添加新功能。WordPress插件是用PHP编程语言编写的,并与WordPres无缝集成。这些可以在WordPress.org插件目录中免费https://wordpress.org/插件/或者可以是第三方基于成本的插件请用测试WordPress 4.6语言并在评论或Trac公司.

还有几个问题具有dbDelta(),你能帮我们修一下吗?🔨

#4-6,#数据库,#开发说明

在WordPress 4.0中不推荐使用like_escape()

@密克罗格里夫已编写了博客文章关于他的个人博客博客 (与网络、站点相比)解释原因like _ escape()已在WordPress 4.0中弃用。它已在下面转载。

插件插件 插件是一个包含一组功能的软件,可以添加到WordPress网站。他们可以扩展功能或为WordPress网站添加新功能。WordPress插件是用PHP编程语言编写的,并与WordPres无缝集成。这些可以在WordPress.org插件目录中免费https://wordpress.org/插件/或者可以是第三方基于成本的插件使用WordPress数据库查询的作者和网站开发人员应该注意到WordPress4.0中的一个重要变化。

功能like _ escape()不再在WordPress中使用核心核心 核心是运行WordPress所需的一组软件。核心开发团队构建WordPress。代码。它仍然可以作为一个弃用的函数使用,因此它仍然可以在任何依赖它的现有插件中使用。但是,一个新的不同的函数可用,应该在所有新代码中使用。

弃用意味着任何使用调用like _ escape()具有WP_DEBUG公司启用后将看到错误消息。如果工作包_DEBUG_LOG也将启用,错误消息将显示在/wp-content/debug.log文件。

让我们看一个我删除了核心代码的示例like _ escape()并实现了新功能$wpdb->esc_like().

3.9旧风格

$search_orderby_s=类似场景(esc_sql($q[的']));$search_orderby.=搜索订单“当$wpdb->posts.post_title像“%{$search_orderby_s}%'那么1”;

这做了什么?这是来自/wp-includes/query.php设置了对帖子标题的搜索。输入$q[的']在添加到posttitle之前,使用两个函数进行了转义喜欢表达式。现在,让我们看看我是如何在下一个版本中替换该代码段的。

4.0新样式

$like=“%”$wpdb->esc_like($q[s']).'%';$search_orderby.=$wpdb->prepare(“WHEN$wpdb->posts.post_title LIKE%s THEN 1”,$LIKE);

有两个重要的区别需要注意。

  • 我更改了like _ escape()呼叫$wpdb->esc_like().
  • 我更改了esc_sql()呼叫$wpdb->prepare().

第二个变化很重要,因为esc_sql()如果在调用新函数之前或内部调用它,则不安全$wpdb->esc_like().通过依赖函数的首选样式准备(),我可以很容易地看到$wpdb->esc_like()将首先运行而不是最后运行。

4.0替代样式

这里有些东西仍然有效,但我避免使用它。请注意,旧的查询没有改变。使用时,以正确的顺序调用两个转义函数至关重要$wpdb->esc_like().

$search_orderby_s=esc_sql($wpdb->esc_like($q[的']));//这是正确的顺序。$search_orderby.=搜索订单“当$wpdb->posts.post_title像“%{$search_orderby_s}%'那么1”;

如何为4.0准备代码?

不推荐使用的函数的好处是,您仍然可以使用它们,并且它们不会更改。您现有的代码应该可以正常工作。

当您编写新代码时,请记住使用$wpdb->esc_like()与WordPress 3.9不兼容。如果需要与旧版本兼容,则应避免这种情况。当您准备采用4.0作为最低版本时,请考虑使用新功能。

如果你对旧版本WordPress中的新功能有特殊需求,我建议用不同的名称将新功能复制到你的插件中。这是最简单的解决方案,但几乎没有必要。

为什么这么做like _ escape()更改为$wpdb->esc_like()?

旧功能存在几个无法修复的问题。

  • 文档显示,该函数的输出在SQL查询中使用是安全的。这是不正确的。
  • 函数的输出与中的LIKE表达式不完全兼容MySQL数据库MySQL数据库 MySQL是一个关系数据库管理系统。数据库是存储内容、配置和其他选项的结构化数据集合。https://www.mysql.com/..
  • 该函数在核心代码中有许多不同的使用方式,其中一些与所需的输出不兼容。
  • 更改旧功能而不是创建新功能会导致插件中出现许多安全问题。
  • 该函数与$wpdb相关,因为它的MySQL语法不适用于其他数据库。

是否存在安全问题like _ escape()?

旧函数like _ escape()不打算在任何安全敏感的上下文中使用。正确使用时不会出现安全问题。

话虽如此,我担心插件作者经常混淆旧函数like _ escape()具有esc_sql(),用于安全。以下文件like _ escape()对这一点有误导性,也很令人困惑。

只要记住,like _ escape()不为您的数据库提供任何安全性!

那么做什么$wpdb->esc_like()无论如何要做吗?

每当用户输入或其他原始数据被复制到WordPress查询中时,必须使用$wpdb->prepare()esc_sql()。这样可以防止某些字符(如引号)与SQL命令混淆。

在一个喜欢表达式中,还有其他特殊字符用作通配符来搜索数据库中的部分匹配。这些通配符必须从用户输入中转义,以便它们不会与程序员添加的通配符混淆。

在将用户输入添加到此类型的搜索查询之前,$wpdb->esc_like()应为兼容性而调用,然后必须按此顺序为安全性而调用$wpdb->prepare()。

如何在函数中使用$wpdb

很难使用$wpdb->esc_like()而不运行查询。但万一你想…

函数my_search($input){全局$wpdb;$escaped=$wpdb->esc_like($input);...}

……记住要引用$wpdb作为全局变量。

#4-0,#数据库,#开发说明,#查询,#安全

在昨天的每周开发者聊天中,进行了各种小的模式更改…

在昨天每周开发人员聊天,各种各样的未成年人讨论了模式更改问题。我们希望以尽可能高效的方式解决任何变化,并讨论了使用预架构升级(_schema_upgrade)函数而不是dbDelta(),这样我们可以更精确地控制查询。

以下是昨天讨论的门票列表,以及它们影响的表格。请在评论中添加有关此工作的任何问题、顾虑、额外门票或+1。

wp_注释

  • 评论作者电子邮件#21435–“wp-includes/comment.php line85由于无索引列导致查询速度慢”@马特索波(建议为添加索引评论作者电子邮件)
  • 多列索引#15499–由引发的“为get_lastpostmodified查询添加索引”@西蒙希特利(建议在帖子类型,后置状态,发布日期gmt还有另一个帖子类型,职位_状态,修改后的gmt)

wp_选项

  • 选项名称#13310–“Extend option_name to varchar(255)”由提出@涂鸦

wp_支柱

  • 职位名称#10483–将字段长度从200增加到400。#21212–将InnoDB的索引长度减少到191。
  • 指南#18315–引发的“向posts表中的GUID列添加索引”@alexking.org公司
  • 帖子密码– #881–提出“延长受保护帖子的密码字段”@镰刀刀片1

wp_术语

wp_term分类法

  • 修改现有索引#5034–“不可能有重复类别类别 “类别”分类法允许您将共享共同链接的帖子/内容分组在一起。类别是预定义的,范围广泛。不同父母的鼻涕虫@蛇足(建议在术语id,分类学,起源)

#4-0,#数据库

WordPress 3.9中的MySQL

在WordPress 3.9中,我们向WPDB添加了一个额外的层,使其切换到使用mysqli菲律宾比索菲律宾比索 WordPress主要使用的web脚本语言。WordPress需要PHP 5.6.20或更高版本库,当使用PHP 5.5或更高版本时。

对于插件插件 插件是一个包含一组功能的软件,可以添加到WordPress网站。他们可以扩展功能或为WordPress网站添加新功能。WordPress插件是用PHP编程语言编写的,并与WordPres无缝集成。这些可以在WordPress.org插件目录中免费https://wordpress.org/插件/或者可以是第三方基于成本的插件这意味着您绝对不应该再使用PHP的mysql_*()函数了,您可以使用等效的WPDB函数。

mysql_query()

根据您要执行的操作,有几个不同的选项可用于替换查询函数:

作为运行不需要返回值的查询(即INSERT、UPDATE或DELETE查询)的替代方法,可以使用$wpdb->query()。这将始终返回受查询影响的行数。

或者,$wpdb->insert(),$wpdb->update(),$wpdb->delete()$wpdb->replace()都是帮助函数,它们将自动转义数据,然后为您生成并运行查询。理想情况下,您应该永远不需要编写SQL语句!

mysql_fetch_*()

如果您有一个SELECT查询,通常会执行mysql_query(),然后是mysql_fetch_*(),WPDB允许您将其合并到一个函数调用中。

要从返回多行的查询中获取所有结果,请使用$wpdb->get_results()返回包含数据的对象数组。

还有一些常用的快捷功能:

如果您只需要查询中的一行,$wpdb->get_row()将只返回该行中的数据对象。

如果只需要单行中的一列,$wpdb->get_var()将只返回该字段。

如果你需要一列,$wpdb->get_col()将返回该列中所有数据的数组。

mysql_real_escape_string()

对于临时替换,您可以使用esc_sql()也就是说,我们强烈建议切换到$wpdb->prepare()而不是。我们有一个$wpdb->prepare()提供了相当全面的教程.

mysql_insert_id()

如果需要从上次查询中获取Insert ID,$wpdb->插入id就是你需要看的地方。

如果我们更改WordPress与数据库的连接方式,那么更新插件以使用WPDB也将是未来的证明——我们将始终保持与当前WPDB接口的向后兼容性。

有关更多信息,请查看WPDB Codex页面、和#21663.

如果您正在使用MySQL数据库MySQL数据库 MySQL是一个关系数据库管理系统。数据库是存储内容、配置和其他选项的结构化数据集合。https://www.mysql.com/.我没有在这里介绍过,请在评论中发表,我们很乐意帮助您!

#3-9,#数据库,#开发说明,#mysql(mysql),#水处理数据库