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

展开全部

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

PDO 介绍

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

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

50cbe7e298149f9cf744623be7ff990a.png

这并非一篇完整教导如何使用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)");

3

4# unnamed placeholders

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

6

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');

3

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' );

3

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);

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问题的解决,有助于将理论知识应用于实践中,增强问题解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问题的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值