WordPress主题模板开发系列之数据库

数据库表前缀在安装时指定,记录在根目录下的wp-config.php的$table_prefix变量中,默认值为wp_,共11张表:

Wordpress数据库结构

文章评论信息表
wp_commentmeta(文章评论额外信息表)
wp_comments(文章评论信息表)
链接信息表
wp_links
基本配置信息表(对应后台设置>常规中的配置)
wp_options
文章信息表
wp_postmeta(文章额外数据表,文章的自定义字段等所存储的表格)
wp_posts
分类信息表
wp_terms(分类、标签的基础信息表)
wp_term_relationships(分类与文章、链接、菜单的关联表)
wp_term_taxonomy(分类补充信息表,区分terms信息的分类类型,有category, link, tag, nav_menu四种分类类型)
用户信息表
wp_usermeta(用户额外信息表)
wp_users(用户基本信息表,存放系统所有用户基本信息)

PHP与数据库

PHP支持哪些数据库

PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Sybase,DB2,Oracle,PostgreSQL,Access等,这些数据库PHP都能够安装扩展来支持,一般情况下常说的LAMP架构指的是:Linux、Apache、MySql、PHP,因此Mysql数据库在PHP中的应用非常广泛,我们会进一步简单地了解Mysql的操作方法。

数据库扩展

PHP中一个数据库可能有一个或者多个扩展,其中既有官方的,也有第三方提供的。像Mysql常用的扩展有原生的mysql库,也可以使用增强版的mysqli扩展,还可以使用PDO进行连接与操作。

不同的扩展提供基本相近的操作方法,不同的是可能具备一些新特性,以及操作性能可能会有所不同。

mysql扩展进行数据库连接的方法:

mysqli扩展:

PDO扩展

 

连接MySQL数据库

PHP要对数据库进行操作,首先要做的是与数据库建立连接,通常我们使用mysql_connect函数进行数据库连接,该函数需要指定数据库的地址,用户名及密码。

PHP连接数据库的方式类似于直接在命令行下通过进行连接,类似:mysql -hlocalhost -ucode1 -p,当连接成功以后,我们需要选择一个操作的数据库,通过mysql_select_db函数来选择数据库。

通常我们会先设置一下当前连接使用的字符编码,一般的我们会使用utf8编码。

通过上面的步骤,我们就与数据库建立了连接,可以进行数据操作了。

执行MySQL查询

在数据库建立连接以后就可以进行查询,采用mysql_query加sql语句的形式向数据库发送查询指令。

对于查询类的语句会返回一个资源句柄(resource),可以通过该资源获取查询结果集中的数据。

默认的,PHP使用最近的数据库连接执行查询,但如果存在多个连接的情况,则可以通过参数指令从那个连接中进行查询。

 

插入新数据到MySQL中

当我们了解了如何使用mysql_query进行数据查询以后,那么类似的,插入数据其实也是通过执行一个sql语句来实现,例如:

通常数据都是存储在变量或者数组中,因此sql语句需要先进行字符串拼接得到。

在mysql中,执行插入语句以后,可以得到自增的主键id,通过PHP的mysql_insert_id函数可以获取该id。

这个id的作用非常大,通常可以用来判断是否插入成功,或者作为关联ID进行其他的数据操作。

取得数据查询结果

通过前面的学习,我们发现PHP操作数据库跟MySql客户端上操作极为相似,先进行连接,然后执行sql语句,再然后获取我们想要的结果集。

PHP有多个函数可以获取数据集中的一行数据,最常用的是mysql_fetch_array,可以通过设定参数来更改行数据的下标,默认的会包含数字索引的下标以及字段名的关联索引下标。

可以通过设定参数MYSQL_NUM只获取数字索引数组,等同于mysql_fetch_row函数,如果设定参数为MYSQL_ASSOC则只获取关联索引数组,等同于mysql_fetch_assoc函数。

如果要获取数据集中的所有数据,我们通过循环来遍历整个结果集。

 

查询分页数据

上面,我们了解到通过循环可以获取一个查询的所有数据,在实际应用中,我们并不希望一次性获取数据表中的所有数据,那样性能会非常的低,因此会使用翻页功能,每页仅显示10条或者20条数据。

通过mysql的limit可以很容易的实现分页,limit m,n表示从m行后取n行数据,在PHP中我们需要构造m与n来实现获取某一页的所有数据。

假定当前页为$page,每页显示$n条数据,那么m为当前页前面所有的数据,既$m = ($page-1) * $n,在知道了翻页原理以后,那么我们很容易通过构造SQL语句在PHP中实现数据翻页。

在上面的例子中,我们使用了$m与$n变量来表示偏移量与每页数据条数,但我们推荐使用更有意义的变量名来表示,比如$pagesize, $start, $offset等,这样更容易理解,有助于团队协作开发。

更新与删除数据

数据的更新与删除相对比较简单,只需要构建好相应的sql语句,然后调用mysql_query执行就能完成相应的更新与删除操作。

同样的删除可以使用类似以下的代码:

对于删除与更新操作,可以通过mysql_affected_rows函数来获取更新过的数据行数,如果数据没有变化,则结果为0。

 

关闭MySQL连接

当数据库操作完成以后,可以使用mysql_close关闭数据库连接,默认的,当PHP执行完毕以后,会自动的关闭数据库连接。

虽然PHP会自动关闭数据库连接,一般情况下已经满足需求,但是在对性能要求比较高的情况下,可以在进行完数据库操作之后尽快关闭数据库连接,以节省资源,提高性能。

在存在多个数据库连接的情况下,可以设定连接资源参数来关闭指定的数据库连接。

在Magento中使用SQL语句

前面我们学习了如何通过Magento数据模型和ORM系统提供一个简单便捷的方式来获取、存储和操作数据。在进入下面内容的讲解之前,先学习一下Magento数据库适配器以及如何运行SQL查询,但应尽量避免本节中所要学到的内容。因为Magento是一套相应复杂的系统,这个在前面也有提到,这套框架一部分由事件来驱动。仅仅是保存一个产品就会触发不同的事件,由每个事件执行不同的任务。如果通过创建查询语句或直接更新产品则不会用到事件,所以作为开发者,我们需要异常谨慎,确定是否有必要在ORM系统以外进行操作。
虽然这么说,但可直接通过数据库进行操作的实际上要比通过Magento的模型来做也更为简易。比如,在全局更新产品属性或更改产品集合状态,我们可以加载一个产品集合并对每个产品进行遍历以进行更新和保存。这种方法对于小的集合而言没有问题,但在规模上升需要数据较大的数据集时,性能会开始下降,脚本将需要耗时数秒才能完成执行。
然而直接通过SQL语句将会快很多,通常会不到1秒,取决于数据集的大小以及需执行的SQL语句。
Magento会自动通过Mage_Core_Model_Resource模型来建立复杂的数据库连接等问题,连接包含两种类型:core_read和core_write。下面我们来实例化一个资源模型和两个连接,一个读连接一个写连接:

$resource = Mage::getModel('core/resource');

$read = $resource->getConnection('core_read');

$write = $resource->getConnection('core_write');

即使是通过SQL语句直接操作,也可以通过Magento实例化一个资源模型以及对应类型的连接来实现数据库的连接。

读操作

我们通过执行如下代码来测试读连接:

$resource = Mage::getModel('core/resource');

$read = $resource->getConnection('core_read');

$query = 'SELECT * FROM catalog_product_entity';

$results = $read->fetchAll($query);

<尽管上述语句可以运行并返回catalog_product_entity表中的所有产品,但假设我们需要查询安装时添加了前缀的表格呢?或者Magento在下一次更新时修改了表名怎么办?这些代码可移植性不强且不易于维护。幸好资源模型提供了另一个简便的方法getTableName()。
getTableName()方法使用工厂名作为参数,根据config.xml中的配置这个方法可以正确地查找到对应表格,并且会验证表格在数据库中是否存在。下面通过getTableName()方法来对代码进行更新:

$resource = Mage::getModel('core/resource');

$read = $resource->getConnection('core_read');

$query = 'SELECT * FROM ' . $resource->getTableName('catalog/product');

$results = $read->fetchAll($query);

这里我们还用到了fetchAll()方法,这将返回将查询结果的所有行返回为一个数组,但这并不是唯一的方式;我们还可以使用fetchCol()和fetchOne()方法,下面我们就来分析一下这些方法:

  • fetchAll:此方法返回从原查询语句中返回的所有行
  • fetchOne:该函数仅返回查询语句返回的第一行数据库值
  • fetchCol:本方法返回所有行,但仅包含每行的第一列内容,这对于只想获取产品ID或SKU等情况较为有用

写操作

前面已经提到,在Magento中保存模型,不管是产品、分类、客户还是其它的模型,都会导致速度相对较慢,因为在后台中会触发一定数量的observer和事件。
不过假如我们只想更新简单的静态数值,那么通过Magento CRM来更新大量集合实际上是很缓慢的。例如我们想要将站点中的所有产品置为OOS,则无需通过在Magento后台或创建一个脚本在所有产品中进行迭代循环来实现,只需通过如下代码段来轻松实现:


$resource = Mage::getModel('core/resource');

$read = $resource-&gt;getConnection('core_write);

$tablename = $resource-&gt;getTableName('cataloginventory/stock_status');

$query = 'UPDATE {$tablename} SET <code>is_in_stock</code> = 1';

$write-&gt;query($query);

下一节我们将开如学习Magento前台开发的相关知识。

PHP与MySQL学习笔记

PHP学习笔记

http默认端口80,ftp默认端口21,telnet默认端口23,https默认端口443

几种常见的操作系统、Web服务器、数据库、后台语言组合:
Linux+Apache+MySQL+PHP=LAMP
Unix+Tomcat+Oracle+JSP=J2EE
Windows+IIS+SQL Server+ASP=ASP.net

重复代码调用

PHP从最初的Personal Home Page Tools演化成今日对Hypertext Preprocessor的缩写,主要应用于web领域。

使用require()和include()这两个函数可以调用已完成并会重复调用的代码,这两个函数的区别在于在函数失败后require()给出一个致命的错误(fatal error),而include()仅给出一个警告(warnig)。如果是页眉和页脚,可以分别使用auto_prepend_file和auto_append_file。

函数

虽然PHP对于变量名是区分大小的,如$VAR不同于$var,而函数名实际上是不区分大小的,如调用Function_Name()和调用function_name()将返回同样的结果。

PHP中内置了很多函数,如phpinfo(),fopen(),随着版本的升级内置函数也还发生变化。用户也可以像声明变量一样创建自己的函数。声明一个函数,使用的基本格式是:
function function_name(){
}

当然函数名(function_name)的使用也要遵循一些要求:不能重复使用已有函数名称,只能使用数字、字母和下划线且不能以数字开头。

使用return可终止函数的执行,通常用于进行一些条件的判断如isset(),检测不到变量则直接终止函数。也可以使用return语句来与调用它的代码进行交互,如return false, return $a。

面向对象

创建类的格式很简单,通过下面的格式进行声明即可:

class class_name{

}

类中使用的变量、函数等可通过修饰符public,private和protected进指定作用域,其中private在类外部不可见,且不能被继承,而protected在类外部不可见,但是可以被继承。类之间可以继承,如B继承了A的话,则可以使用class B extends A(PHP不支持多重继承,即一个类不可以继承两个类)。

构造函数和析构函数的格式分别为__construct()和__destruct(),类的实例化可以通过$a= new class_name()来实现。使用父类的函数时可使用parent::function_name()来进行调用,若要禁止调用和重载,可使用final修饰符。

MySQL学习笔记

MySQL语句不区分大小写,但数据库和表名是区分大小写的。

MySQL登录的命令

登录MySQL可在命令行输入

mysql -h hostname -u username -p其中-h后对应的是主机名,通常本地连接时可直接忽略该项,-u后对应的为用户名,如root,-p对应的自然是密码,执行该语句后会要求输入对应用户的密码。

数据库的四个基本功能CRUD

即Create,Read,Update,Delete

创建(Create)的基本语法
INSERT INTO table(column1, column2, column3)
VALUES(val1,val2,val3);
读取(Read)的基本语法
SELECT * FROM table
WHERE column1=’some-text’
ORDER BY column1, column2 ASC;
更新(Update)的基本语法
UPDATE table
SET column1=’some_text’
WHERE id =1;
删除(Delete)的基本语法
DELETE FROM table
WHERE id=1;

而创建数据库则应使用如下命令:

create database db_name;

使用命令创建数据库及表格

CREATE DATABASE database_name;
USE database_name;

下面的命令创建带有四列指定名称(id, menu_name, position, visible)和数据类型的数据库表格
CREATE TABLE table_name(
column1 int(11) NOT NULL auto_increment,
column2 varchar(30) NOT NULL,
column3 int(3) NOT NULL,
column4 tinyint(1) NOT NULL,
PRIMARY KEY(column1)
);

cd命令的用法

在执行命令时经常需要转换目录,这时候就需要用到cd命令(change directory),通常的几种用法有:

cd \ 返加到根目录

cd ..返回上一级目录,对应的返回上上一级目录就是cd ..\..,向上返回3级目录就是cd ..\..\..依此类推

cd 加上相对路径,进入对应目录

如要去其它盘,如在本地windows系统下切换到f盘,则无需使用cd,直接输入f:回车即可