PHP编程:详解PHP中的PDO类
《详解PHP中的PDO类》要点: ?简介PHP编程 咱一起来看看PDO类.PDO是PHP Data Objects的缩写,它被描述为“在PHP中拜访数据库的轻量级,兼容性的接口”.尽管它的名字不咋好听,但PDO是一个在PHP中拜访数据库会让人喜爱的方式. MySQLi和PDO很相似,都有两方面主要区别:PHP编程 1.MySQLi只能拜访MySQL,但PDO可以拜访12种不同的数据库PHP编程 2.PDO没有普通函数调用(mysqli_*functions) 首先,你得确定一下你的PHP是否安装了PDO插件.你可以用$test=new PDO()的成果来测试.如果提示说是参数不匹配,那证明已经安装了PDO插件,如果说是对象不存在,你得先确认一下在pho.ini中php_pdo_yourssqlserverhere.extis是否被注释掉了.如果没有这句话,那你得安装PDO了,这里就不铝恕PHP编程 连接PHP编程 现在我们确认服务器已经工作,开始连接数据库吧: $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:<br/>' . $e); } 除$dsn之外,所有语句和变量都能自我解释.DSN指的是数据源名称,有多种输入类型.最常见的一种是我们刚刚用的这种,PHP官网解释了 其他可用的DSN .PHP编程 你可以省去DSN的其他额外参数,只需要在数据库驱动后面带个冒号,比如(mysql:).在这种情况下PDO将会尝试连接到当地数据库.就像当你使用MySQLi时需要在查询中指定数据库名称一样.PHP编程 最后一件你必要注意的事情就是我们用try-catch块包裹了我们的初始化对象.PDO连接失败的时候将会抛出PDOException异常而不是查询失败的时候.如果你愿意你可以使用下面代码$db=line来选择异常的模式. $db->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 或者你可以直接在PDO初始化时传递参数: $db = new PDO($dsn,$password,array ( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION )); 我们现在使用的是错误的方式――在失败时候简单返回false,我们是没有理由纰谬异常进行处理的.PHP编程 基本查询PHP编程 在PDO中使用query和exec两种办法使得对数据库查询变得非常简单.如果你想得到查询结果的行数exec是非常好用的,因此对SELECT查询语句是非常有用的.PHP编程 现在我们通过下面的一个例子查看这两种办法: $statement = <<<SQL SELECT * FROM `foods` WHERE `healthy` = 0 SQL; $foods = $db->query($statement); 假设我们的查询是正确的,$foods现在是一个PDO Statement对象,我们可以用它获取到我们的成果或者是查看这次查询中一共查到多少条成果集. 不足的是,PDO没有提供一个统一的办法去计算返回的行数.PDO Statement包含了一个叫做rowCount的办法,但是这个办法却不能保证在每一个SQL驱动中起作用(幸运的是,它能够在Mysql数据库中起作用).PHP编程 如果你的SQL驱动不支持这个办法,你也有2个选择:使用二次查询(SELECT COUNT(*))或者使用简单的count($foods)得到行数.PHP编程 幸运的是对我们的MySQL例子,我们可以使用下面的简单办法来输出正确的行数. echo $foods->rowCount(); 遍历成果集PHP编程 打印出这些可口的食物一点也不困难: foreach($foods->FetchAll() as $food) { echo $food['name'] . '<br />'; } 唯一需要注意的是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 = <<<SQL DELETE FROM `foods` WHERE `healthy` = 1; SQL; echo $db->exec($statement); // outputs number of deleted rows 预处置语句PHP编程 尽管exec方法和查询在PHP中仍然被大量使用和支持,但是PHP官网上还是要求大家用预处理语句的方式来替代.为什么呢?主要是因为:它更平安.预处理语句不会直接在实际查询中插入参数,这就避免了许多潜在的SQL注入.PHP编程 然而出于某种原因,PDO实际上并没有真正的使用预处置,它是在模拟预处置方式,在将语句传给SQL服务器之前会把参数数据插入到语句中,这使得某些系统容易受到SQL注入.PHP编程 如果你的SQL服务器不真正的支持预处置,我们可以很容易的通过如下方式在PDO初始化时传参来修复这个问题?1 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES,false); 接下来开始我们的第一个预处置语句吧: $statement = $db->prepare('SELECT * FROM foods WHERE `name`=? AND `healthy`=?'); $statement2 = $db->prepare('SELECT * FROM foods WHERE `name`=?1 AND `healthy`=?2)'; 正如你所见,有两种创建参数的办法,命名的与匿名的(不可以同时出现在一个语句中).然后你可以使用bindValue来敲进你的输入: $statement->bindValue(1,'Cake'); $statement->bindValue(2,true); $statement2->bindValue('?1','Pie'); $statement2->bindValue('?1',false); 注意使用命名参数的时候你要包含进冒号(?1).PDO还有一个bindParam办法,可以通过引用绑定数值,也就是说它只在语句执行的时候查找相应数值.PHP编程 现在剩下的唯一要做的事情,便是执行我们的语句: $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('?1' => 'Pie','?2' => false)); 事务PHP编程 前面我们已经描述过了什么是事务:PHP编程 一个事务就是执行一组查询,但是并不保留他们的影响到数据库中.这样做的好处是如果你执行了4条相互依赖的插入语句,当有一条失败后,你可以回滚使得其他的数据不能够插入到数据库中,确保相互依赖的字段能够正确的插入.你需要确保你使用的数据库引擎支持事务. 你可以很简单的使用beginTransaction()办法开启一个事务: $db->beginTransaction(); $db->inTransaction(); // true! 然后你可以继续执行你的数据库操作语句,在最后提交事务: $db->commit(); 还有类似MySQLi中的rollBack()办法,但是它并不是回滚所有的类型(例如在MySQL中使用DROP TABLE),这个办法并不是真正的可靠,我建议尽量避免依赖此办法.PHP编程 其他有用的选项PHP编程 有几个选项你可以考虑用一下.这些可以作为你的对象初始化时候的第四个参数输入. $options = array($option1 => $value1,$option[..]); $db = new PDO($dsn,$options);PDO::ATTR_DEFAULT_FETCH_MODE 你可以选择PDO将返回的是什么类型的成果集,如PDO::FETCH_ASSOC,会允许你使用$result['column_name'],或者PDO::FETCH_OBJ,会返回一个匿名对象,以便你使用$result->column_namePHP编程 你还可以将成果放入一个特定的类(模型),可以通过给每一个单独的查询设置一个读取模式,就像这样: $query = $db->query('SELECT * FROM `foods`'); $foods = $query->fetchAll(PDO::FETCH_CLASS,'Food'); PDO::ATTR_ERRMODE- 所有读取模式 上面我们已经解释过这一条了,但喜欢TryCatch的人必要用到:PDO::ERRMODE_EXCEPTION.如果不论什么原因你想抛出PHP警告,就使用PDO::ERRMODE_WARNING.PHP编程 PDO::ATTR_TIMEOUT 当你为载入时间而着急时,你可以使用此属性来为你的查询指定一个超时时间,单位是秒. 注意,如果跨越你设置的时间,缺省会抛出E_WARNING异常,除非 PDO::ATTR_ERRMODE 被改变.PHP编程 更多属性信息可以在 PHP官网的属性设置 里查看到. PDO是一个在PHP中拜访你的数据库的很棒的方式,可以认为是最好的方式.除非你拒绝使用面向对象的方法或是太习惯 MySQLi 的方法名称,否则没有理由不使用PDO.PHP编程 更好的是完全切换到只使用预处置语句,这最终将使你的生活更轻松!PHP编程 《详解PHP中的PDO类》是否对您有启发,欢迎查看更多与《详解PHP中的PDO类》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |