PHP中的细节PDO类

PHP中的细节PDO类
简介

让我们看一看是PDO class.pdo PHP数据对象的简称,它被描述为一个轻量级的、兼容的接口在PHP访问数据库。虽然它的名字不好,PDO是一个访问数据库的PHP最喜欢的方式。

不同于MySQLi

mysqli和PDO非常相似,并有两个主要的差异:

1.mysqli只能访问MySQL,但PDO可以访问12个不同的数据库

2.pdo没有正常的函数调用(mysqli_ *功能

开始的步骤

首先,你要确定你的PHP安装PDO plug-in.you可以用美元测试=新PDO结果测试()。如果发现参数不匹配,它证明了PDO插件已经安装。如果对象不存在,你需要确认php_pdo_yourssqlserverhere.extis评述了pho.ini.if没有这句话,然后你要安装PDO,这里是不够的。

连接

现在我们确认服务器已经工作并开始连接到数据库。

$ DSN = 'mysql:北京演示;主机= localhost端口= 3306;
用户名为'root美元;
密码= 'password_here美元;
{试
DB新= PDO(美元美元美元美元的DSN,用户名,密码); / /还允许配置一个额外的参数
} catch(PDOException,e){
死(没有连接数据库:'。(e);
}
除了美元的DSN,所有语句和变量可以自我explanatory.dsn指的是数据源的名称,并有多种输入类型,其中最常见的是我们只是用了一个,和PHP官方网络解释其他可用的DSN。

你可以节省一些DSN的附加参数,数据库驱动程序后,就带着一个冒号,如(MySQL)。在这种情况下,PDO将尝试连接到本地数据库中。就像你需要在查询中指定数据库名称,当你使用mysqli。

你需要注意的最后一件事是,我们把我们的初始化与try-catch块。当PDO连接失败的PDOException,会抛出异常而不是查询的失败。如果你想的话,你可以使用下面的代码为DB =线选择例外模式

为数据库-> setAttribute(PDO::::attr_errmode,PDO errmode_exception);
或者你可以传递参数直接关系初始化:

DB =新的PDO(美元美元美元美元的DSN,用户名,密码,阵列(
PDO::attr_errmode:errmode_exception = > PDO:
));
我们现在使用的是错误的方式——当我们失败时,我们只返回false,我们没有理由去处理这个例外。

基本的查询

在PDO使用查询和执行两个方法可以查询数据库非常简单。如果你想获得查询结果执行的行数是非常好的,所以它是非常有用的SELECT查询语句。

现在让我们用以下示例中的一个来看看这两种方式:

语句= < SQL
*选择
从'食物'
健康的地方= 0
SQL;

食物= $ $ >查询($语句);
假设我们的查询是正确的,为食品现在是一个PDO语句对象。我们可以用它来获取结果,或者看看我们在查询中找到了多少结果集。

行数

不足的是,PDO不计算行returned.pdo语句包含一个方法称为行数提供了一个统一的方法,但这种方法并不能保证它在SQL驱动每扮演一个角色。幸运的是,它可以在MySQL数据库中工作。

如果SQL驱动程序不支持此方法,那么您也有2种选择:使用两次查询(选择计数(*))或使用简单计数($ $)获取行数。

幸运的是,对于我们的MySQL示例,我们可以使用下面的简单方法输出正确的行数。

echo $食品->行数();
遍历结果集

打印出美味的食物并不难:

foreach($食品-> fetchall()达食品){
echo $食品{ 'name' }。;
}
注意到的唯一的事情是,PDO还支持取。此方法只返回第一个结果,这对仅查询一个结果集非常有用。

逃避用户输入(特殊字符)

你听说过real_escape_string(mysqli_),以确保用户输入的安全data.pdo提供了一种方法,称为报价,使一个特殊的字符是从输入字符串中的引号的地方了。

输入:这是's'a美元的''pretty dange'rous str'ing
逃逸后,最终得到以下结果:

为数据库->报价(美元输入):这是 'pretty危险 北京的'rous STR
(exec)
如上所述,您可以使用执行方法来执行更新、删除和插入操作,这些操作将在执行后返回受影响行的数量:

语句= < SQL
删去'食物'
健康的地方= 1;
SQL;

$>执行语句;输出已删除行数
预处理语句

尽管PHP中仍然广泛使用和支持了执行方法和查询,PHP官方网络要求人们用预处理语句替换它们。为什么主要原因是:它更安全,预处理语句不直接在实际查询中插入参数,避免了许多潜在的SQL注入。

然而,由于某些原因,其实并没有真正使用PDO预处理。它模拟了预处理方式,在向SQL服务器传输语句之前将参数数据插入到语句中,这使得一些系统容易受到SQL注入。

如果你的SQL Server不支持预处理,我们可以很容易地得到一个参考解决这个问题在PDO初始化如下:

为数据库-> setAttribute(PDO::attr_emulate_prepares,假);
让我们从第一个预处理语句开始。

声明=美元美元DB ->准备('select *食品,`名字` =和`健康` =);
美元美元->准备statement2 =分贝('select *食品,`名字` =:名字和`健康` =:健康);
你可以看到,有两种方法创建参数,命名和匿名(不在一个语句中),然后你可以使用bindValue挖掘你的输入:

$声明-> bindValue(1,‘蛋糕');
$声明-> bindValue(2,真的);

$ statement2 -> bindValue(':名字,'pie);
$ statement2 -> bindValue(':健康的、虚假的);
注意,你必须包括一个冒号(:)使用命名parameter.pdo时也有一个可以绑定值的参考,这是bindparam方法,找到相应的价值只有当执行语句。

现在唯一要做的就是执行我们的声明:

语句>执行();
$ statement2 ->执行();

我们的结果:
$=语句>获取();
馅饼=美元美元->取statement2();
为了避免使用bindValue唯一的代码片段,你可以使用一个数组来给execute方法作为一个参数,这样:

$声明->执行(阵列(‘蛋糕'= 1,真实= 2));
美元->执行statement2(阵列('pie:名字= > ',':健康= >假));
事件

我们已经描述了在我们面前的是什么交易:

一个事务是执行一个查询,但它不保存对数据库。这样做的好处是,如果你执行4个相互依存的INSERT语句,如果没有,你可以滚回来,这样其他的数据不能插入到数据库中,这样,可以依靠对方的领域可以正确插入。你需要确保你使用数据库引擎由事务支持。

打开一个交易

你可以简单地使用BeginTransaction()打开一个交易方法:

为数据库->开始();

($ DB ->交易); / /真的!
然后,您可以继续执行数据库操作语句,并在结束时提交事务:

$ < >提交();
还有一个回滚()方法类似于MySQLi,但它不会回滚所有类型(例如,在MySQL中使用下拉表)。这种方法不太可靠。我建议我们尽量避免使用这种方法。

其他有用的选项

您可以考虑以下几种选项:当对象初始化时,可以将其用作第四参数输入。
$选项=阵列($选项= $ value1,$ { .. });
DB =新的PDO(美元美元美元美元的DSN,用户名,密码,为选项);

PDO::attr_default_fetch_mode
你可以选择什么类型的结果集将返回的PDO,如PDO::fetch_assoc,这将允许你使用$结果{ 'column_name}或PDO::fetch_obj,它将返回一个匿名对象,所以你可以使用$结果-> column_name。

您也可以将结果放入特定的类(模型)中,并且可以为每个单独的查询设置一个读取模式,如下所示。

查询=美元美元DB ->查询('select * `食品`);
食物=美元美元查询-> fetchall(PDO::fetch_class,'food);
PDO::attr_errmode

-所有读取模式
我们已经解释了这一个,但人们喜欢使用需要使用PDO::errmode_exception.if你想丢掉不管出于什么原因,PHP警告使用PDO::errmode_warning。

PDO::attr_timeout
当您急于加载时间时,可以使用此属性指定查询的超时时间。单位是秒。注意,如果你超过你设定的时间,默认会把e_warning例外,除非PDO::attr_errmode改。

可以在PHP官方网络的属性设置中看到更多的属性信息。

最后一个念头

PDO是访问你的数据库,PHP的一个很好的方式,它可以被认为是最好的方式去做。你没有理由不使用PDO除非你拒绝使用面向对象的方法或是太习惯的方法,也用于mysqli的名字。

更好的方法是完全切换到只使用预处理语句,这将最终使您的生活更容易!

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部