问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么 PHP 应该使用 PDO 方式访问数据库

发布网友 发布时间:2022-04-22 12:46

我来回答

3个回答

热心网友 时间:2022-04-06 03:23

很多程序员都学习过如何使用 MySQL 或 MySQLi 扩展访问数据库。在 PHP 5.1 中,有一个更好的方法。 PHP Data Objects (PDO) 提供了很多预处理语句的方法,且使用对象将使你的工作更有成效!

PDO 介绍

“PDO – PHP Data Objects – 是一个对多种数据库提供统一操作方法的数据库访问层。”

它并不具备数据库特有的语法,但它将使切换数据库和平台更加容易,多数情况下,只需要简单修改链接字符串。

这并非一篇完整教导如何使用SQL的教程。它重要为那些现今仍在使用 mysql 或 mysqli 扩展的人,帮助他们跃至更具可移植性和强力的 PDO。


数据库支持

此扩展可以使用 PDO 驱动编写过的所有数据库。在本文书写时,下面的数据库支持已经实现:


PDO_DBLIB ( FreeTDS / Microsoft SQL Server / Sybase )

PDO_FIREBIRD ( Firebird/Interbase 6 )

PDO_IBM ( IBM DB2 )

PDO_INFORMIX ( IBM Informix Dynamic Server )

PDO_MYSQL ( MySQL 3.x/4.x/5.x )

PDO_OCI ( Oracle Call Interface )

PDO_ODBC ( ODBC v3 (IBM DB2, unixODBC and win32 ODBC) )

PDO_PGSQL ( PostgreSQL )

PDO_SQLITE ( SQLite 3 and SQLite 2 )

PDO_4D ( 4D )

你的系统不会也不必支持所有上面的驱动;下面是一个快速检查所支持数据库的方法:


1print_r(PDO::getAvailableDrivers());

连接

不同数据库的连接方法可能稍有不同,下面是一些较为流行的数据库连接方法。你将注意到,虽然数据库类型不同,前三种数据库的连接方式是相同的——而 SQLite 使用自己的语法。


Connection String

01try { 

02  # MS SQL Server andSybase with PDO_DBLIB 

03  $DBH = newPDO("mssql:host=$host;dbname=$dbname, $user, $pass"); 

04  $DBH = newPDO("sybase:host=$host;dbname=$dbname, $user, $pass"); 

05  

06  # MySQL with PDO_MYSQL 

07  $DBH = newPDO("mysql:host=$host;dbname=$dbname", $user, $pass); 

08  

09  # SQLite Database 

10  $DBH = newPDO("sqlite:my/database/path/database.db"); 

11} 

12catch(PDOException $e) { 

13    echo$e->getMessage(); 

14}

注意 try/catch 块——你应该总是使用 try/catch 包装你的 PDO 操作,并使用异常机制——这里只是简单的示例。通常,你只需要一个连接——有很多可以教你语法的列表。 $DBH 代表“数据库句柄”,这将贯穿全文。


通过将句柄设置为 NULL,你可以关闭任一连接。


1# close the connection 

2$DBH = null;

你可以在PHP.net找到更多数据库特定选项和/或其它数据库连接字符串的信息。


异常与 PDO

PDO 可以使用异常处理错误,这意味着你的所有 PDO 操作都应当包装在一个 try/catch 块中。你可以通过设定错误模式属性强制 PDO 在新建的句柄中使用三种错误模式中的某一个。下面是语法:


1$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT ); 

2$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING ); 

3$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

无论你设定哪个错误模式,一个错误的连接总会产生一个异常,因此创建连接应该总是包装在 try/catch 块中。


PDO::ERRMODE_SILENT

这是默认的错误模式。如果你使用这个模式,你将得使用同 mysql 或 mysqli 扩展一样的方法差错。其它两种模式更适合 DRY 编程。


PDO::ERRMODE_WARNING

此方法将会发出一个标准PHP警告,并允许程序继续运行。这对调试很有帮助。


PDO::ERRMODE_EXCEPTION

这是多数情况下你所希望的方式。它生成异常,允许你更容易的处理错误,隐藏可能导致它人了解你系统的信息。下面是一个充分利用异常的示例:


01# connect to the database 

02try { 

03  $DBH = newPDO("mysql:host=$host;dbname=$dbname", $user, $pass); 

04  $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 

05  

06  # UH-OH! Typed DELECT instead of SELECT! 

07  $DBH->prepare('DELECT name FROM people'); 

08} 

09catch(PDOException $e) { 

10    echo"I'm sorry, Dave. I'm afraid I can't do that."; 

11    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); 

12}

在 select 语句中有一个故意留下的错误;这将导致一个异常。异常错误细节保存至一个 log 文件,并生成一段友好的(或不怎么友好的)信息於用户。


插入和更新

插入新数据,更新已存数据是一种非常常见的数据库操作。使用 PDO,这通常需要两个步骤。本节中所述的所有内容对更新和插入都有效。

这里有一个最基本的插入示例:


1# STH means "Statement Handle"

2$STH = $DBH->prepare("INSERT INTO folks ( first_name ) values ( 'Cathy' )");

3$STH->execute();

你也可以使用 exec() 完成相同的操作,这将减少调用。多数情况下,你会使用调用多的方法,以充分利用语句预处理的优势。即使你只用它一次,使用语句预处理,帮助你保护你的 SQL 免于注入攻击。


预处理语句

使用语句预处理将帮助你免于SQL注入攻击。


一条预处理语句是一条预编译的 SQL 语句,它可以使用多次,每次只需将数据传至服务器。其额外优势在于可以对使用占位符的数据进行安全处理,防止SQL注入攻击。


你通过在 SQL 语句中使用占位符的方法使用预处理语句。下面是三个例子:一个没有占位符,一个使用无名占位符,一个使用命名占位符。


1# no placeholders - ripe for SQL Injection!

2$STH = $DBH->("INSERT INTO folks (name, addr, city) values ($name, $addr, $city)");

4# unnamed placeholders

5$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?);

7# named placeholders

8$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");

你希望避免第一种方法。选择命名我无名占位符将会对你对语句中数据的设置产生影响。


无名占位符

01# assign variables to each place holder, indexed 1-3

02$STH->bindParam(1, $name);

03$STH->bindParam(2, $addr);

04$STH->bindParam(3, $city);

05 

06# insert one row

07$name = "Daniel"

08$addr = "1 Wicked Way";

09$city = "Arlington Heights";

10$STH->execute();

11 

12# insert another row with different values

13$name = "Steve"

14$addr = "5 Circle Drive";

15$city = "Schaumburg";

16$STH->execute();

这里有两步。首先,我们对各个占位符指定变量(2-4行)。然后,我们对各个占位符指定数据,并执行语句。要发送另一组数据,只需改变这些变量的值并再次执行语句。


这种方法看上去对拥有很多参数的语句很笨拙吧?的确。然而,当数据保存于数组中时,这非常容易简略:


1# the data we want to insert

2$data = array('Cathy', '9 Dark and Twisty Road', 'Cardiff');

4$STH = $DBH->("INSERT INTO folks (name, addr, city) values (?, ?, ?);

5$STH->execute($data);

容易吧!


数组中的数据按顺序填入占位符中。 $data[0]是第一个,$data[1]是第二个,依次。不过,要是数组中数据的次序不正确,这将不能正常运行,你需要先对数组排序。


命名占位符

你可能已经开始猜测语法了,不过下面就是示例:


1# the first argument is the named placeholder name - notice named

2# placeholders always start with a colon.

3$STH->bindParam(':name', $name);

你可以看使用快捷方式,但它需使用关联数组。下面是示例:


1# the data we want to insert

2$data = array( 'name' => 'Cathy', 'addr' => '9 Dark and Twisty', 'city' => 'Cardiff' );

4# the shortcut!

5$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");

6$STH->execute($data);

数组中的键不需要以冒号开头,但其它部分需要同占位符匹配。如果你有一个二维数组,你只需遍历它,并对遍历的每个数组执行语句。


命名占位符的另一个好的功能是直接将对象插入到你的数据库中,只要属性同命名字段匹配。下面是一个示例对象,以及如何将它插入到数据库中的示例:


01# a simple object

02class person {

03    public $name;

04    public $addr;

05    public $city;

06 

07    function __construct($n,$a,$c) {

08        $this->name = $n;

09        $this->addr = $a;

10        $this->city = $c;

11    }

12    # etc ...

13}

14 

15$cathy = new person('Cathy','9 Dark and Twisty','Cardiff');

16 

17# here's the fun part:

18$STH = $DBH->("INSERT INTO folks (name, addr, city) value (:name, :addr, :city)");

19$STH->execute((array)$cathy);

通过在执行时将对象转换为数组,输将将会同数组的键一样对待。

热心网友 时间:2022-04-06 04:41

PDO的长链接可以减少对数据库的压力,所以相对较快些。

热心网友 时间:2022-04-06 06:16

php5.1开始支持及更高php版本主力推荐,之前的php_mysql 、php_mysqli

作为辅助,虚拟空间也开始默认只支持pdo——mysql;

PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口

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

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何理解“时间就是空间,空间就是时间”? 办公室副主任竞聘演讲稿范文 学校办公室主任竞聘演讲稿范文 最新办公室主任竞聘演讲稿 办公室主任竞聘演讲稿优秀范文 ...堆墨现象,墨线 接地和粘度都正常,请问应如何解决 ...都正常了开始喷印结果喷一条墨线好恐怖怎么解决呀各位老师 威力喷码机 求一份学生会演讲词 大学学生会个人优秀演讲稿 python中怎么混合命名占位符和匿名占位符 手机连接佳能打印机怎么连接?7280 thinkphp5.0数据库中的什么叫命名占位符绑定 佳能mg7580打印机可以配蓝牙适配器连接手机蓝牙打印吗? 怎么用手机NFC连接打印机进行打印 EMUI5.0和Magic Live系统哪个好 EMUI5.0和Magic Live区别对比 安装了内存条 怎么查看 惠普电脑怎么看内存? 别人给我发了红包,但我看不到是什么原因 电脑安装内存用多少怎么查看? 别人给你发了大红包,怎样回应 别人发红包给我怎么幽默回复 别人给你发红包你不想要该怎么拒绝收 人家给我发的红包我要怎么回应 生日时别人发的红包要收吗? 别人发红包怎么感谢 别人给你发红包你不想要该怎么拒绝收? 别人给我发红包,我领了,会有信息提醒吗 别人给你发红包怎么感谢? 别人给你发红包发了5.2元是什么意思 如下图Excel中什么叫占位符名称? C#中都有哪些占位符和分割符,他们的具体用法是什么? 汽车的型号命名有什么规则吗 怎么更改win7批量重命名照片后的序号格式 求文件批量重命名命令 在元素周期表中:104号元素往后的命名规则?? dreamweaver的图像占位符和命名锚记谁知到怎么用? oracle中占位符: 什么意思 EXCEL中如何批量重命名工作表名称? web前端命名bar是什么意思 请问老师我儿子五行缺什么,并帮忙命名,谢谢 热血江湖有人取名字,但是看不见字只占位,(非空格和特殊符号)有人知道怎么打么? VBA 如何给变量重命名? 404 Not Found java中list后面加<>是什么意思? 中国主要有哪些税收优惠政策? 增值税优惠政策有哪些 *财政关于振兴东北老工业基地的财税优惠*主要有哪些? 农林牧渔业税收优惠政策有哪些 北汽车购置税是否在优惠政策中