使用 PHP 和 MySQL
为什么要出新扩展呢?原因有两方面。首先MySQL的快速发展,那些依赖旧扩展的用户没法利用新特性,如prepared statements、高级连接选项以及安全提升。第二,虽然那个旧扩展当然用起来也不错,但许多人认为过程化的接口过时了,他们更喜欢面向对象的接口,因为不仅能与其他应用程序更紧密地集成,还能根据需要扩展此接口。为解决这些不足,MySQL开发人员决定是时候改造一下那个扩展,不仅仅修改了内部行为实现了性能提升,还引入了额外的特性促进了更新版本的MySQL中的可用特性的使用。
几点关键的改进:
# 面向对象:mysqli扩展被封装到一系列类,从而鼓励使用一种被很多人认为比PHP传统的过程化方法更方便也更高效的编程范型。但是那些喜欢过程化范型的人也不要担心,因为它也提供了一个传统的过程化接口。
# prepared statements:能够阻止SQL注入攻击。它消除了那些重复执行的查询的开销和不方便。
# 事务支持:尽管PHP最初的MySQL扩展也能支持事务功能,mysqli 扩展提供了这些功能的一个面向对象的接口。
# 增强的调试功能:mysqli 扩展听过了许多方法用于调试查询,更使开发过程更高效。
# 内嵌的服务器支持:MySQL 4.0 release 引入了一个内嵌的MySQL server 库,那些感兴趣的用户就可以在客户端应用例如桌面程序中运行一个完整的MYSQL服务器了。mysqli 扩展提供了一些方法用于连接和操作这些内嵌的MySQL服务器。
# 主/从支持:从 MySQL 3.23.15 开始,MySQL 就提供了对复制的支持。使用 mysqli 扩展,你可以保证查询会被转到一个复制配置中的主服务器上。
那些对最初的MySQL扩展熟悉的用户会发现增强的mysqli扩展很眼熟,几乎是一样的命名约定。例如,数据库连接函数叫mysqli_connect而不是mysql_connect。
1、安装的先决条件
从PHP 5开始,MySQL支持不在于标准PHP分发包捆绑。因此,需要显式配置PHP才能利用此扩展。
1.1、在Linux/UNIX中启用mysqli扩展
配置PHP的时候使用 --with-mysqli 标识。它应该指向 MySQL 4.1 以及更高版本中的 mysql_config 程序的位置。
1.2、在Windows上开启mysqli扩展
需修改php.ini,取消这行前面的注释:extension=php_mysqli.dll,如果没有的话,加上这一行。当然,启用任何扩展之前,要确保PHP的 extension_dir指令指向适当的目录。
1.3、使用MYSQL本地驱动程序
一直以来,PHP 要求运行PHP程序的那台服务器上要安装 MySQL client library,而不论MYSQL服务器恰好在本地或是在其他位置。PHP 5.3 除去了该要求,它引入了一个新的MySQL驱动,叫作MySQL Native Driver,也被叫做mysqlnd,它比刚才说的那个驱动要有很多优势。它不是一个新的API,而是一个新的“导管”,现有的API(mysql,mysqli,PDO_MySQL)可以利用这个导管与一个MySQL服务器通信。建议用mysqlnd,而不要使用其他驱动程序(除非你有非常充分的理由)。
要将 mysqlnd和某个扩展一起使用,你需要重新编译PHP,例如:--with-mysqli=mysqlnd。也可以多指定几个,如%>./configure --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
mysqlnd 驱动也有一些限制。当前它不提供压缩以及SSL支持。
1.4、管理用户权限
当一个脚本初始化一个到MySQL服务器的连接时,权限就会被传递和检验。还有在提交需要权限检验的命令时也是一样。不过,你只需在连接时确认执行用户;除非后来搞了一个新连接,否则脚本的后续执行都将一直是那个用户。
1.5、使用样例数据
学新知识时加上一些例子就简单了。数据库:corporate;表:products
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
sku VARCHAR(8) NOT NULL,
name VARCHAR(100) NOT NULL,
price DECIMAL(5,2) NOT NULL,
PRIMARY KEY(id)
)
===========================================================================
2、使用 mysqli 扩展
2.1、建立和断开连接
先要连接到服务器,然后选择一个数据库,之后是关闭连接。面向对象、过程化 这2种风格都是可以的。
用面向对象接口和MySQL服务器交互,首先要用mysqli类的构造器实例化它。
mysqli([string host [, string username [, string pswd
[, string dbname [, int port, [string socket]]]]]])
过去运用过PHP和MySQL的用户会发现该构造函数的许多参数和传统的mysql_connect()函数是一样的。
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
如果某个时刻,你想切换到其他服务器或选择另一个数据库,你可以用 connect()和select_db()方法。connect()方法的参数和mysqli类的构造函数一样。
// Instantiate the mysqli class
$mysqli = new mysqli();
// Connect to the database server and select a database
$mysqli->connect('localhost', 'root', '', 'corporate');
----------------------------------------------------------------------------------
或者
// Connect to the database server
$mysqli = new mysqli('localhost', 'catalog_user', 'secret');
// Select the database
$mysqli->select_db('corporate');
一但脚本完成执行,任何打开的数据库连接会自动关闭,资源也会被恢复。然而,也有可能一个页面在执行的过程中需要用到多个数据库连接,这些连接都需要正确地被关闭。即使只使用了一个连接,也应该在脚本的最后将其关闭,这是一种很好的实践方法。$mysqli->close()。
2.2、处理连接错误
应当仔细监控连接错误,并相应地做出应对措施。mysqli 扩展提供了一些特性,能够被用来捕捉错误消息,还有一种办法就是利用异常。例如,mysqli_connect_errno() 和 mysqli_connect_error() 就能够被用来诊断和显示MySQL连接错误信息。
2.3、获取错误消息
2.3.1、获取错误码
errno() 方法返回上一次MySQL函数执行过程中生成的错误码。0表示没有错误。
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
printf("Mysql error number generated: %d", $mysqli->errno);
?>
2.3.2、获取错误消息
error() 方法返回最近生成的错误消息。没有错误返回的就是空字符串。消息语言依赖于 Mysql 数据库服务器。
2.4、在一个独立文件中存储连接信息
在安全编程实践的思想中,定期修改密码是个不错的主意。还有就是有很多要访问数据库的脚本,一个个修改太麻烦了。办法是存在单独的一个文件中,必要时将其包含到你当前的文件中。
例如,可以将 mysqli 构造函数放在一个头文件中(mysql.connect.php):
$mysqli = new mysqli('localhost', 'catalog_user', 'secret', 'corporate');
?>
然后在其他文件中包含它:
include 'mysql.connect.php';
// begin database selection and queries.
?>
===================未完,待续
以上就介绍了使用 PHP 和 MySQL,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
上一篇: Qt之2D绘图