PHP连接MySQL数据库

php

 PHP为什么要连接数据库呢?

如果首次接触PHP,会有这样的疑问。

当然,也可以不连接数据库,PHP程序也可以正常运行。

PHP程序代码,只负责业务逻辑的处理,对于输入的数据进行计算并输出结果。

比如,你给一段计算和值的代码输入1,2….10,程序计算完并返回结果55。

此时,如果想把这个计算过程中,输入数据和输出数据存储下来,就需要数据库了。

PHP可以连接哪些数据库?

只要数据库和程序之间有相应的统一接口,就可以连接,常见的MySQL, PostgreSQL,SQL Server,Oracle,MongoDB,Redis都可以连接,其中以MySQL使用最为广泛。

PHP程序如何与MySQL数据库交互?

PHP与MySQL是互相独立的软件,两者若要进行数据交互,

就必须相互暴露相关的API,这些API通常是基于各自源码开发的扩展程序。

PHP与数据库进行数据交互,主要有以下三种扩展:

1) mysql扩展

2) mysqli扩展

3) PDO_MYSQL扩展

上面3种扩展都是基于PHP核心代码编写的扩展库, 都有对应的库函数和类。

上面3种扩展连接数据库服务器,可以使用以下2种数据库驱动:

  1. MySQL Client Library [ libmysql ]
  2. MySQL Native Driver  [mysqlnd ]

注意,这两个库是底层的,直接和数据库服务器交互的,没有提供PHP代码编程接口,是安装PHP的时候就指定的。

php扩展-libmysql关系图[1]

注意:

自PHP5.4.x,默认的驱动由libmysql变为mysqlnd,自PHP 5.5.0 libmysql被废弃,自PHP 7.0.0 libmysql开始被移除,这是因为mysqlnd是由PHP官方发布的新一代驱动程序,之前的libmysql的由MySQL AB发布,从而规避了版权问题,这只是一方面的原因,mysqlnd是直接集成在PHP源码中的,使用PHP的内存管理系统,支持PHP的内存限制,比libmysql有更快执行速度和更少的内存使用率。

PHP mysqlnd数据库驱动结构图

php mysqlnd结构图[2]

mysqlnd和libmysql在内存占用上的对比:

limysql和mysqlnd在内存占用上的对比[3]

可以看到,libmysql查询的数据在内存中存储了2份,而mysqlnd只存储了一份。

使用mysqlnd,运行PHP的主机可以不用安装数据库,而之前使用libmysql这是必须的。

mysqlnd还有更多特性,例如,增强的持续连接,SSL支持等,所以是时候抛弃libmysql了。

PHP连接MySQL数据库代码示例:

<?php
// mysqli
$mysqli = new mysqli("example.com", "user", "password", "database");
$result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $result->fetch_assoc();
echo htmlentities($row['_message']);

// PDO
$pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
$statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);

// mysql
$c = mysql_connect("example.com", "user", "password");
mysql_select_db("database");
$result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
$row = mysql_fetch_assoc($result);
echo htmlentities($row['_message']);
?>
  • mysqli扩展提供了丰富的面向对象编程模式来操作数据库的方式,比只支持函数式编程的mysql扩展好很多。
  • PDO方式虽然在编程上稍复杂一点,程序效率稍慢点,但是当业务的数据库类型变化时,基本上不用修改代码,因为它为各个不同的数据库定义了一个统一的接口。
  • mysql_connect方式的连接已经淘汰了。

参考资料
[1] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
[2] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
[3] Andrey Hristov <andrey@mysql.com>