PHP PDO概述
PHP是一门开源的通用脚本语言,广泛用于创建动态和交互性的网页。PHP可以访问多种关系数据库管理系统,如 MYSQL, SQLite 和 PostgreSQL 。PHP 5.1版本提供了一个新的数据库连接抽象库,即 PHP数据对象 (PDO)。
PDO是什么
PDO是指 PHP数据对象 ,它是一个PHP扩展,为在PHP中访问数据库定义了一个轻量级和一致的接口。它是一套PHP扩展,提供了一个核心PDO类和数据库特定的驱动程序。每个数据库驱动程序都可以将数据库特定的功能以正常的扩展函数的形式暴露出来,实现PDO接口。
注意:我们不能使用PDO扩展本身执行任何类型的数据库功能。要访问数据库服务器,我们必须使用特定于数据库的PDO驱动程序。
PDO主要关注数据访问抽象而不是数据库抽象。它提供了 数据访问抽象层 ,这意味着无论我们使用的是哪个数据库,我们都必须使用该数据库提供的相同函数来发出查询和获取数据。PDO不提供数据抽象,因为它不会重写SQL或模拟缺失的功能。
PDO的优势
PDO提供了各种与对象一起工作的方式,并检索到的预备语句使工作更加容易。它是PHP中的一个数据库访问工具,通过它我们可以在多个数据库之间实现统一访问。
PDO允许相对轻松地在不同的数据库和平台之间切换,只需更改连接字符串即可。它不支持特定于数据库的语法。
PDO的一些优势包括:
- 数据库支持 PDO扩展可以访问为PDO驱动程序编写的任何数据库。有几个可用的PDO驱动程序,用于FreeTDS、Microsoft SQL Server、Sybase、IBM DB2、Oracle Call Interface、Firebird/Interbase 6和PostgreSQL数据库等等。驱动程序不会自动在每个系统中提供,因此我们需要找到可用的驱动程序,并在需要时添加它们。
- 数据库连接 有不同的语法可用于建立数据库连接。这些语法取决于特定的数据库。在使用PDO时,操作必须包含在try/catch块中,并利用异常处理技术。通常只需要创建一个连接,这些连接通过将数据库设置为null来关闭。
- 错误处理 PDO允许使用异常来处理错误。为了产生异常,可以强制PDO进入相关的错误模式属性。有三种错误模式,即静默(默认)、警告和异常。警告和异常在DRY编程中更有用。
- 静默 - 默认错误模式。
- 警告 - 用于调试。
- 异常 - 这种模式允许优雅地处理错误,同时隐藏一个人可能用来利用系统的数据。
- 插入和更新 PDO将常用的插入和更新数据库操作简化为两个步骤:准备 >> [绑定] >> 执行。通过这种方法,我们可以充分利用PDO的预处理语句,以防止通过SQL注入进行恶意攻击。预处理语句是预编译的SQL语句,可以通过将这些数据发送到服务器来多次执行。在这个占位符中使用的数据会自动受到SQL注入攻击的保护。
使用PDO的好处
PDO是本地数据库驱动程序。使用PDO有一些好处,如下所示:
- 易用性 - 它包含许多帮助函数,用于操作自动例行操作。
- 可重用性 - 它提供了统一的API来访问多个数据库。
- 安全性 - 它使用预处理语句来防止SQL注入。预处理语句是一种预编译的SQL语句,它将SQL语句的指令与数据分离。
PDO类
有三个PDO类,如下所示:
- PDO - 它表示PHP和数据库之间的连接。
- PDOStatement - 它表示准备好的语句,在语句执行后设置关联结果。
- PDOException - 它表示由PDO引发的错误。
支持PDO的数据库
PDO和MySQLi的比较
要使用PHP访问数据库,我们主要有两个选项 – MySQLi 和 PDO (PHP数据对象)。MySQLi是PHP的原生工具,提供更快的性能,而大多数经验丰富的开发人员更喜欢使用PDO,因为它支持各种各样的数据库驱动程序。根据它们的特点,PDO和MySQLi之间存在一些差异。
特性 | PDO | MySQLi |
---|---|---|
数据库支持 | 12种不同的驱动程序 | 仅限MySQL |
连接 | 简单 | 简单 |
API | 面向对象编程 | 面向对象编程+存储过程 |
性能 | 快速 | 快速 |
命名参数 | 是 | 否 |
对象映射 | 是 | 是 |
存储过程 | 是 | 是 |
客户端预处理语句 | 是 | 否 |
安全性 | 比MySQLi更安全。 | 安全但不及PDO。 |
在PDO和MySQLi之间应该选择哪一个
PDO和MySQLi各有各的优势:
- 正如我们之前所见,PDO可以在12个不同的数据库系统上运行,而MySQL只能与MySQL数据库一起使用。因此,如果我们想将项目切换到另一个数据库,PDO使其变得简单。而在MySQLi中,我们必须重写整个代码。
- PDO和MySQLi都是面向对象的,但MySQLi还提供了过程式API。两者都支持预处理语句。预处理语句对于Web应用程序安全非常重要,因为它可以防止SQL注入。
需求
建立此扩展不需要外部库。
安装过程
步骤1: 从此处下载最新的XAMPP服务器https://www.apachefriends.org/download.html以获取适用于Windows、Linux和MacOS等不同平台的版本。
注意:这里我们只讨论Windows操作系统的安装过程。
步骤2: 按照以下步骤在您的系统上安装XAMPP服务器。
步骤3: 选择您想安装的组件,然后点击“下一步”按钮。
步骤4: 在您想要安装XAMPP的位置创建一个名为xampp的新文件夹。
步骤5: 点击此处的下一步,然后继续。从这里开始安装XAMPP服务器。
步骤6: XAMPP已成功安装。点击“完成”按钮。
步骤7: 选择首选语言。
步骤8: 从这里运行Apache服务器和MySQL(根据给定的屏幕截图)。
步骤9: 现在,从 C:/xampp/php/php.ini (你安装XAMPP的地方)打开php.ini,并取消注释以下扩展 “php_pdo_mysql.dll” 和 “php_pdo.dll” (如果你正在使用MySQL数据库),或者 “php_pdo_oci.dll” (如果你正在使用Oracle数据库)。现在,开始使用数据库。在PHP 5.1以上的版本中,已经设置好了。
使用PDO
首先,我们需要创建一个数据库,可以从这里创建一个名为myDB的数据库。
数据库连接
与数据库进行交互时始终需要数据库连接。因此,我们需要知道用于访问数据库的标识符,即数据库的位置、数据库名称、用户名和密码。
现在,在任何文本编辑器(例如记事本或Notepad++)中使用PDO创建数据库连接程序,并将其保存为connection.php。在XAMPP服务器上使用localhost/80运行它。
示例
<?php
dbHost="localhost";dbName="myDB";
dbUser="root"; //by default root is user name.dbPassword=""; //password is blank by default
try{
dbConn= new PDO("mysql:host=dbHost;dbname=dbName",dbUser,dbPassword);
Echo "Successfully connected with myDB database";
} catch(Exceptione){
Echo "Connection failed" . $e->getMessage();
}
?>
输出
在服务器上运行,使用以下URL: localhost/Xampp/pdoexample/connection.php/ 或者您保存程序的位置。
处理连接错误
如果出现任何连接错误,将抛出一个PDOException对象。如果我们想处理错误条件,我们可以捕获这个异常,或者也可以将它交给全局异常处理程序处理,可以通过 set_exception_handler() 函数进行设置。
示例
在这个示例中,dbUser(user-id)是错误的,所以它会抛出一个异常,我们可以在输出中看到。
<?php
dbHost="localhost";dbName="myDB";
dbUser="rroot";dbPassword="";
try{
dbConn= new PDO("mysql:host=dbHost;dbname=dbName",dbUser,dbPassword);
//Set the PDO error mode to exception.conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Echo "Successfully connected with myDB database";
} catch(Exception e){
Echo "Connection failed" .e->getMessage();
}
?>
关闭数据库连接
<?php
dbHost="localhost";dbName="myDB";
dbUser="root"; //by default root is user name.dbPassword=""; //password is blank by default
try{
dbConn= new PDO("mysql:host=dbHost;dbname=dbName",dbUser,dbPassword);
Echo "Successfully connected with myDB database";
} catch(Exceptione){
Echo "Connection failed" . e->getMessage();
}
// this command close the connection.dbConn = null;
?>
输出