您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PDO 指南_PHP

2024/3/18 19:20:41发布26次查看
简介 前面咱已经见过mysqli了,现在咱一起来看看pdo类。pdo是php data objects的缩写,它被描述为“在php中访问数据库的轻量级,兼容性的接口”。尽管它的名字不咋好听,但pdo是一个在php中访问数据库会让人喜爱的方式。
与mysqli的不同 mysqli和pdo很相似,都有两方面主要区别:
1.mysqli只能访问mysql,但pdo可以访问12种不同的数据库
2.pdo没有普通函数调用(mysqli_*functions)
 开始步骤 首先,你得确定一下你的php是否安装了pdo插件。你可以用$test=new pdo()的结果来测试。如果提示说是参数不匹配,那证明已经安装了pdo插件,如果说是对象不存在,你得先确认一下在pho.ini中php_pdo_yourssqlserverhere.extis是否被注释掉了。如果没有这句话,那你得安装pdo了,这里就不啰嗦了。
连接 现在我们确认服务器已经工作,开始连接数据库吧:
$dsn = 'mysql:dbname=demo;host=localhost;port=3306';$username = 'root';$password = 'password_here';try { $db = new pdo($dsn, $username, $password); // also allows an extra parameter of configuration} catch(pdoexception $e) { die('could not connect to the database:
' . $e);}
除$dsn之外,所有语句和变量都能自我解释。dsn指的是数据源名称,有多种输入类型。最常见的一种是我们刚刚用的这种,php官网解释了 其他可用的dsn 。
你可以省去dsn的其他额外参数,只需要在数据库驱动后面带个冒号,比如(mysql:)。在这种情况下pdo将会尝试连接到本地数据库。就像当你使用mysqli时需要在查询中指定数据库名称一样。
最后一件你需要注意的事情就是我们用try-catch块包裹了我们的初始化对象。pdo连接失败的时候将会抛出pdoexception异常而不是查询失败的时候。如果你愿意你可以使用下面代码$db=line来选择异常的模式。
$db->setattribute(pdo::attr_errmode, pdo::errmode_exception);
或者你可以直接在pdo初始化时传递参数:
$db = new pdo($dsn, $username, $password, array ( pdo::attr_errmode => pdo::errmode_exception));
我们现在使用的是错误的方式——在失败时候简单返回false,我们是没有理由不对异常进行处理的。
 基本查询 在pdo中使用query和exec两种方法使得对数据库查询变得非常简单。如果你想得到查询结果的行数exec是非常好用的,因此对select查询语句是非常有用的。
现在我们通过下面的一个例子查看这两种方法:
$statement = fetchall() as $food) { echo $food['name'] . '
';}
唯一需要注意的是pdo也支持fetch方法,这个方法只会返回第一条结果,这对于只需要查询一条结果集是非常有用的。
 转义用户输入(的特殊字符) 你可曾听说过(mysqli_)real_escape_string,这是用于确保用户输入安全数据。pdo提供了一个方法叫做quote,这个方法可以把输入字符串中带有引号的地方进行特殊字符转义。
$input: this is's' a '''pretty dange'rous str'ing
在转义后,最终得到下面结果:
$db->quote($input): 'this is\'s\' a \'\'\'pretty dange\'rous str\'ing'
exec() 正如上面提到的,你可以使用exec()方法实现update,delete和insert 操作,执行后它会返回受影响行数的数量:
$statement = prepare('select * from foods where `name`=? and `healthy`=?');$statement2 = $db->prepare('select * from foods where `name`=:name and `healthy`=:healthy)';
正如你所见,有两种创建参数的方法,命名的与匿名的(不可以同时出现在一个语句中)。然后你可以使用bindvalue来敲进你的输入:
$statement->bindvalue(1, 'cake');$statement->bindvalue(2, true);$statement2->bindvalue(':name', 'pie');$statement2->bindvalue(':healthy', false);
注意使用命名参数的时候你要包含进冒号(:)。pdo还有一个bindparam方法,可以通过引用绑定数值,也就是说它只在语句执行的时候查找相应数值。
现在剩下的唯一要做的事情,就是执行我们的语句:
$statement->execute();$statement2->execute();// get our results:$cake = $statement->fetch();$pie = $statement2->fetch();
为了避免只使用bindvalue带来的代码碎片,你可以用数组给execute方法作为参数,像这样:
$statement->execute(array(1 => 'cake', 2 => true));$statement2->execute(array(':name' => 'pie', ':healthy' => false));
事务 前面我们已经描述过了什么是事务:
一个事务就是执行一组查询,但是并不保存他们的影响到数据库中。这样做的好处是如果你执行了4条相互依赖的插入语句,当有一条失败后,你可以回滚使得其他的数据不能够插入到数据库中,确保相互依赖的字段能够正确的插入。你需要确保你使用的数据库引擎支持事务。
 开启事务 你可以很简单的使用begintransaction()方法开启一个事务:
$db->begintransaction();$db->intransaction(); // true!
然后你可以继续执行你的数据库操作语句,在最后提交事务:
$db->commit();
还有类似mysqli中的rollback()方法,但是它并不是回滚所有的类型(例如在mysql中使用drop table),这个方法并不是真正的可靠,我建议尽量避免依赖此方法。
 其他有用的选项 有几个选项你可以考虑用一下。这些可以作为你的对象初始化时候的第四个参数输入。
$options = array($option1 => $value1, $option[..]);$db = new pdo($dsn, $username, $password, $options);
pdo::attr_default_fetch_mode 你可以选择pdo将返回的是什么类型的结果集,如pdo::fetch_assoc,会允许你使用$result['column_name'],或者pdo::fetch_obj,会返回一个匿名对象,以便你使用$result->column_name
你还可以将结果放入一个特定的类(模型),可以通过给每一个单独的查询设置一个读取模式,就像这样:
$query = $db->query('select * from `foods`');$foods = $query->fetchall(pdo::fetch_class, 'food');
- 所有读取模式
pdo::attr_errmode 上面我们已经解释过这一条了,但喜欢trycatch的人需要用到:pdo::errmode_exception。如果不论什么原因你想抛出php警告,就使用pdo::errmode_warning。
pdo::attr_timeout 当你为载入时间而着急时,你可以使用此属性来为你的查询指定一个超时时间,单位是秒. 注意,如果超过你设置的时间,缺省会抛出e_warning异常, 除非 pdo::attr_errmode 被改变.
更多属性信息可以在 php官网的属性设置 里查看到.
 最后的思考 pdo是一个在php中访问你的数据库的很棒的方式,可以认为是最好的方式。除非你拒绝使用面向对象的方法或是太习惯 mysqli 的方法名称,否则没有理由不使用pdo。
更好的是完全切换到只使用预处理语句,这最终将使你的生活更轻松!
英文来源:http://codular.com/php-pdo-how-to
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product