简介
让我们看一看是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的名字。
更好的方法是完全切换到只使用预处理语句,这将最终使您的生活更容易!