【PHP基础知识】——数据库MySQL操作(下)

        接着之前的数据库文章,本篇文章除了总结数据库的一些常用知识和特点之外,还会介绍一下PHP连接、操作数据库的另外一种方法,即PDO。这也是PHP官方目前最新的数据库连接方式,更适用于PHP7

一、数据库的基础知识补充

1、数据库表设计需遵循的三个范式:
①第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
②第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。   
③第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。

概况起来说:
1NF:字段不可分; 
2NF:有主键,非主键字段依赖主键; 
3NF:非主键字段不能相互依赖。


2、索引、聚族索引、非聚族索引:
索引是一个数据结构(B+树),用来快速访问数据库表格或者视图里的数据。在数据库里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。这意味着不论聚集索引里有表格的哪个(或哪些)字段,这些字段都会按顺序被保存在表格,物理顺序和逻辑顺序一致。由于存在这种排序,所以每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。它允许每个表格有多个非聚集索引。

3、建立索引的规则:(常用语句:Create INDEX index_name ON TableName(col_name);)
①表的主键、外键必须有索引;
②经常与其他表进行连接的表,在连接字段上应该建立索引;
③频繁进行数据操作的表,不要建立太多的索引。

索引优缺点:
①可以大大加快数据的检索速度;
②可以加快表与表之间的连接;
③使用分组和排序子句进行检索时,同样可以显著减少查询中分组和排序的事件;
缺点:
①创建和维护所以你需要耗费时间;
②索引需要占物理空间,如果建立聚簇索引,需要的空间更大;
③表的数据更新时,索引也要动态的维护。

4、主键和外键:主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。外键是一个用来建立两个表格之间关系的约束。

5、数据库内联接和外联接:
内连接是保证两个表中所有的行都要满足连接条件,而外连接则不然。
在外连接中,某些不满条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行。分左连接、右连接、全连接三种。

6、SQL Select语句完整的执行顺序:
①from子句组装来自不同数据源的数据;
②where子句基于指定的条件对记录行进行筛选;
③group by子句将数据划分为多个分组;
④使用聚集函数进行计算;
⑤使用having子句筛选分组;
⑥计算所有的表达式;
⑦使用order by对结果集进行排序。

注:group by比order by先执行,order by不会对group by内部进行排序,如果group by后只有一条记录,那么order by将无效。要查出group by中最大的或最小的某一字段使用max或min函数,但也只能是针对目标是取一个值的情况,如果要取整条组内排序后的记录还得嵌套查询才行。

7、数据库事务:
①概念:数据库事务,是指作为单个逻辑工作单元执行的一系列操作,事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新数据。
②特点:原子性(要么都执行好么都不执行)、一致性(执行前后保持约束关系不变)、隔离性和持久性

二、PHP以PDO方式操作数据库

PHP数据对象(PDO)扩展为PHP访问数据库定义了一个轻量级的一致接口。实现PDO接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能。注意利用PDO扩展自身并不能实现任何数据库功能;必须使用一个具体数据库的PDO驱动来访问数据库服务。

1、PDO安装配置
①安装PDO组件:下载好PDO组件,编译安装:
cd /usr/local/download/php-5.6.23/ext/pdo
phpize
./configure --with-php-config=/usr/local/app/php/bin/php-config
make & make install

②安装PDO_MYSQL组件:同上,编译安装:
cd /usr/local/download/php-5.6.23/ext/pdo_mysql
phpize
./configure --with-php-config=/usr/local/app/php/bin/php-config  --with-pdo-mysql=/usr/
make & make install

③在PHP.ini中添加扩展支持,重启PHP服务即可:
extension=pdo.so
extension=pdo_mysql.so


2、创建一个表示数据库连接的PDO实例:
PDO::__construct ( string $dsn [, string $username [, string $password [, array $driver_options ]]] )
成功则返回实例,失败返回false;

3、设置编码:
PDO::exec("SET names utf-8");
也可以在连接实例化的时候设置:
$db = new PDO('mysql:host=myhost;dbname=mydb', 'login', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'')); 

4、数据查询操作:
①先用PDO::prepare()将待执行的sql语句进行预处理,实际查询变量用?代替,预处理后返回PDOStatement对象。
②可以通过PDOStatement::bindColumn(绑定一列到一个PHP变量)、PDOStatement::bindParam(绑定一个参数到指定的变量名)或PDOStatement::bindValue(把一个值绑定到一个参数)等方式绑定待查询的变量。然后执行PDOStatement::execute方法执行。
③上述第二步也可以直接通过PDOStatement::execute($array<待绑定的变量数组>)来绑定并执行查询;
④执行成功返回TRUE,失败返回FALSE;

5、数据库查询结果常用格式化方式:
PDOStatement::fetch — 从结果集中获取下一行(可用FETCH_ASSOC、FETCH_BOTH等返回索引形式)
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。
PDOStatement::fetchObject — 获取下一行并作为一个对象返回。

6、返回受影响行数:PDOStatement::rowCount(),返回最后插入的ID:PDO::lastInsertId()

7、插入和更新、删除操作:同查询操作,先prepare语句预处理待执行的变量,再绑定变量执行插入、更新或删除操作即可。

8、关闭数据库连接的操作流程:无需手动关闭,在一个请求执行完毕自动回收资源。

9、其他操作:
PDO::beginTransaction — 启动一个事务
PDO::commit — 提交一个事务
PDO::rollBack — 回滚一个事务
PDO::errorCode — 获取跟数据库句柄上一次操作相关的 SQLSTATE
PDO::errorInfo — 返回错误信息

注:在处理错误异常信息时,可通过PDOException异常类来准确获取错误信息。

三、总结

这里所讲主要是php+mysql的数据操作和呈现的方法,以及一些数据库的基本知识。对于PDO,其连接和操作的数据库有很多种,例如oracle、postgres等。也可以建立很多数据模型,功能非常强大,有待以后慢慢探讨和研究。


你可能感兴趣的:(PHP基础知识)