我想知道PHP 在5.1.和5.2.之间 PDO数据库之间的关联关系操作有什么不同的?

后使用快捷导航没有帐号?
PHP数据库操作:从MySQL原生API到PDO
时间: 09:25
阅读数:3787
作者:threenerd
摘要:本文将举详细例子向大家展示PHP是如何使用MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL数据库的。为了后面的测试,先建立数据库表test。包含表名user,score。CREATE TABLE `user` ( `id` int(10) un ...
本文将举详细例子向大家展示PHP是如何使用原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL的。为了后面的测试,先建立数据库表test。包含表名user,score。CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL DEFAULT '',
`gender` tinyint(1) NOT NULL DEFAULT '1',
`age` int(11) NOT NULL DEFAULT '0',
`flag` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
into `user`(`id`,`name`,`gender`,`age`,`flag`) values (1,'allen',1,20,1),(2,'alice',2,18,1),(3,'bob',1,21,1),(4,'dave',1,25,1),(5,'eve',2,20,1),(6,'joy',1,21,1),(7,'june',1,23,1),(8,'linda',2,22,1),(9,'lisa',2,22,1),(10,'liz',2,23,1);
CREATE TABLE `score` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL DEFAULT '0',
`score` int(11) NOT NULL DEFAULT '0',
`flag` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
into `score`(`id`,`uid`,`score`,`flag`) values (1,1,89,1),(2,2,98,1),(3,3,78,1),(4,4,88,1),(5,5,99,1),(6,6,89,1),(7,7,90,1),(8,8,93,1),(9,9,95,1),(10,10,99,1);使用原生 MySQL APIMySQL API 大部分扩展自 PHP 5.5.0 起已废弃,并在将来会被移除。应使用 MySQLi或 PDO_MySQL 扩展来替换之。配置并连接数据库&?php
$db = array(
'dsn' =& 'mysql:host=dbname=test',
'host' =& 'localhost',
'dbname' =& 'test',
'username' =& 'root',
'password' =& '123456',
'charset' =& 'utf8',
$link = mysql_connect($db['host'], $db['username'], $db['password']) or die( 'Could not connect: '
mysql_error ());
mysql_select_db($db['dbname'], $link) or die ( 'Can\'t use foo : '
mysql_error ($link));
mysql_set_charset($db['charset'], $link);查询并遍历数据:
= mysql_query('select * from user', $link);
echo $num_rows
mysql_num_rows ( $result );
while ($row = mysql_fetch_array($result, MYSQL_NUM)){
print_r($row);
}其中:mysql_fetch_array($result)
mysql_fetch_assoc($result)
mysql_fetch_row($result)
mysql_fetch_object($result)
mysql_fetch_field($result) 注意:上面一系列方法在运行后将返回结果集的下一行,如果没有更多行则返回 FALSE&。适合使用while循环遍历,遍历完停止。新增://如果不给出字段名,VALUES部分要按顺序全部给出值
//建议使用sprintf方式
$insert_sql = sprintf("insert into user values('0', '%s', '%d', '%d', '%d')", 'test', 1, 22, 1);
//不省略字段只需赋值给需要的字段,其它字段默认
$insert_sql = sprintf("insert into user(name,gender,age) values('%s', '%d', '%d')", 'test', 1, 22);
mysql_query($insert_sql) or die(mysql_error());
//新增的记录数
echo $affected_rows = mysql_affected_rows(); // 1
//返回新增的id
echo $id = mysql_insert_id(); // 13更新:mysql_query(sprintf("update user set name = '%s' where id = %d", 'test2', 11));
//更新的记录数
echo $affected_rows = mysql_affected_rows();删除:mysql_query(sprintf("delete from user where id = %d", 11));
//删除的记录数
echo $affected_rows = mysql_affected_rows();如何判断成功:mysql_num_rows($result) //返回结果集中行的数目。此命令仅对 SELECT 语句有效
mysql_affected_rows($link) //取得前一次 MySQL 操作所影响的记录行数,仅对INSERT,UPDATE 或 DELETE 有效关闭连接:mysql_close($link);原生 MySQL API里$link都是可以省略的,如果没有填写,默认使用上一次的连接。建议写上。使用MySQLi类MySQLi面向过程与原生 MySQL API基本用法是一样的,只需将mysql替换成mysqli且把$link放在方法的第一个参数就行了。对比看看:$result
= mysql_query('select * from user', $link);
= mysqli_query($link, 'select * from user');
$row = mysql_fetch_assoc($result)
$row = mysqli_fetch_assoc($result)全部代码:&?php
$db = array(
'dsn' =& 'mysqli:host=dbname=test',
'host' =& 'localhost',
'port' =& '3306',
'dbname' =& 'test',
'username' =& 'root',
'password' =& '123456',
'charset' =& 'utf8',
//mysqli过程化风格
//建立连接:相比mysql_connect可以直接选择dbname、port
//$link = mysqli_connect($db['host'], $db['username'], $db['password'], $db['dbname'], $db['port']);
$link = mysqli_connect($db['host'], $db['username'], $db['password']) or die( 'Could not connect: '
mysqli_error ($link));
//选择数据库
mysqli_select_db($link, $db['dbname']) or die ( 'Can\'t use foo : '
mysqli_error ($link));
mysqli_set_charset($link, $db['charset']);
//数据库查询
//普通查询,返回资源
= mysqli_query($link, 'select * from user');
//取得结果集中行的数目
mysqli_num_rows ( $result );
$insert_sql = sprintf("insert into user(name,gender,age) values('%s', '%d', '%d')", 'test', 1, 22);
mysqli_query($link, $insert_sql) or die(mysqli_error($link));
echo $affected_rows = mysqli_affected_rows($link);
echo $id = mysqli_insert_id($link);
mysqli_query($link, sprintf("update user set name = '%s' where id = %d", 'test2', 12));
echo $affected_rows = mysqli_affected_rows($link);
mysqli_query($link, sprintf("delete from user where id = %d", 12));
echo $affected_rows = mysqli_affected_rows($link);
//遍历结果集
while ($row = mysqli_fetch_assoc($result)){
echo '&pre&';
print_r($row);
//关闭数据库
mysqli_close($link);相比原生 MySQL API,面向过程化的MySQLi里的$link是不可以省略的,如果没有填写,会抛出一个警告。由上面代码也可以看出,面向过程化的MySQLi与原生 MySQL API基本一致。MySQLi面向对象MySQLi还支持面向对象编程,推荐使用。&?php
$db = array(
//mysqli对象化风格
//建立连接
$link = new mysqli($db['host'], $db['username'], $db['password'], $db['dbname'], $db['port']);
if ( $link -& connect_error ) {
die( 'Connect Error ('
$link -& connect_errno
$link -& connect_error );
//选择数据库
//$link-&select_db($link, $db['dbname']);
//设置字符集
$link-&set_charset($db['charset']);
= $link-&query('select * from user') or die($link-&errno . ':' .$link-&error);
//取得结果集中行的数目
echo $num_rows
$result-&num_rows .'&br/&'; //14
$insert_sql = sprintf("insert into user(name,gender,age) values('%s', '%d', '%d')", 'test', 1, 22);
$link-&query($insert_sql);
echo $affected_rows = $link-&affected_rows .'&br/&'; //1
echo $id = $link-&insert_id .'&br/&';
$link-&query(sprintf("update user set name = '%s' where id = %d", 'test2', 13));
echo $affected_rows = $link-&affected_rows .'&br/&'; //1
$link-&query(sprintf("delete from user where id = %d", 13));
echo $affected_rows = $link-&affected_rows .'&br/&'; //1
//遍历结果集
while ($row = $result-&fetch_assoc()){
echo '&pre&';
print_r($row);
/* 释放结果集 */
$link -& free ();
//关闭数据库
$link -& close();比较重要的是MySQLi类和mysqli_result类,前者用于发送查询,后者用于从结果集返回数据。使用PDO不管是使用原生的MySQL API,还是MySQLi,都还是有缺陷的。1、不支持事务机制;2、仅支持MySQL,不能使用其它数据库。3、不安全,可能有注入风险4、不支持异常处理PHP的PDO扩展巧妙的解决了这些问题。PDO使用dsn连接,支持众多类型的数据库,如mysql,postgresql,oracle,mssql等。PDO(php data object)扩展类库为php访问数据库定义了轻量级的、一致性的接口,它提供了一个数据库访问抽象层。这样,无论你使用什么数据库,都可以通过一致的函数执行查询和获取数据。PDO大大简化了数据库的操作并能够屏蔽不同数据库之间的差异,使用pdo可以很方便地进行跨数据库程序的开发,以及不同数据库间的移植,是将来php在数据库处理方面的主要发展方向。&?php
$db = array(
'dsn' =& 'mysql:host=dbname=port=3306;charset=utf8',
'host' =& 'localhost',
'port' =& '3306',
'dbname' =& 'test',
'username' =& 'root',
'password' =& '123456',
'charset' =& 'utf8',
$options = array(
PDO::ATTR_ERRMODE =& PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE =& PDO::FETCH_ASSOC,
$pdo = new PDO($db['dsn'], $db['username'], $db['password'], $options);
}catch(PDOException $e){
die('数据库连接失败:' . $e-&getMessage());
echo '&pre/&';
$stmt = $pdo-&query('select * from user limit 2');
$rows = $stmt-&fetchAll();
$row_count = $stmt-&rowCount();
echo '&br&';
$stmt = $pdo-&prepare("select * from user where name = ? and age = ? ");
$stmt-&bindValue(1,'test');
$stmt-&bindValue(2,22);
$stmt-&execute();
$rows = $stmt-&fetchAll();
print_r($rows);
$stmt = $pdo-&prepare("insert into user(name,gender,age)values(?,?,?)");
$stmt-&bindParam(1, $name);
$stmt-&bindParam(2, $gender);
$stmt-&bindParam(3, $age);
$data = array(
array('t1', 1, 22),
array('t2', 2, 23),
foreach ($data as $vo){
list($name, $gender, $age) = $
$stmt-&execute();
}pdo::query()方法当执行返回结果集的select查询时,或者所影响的行数无关紧要时,应当使用pdo对象中的query()方法.如果该方法成功执行指定的查询,则返回一个PDOStatement对象.如果使用了query()方法,并想了解获取数据行总数,可以使用PDOStatement对象中的rowCount()方法获取.pdo::exec()方法当执行insert,update,delete没有结果集的查询时,使用pdo对象中的exec()方法去执行.该方法成功执行时,将返回受影响的行数.注意,该方法不能用于select查询.PDO事务:$pdo-&beginTransaction();
$pdo-&commit();
}catch(PDOException $e){
$pdo-&rollBack();
本文章共有0条评论一帖让PHP小白彻底了解PDO操作数据库的方法 - 简书
一帖让PHP小白彻底了解PDO操作数据库的方法
php与mysql的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO) 。在这三种方法中,“民间”很多是倾向于使用PDO,因为其不担有跨库(可以和各个数据库连接和处理)的优点,更有读写速度快的特点。 PDO不仅能防止了sql注入问题,同时是面向对象的,所以不管操作还是使用都是挺方便的!今天分享下PHP5中使用PDO操作数据库的方法!
PDO(PHP Data Object) 是PHP 5 中加入的东西,是PHP 5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的连接和处理,什么 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等。 PHP6中也将默认使用PDO的方式连接。
PHP.ini中,去掉"extension=php_pdo.dll"前面的";"号,若要连接数据库,还需要去掉与PDO相关的数据库扩展前面的";"号,然后重启Apache服务器即可。
extension=php_pdo.dllextension=php_pdo_mysql.dllextension=php_pdo_pgsql.dllextension=php_pdo_sqlite.dllextension=php_pdo_mssql.dllextension=php_pdo_odbc.dllextension=php_pdo_firebird.dll......
3.PDO连接mysql数据库
new PDO("mysql:host=dbname=db_demo","root",""); 默认不是长连接,若要使用数据库长连接,需要在最后加如下参数:new PDO("mysql:host=dbname=db_demo","root","","array(PDO::ATTR_PERSISTENT =& true) ");
4.PDO常用方法及其应用
PDO::query() 主要是用于有记录结果返回的操作,特别是SELECT操作PDO::exec() 主要是针对没有结果集合返回的操作,如INSERT、UPDATE等操作PDO::lastInsertId() 返回上次插入操作,主键列类型是自增的最后的自增IDPDOStatement::fetch() 是用来获取一条记录PDOStatement::fetchAll() 是获取所有记录集到一个中
5.PDO操作MYSQL数据库实例
&?php$pdo = new PDO("mysql:host=dbname=db_demo","root","");if($pdo -& exec("insert into db_demo(name,content) values('title','content')")){echo "插入成功!";echo $pdo -& lastinsertid();}?&
&?php$pdo = new PDO("mysql:host=dbname=db_demo","root","");$rs = $pdo -& query("select * from test");while($row = $rs -& fetch()){print_r($row);}?&[ Laravel 5.1 文档 ] 数据库 —— 起步
这篇文章对我很有帮助
这篇文章对我很有帮助
学院君 has written
资深PHP工程师,Laravel学院院长
Laravel 5.1为什么你应该使用PHP PDO访问数据库
我的图书馆
为什么你应该使用PHP PDO访问数据库
为什么你应该使用PHP PDO访问数据库许多PHP程序员学习过如歌使用MySQL或MySQL扩展来访问数据库. 不过,自PHP 5.1版本以来,一个更好的解决方案出现了. PHP Data Objects (PDO) 提供了让你更有{productive}的准备{statements},处理对象的方法.PDO 简介“PDO – PHP Data Objects – is a database access layer providing a uniform method of access to multiple databases.”它不受数据库特定语法限制, 但它可以让切换数据库和平台的过程更无痛,更简洁的切换数据库连接字符串.这个教程并是一个完全的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 )所有这些驱动都没有被您的系统预装,这里有一种快速的方式来找到您需要的驱动:print_r(PDO::getAvailableDrivers());连接不同的数据库可能在连接方法上有那么一点点的不同. 下面,我们将介绍几种常见的数据库的连接方法. 你将会注意到前三种看起来差不多, 不过像SQLite之类的语言就有他自己独特的语法.try {# MS SQL Server and Sybase with PDO_DBLIB$DBH = new PDO(“mssql:host=$dbname=$dbname, $user, $pass”);$DBH = new PDO(“sybase:host=$dbname=$dbname, $user, $pass”);# MySQL with PDO_MYSQL$DBH = new PDO(“mysql:host=$dbname=$dbname”, $user, $pass);# SQLite Database$DBH = new PDO(“sqlite:my/database/path/database.db”);}catch(PDOException $e) {echo $e-&getMessage();}请注意try/catch代码块 – 您应该始终将您 PDO 的操作封装在一个 try/catch 代码块内并使用异常机制 .通常你只会使用单个连接 – 下面将为您介绍它的语法.下文中出现的 $DBH 意思是 ‘database handle’.你可以通过把handle设置为null来关闭任何数据库连接.# close the connection$DBH =你可以从 PHP.net 获取更多关于特点数据库的选项和连接字串(connection strings)的信息异常处理PDO 可以使用异常(Exceptions)来处理错误,这意味你需要把{处理PDO的}包括在一个try/catch代码块. 你也可以通过设置错误模式(error mode attribute)强制PDO在您最近创建的数据库连接上使用这三种错误模式中的一种. 以下提供了语法:$DBH-&setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );$DBH-&setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );$DBH-&setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );不过不管您设置什么错误模式, 错误的连接总会产生一个异常, 所以您应该在创建一个数据库时包含一个try/catch代码块.PDO::ERRMODE_SILENT这是默认的错误模式. 如果您使用了这种错误模式, 你将像您用mysql或mysqli扩展的时候那样自己检查错误. 这里还有两种更理想的符合[[DRY programming]]思想的方法.PDO::ERRMODE_WARNING这种模式将会发出(issue)一个标准的PHP warning,然后继续执行程序. 这种方法在调试时会很有用.PDO::ERRMODE_EXCEPTION这也许是人们在大多数情况下希望使用的模式. 它抛出(fire)一个异常, 允许你优雅的处理错误并且隐藏那些可能会导致安全风险的数据. 这里是一个处理异常的实例:# connect to the databasetry {$DBH = new PDO(“mysql:host=$dbname=$dbname”, $user, $pass);$DBH-&setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );# UH-OH! Typed DELECT instead of SELECT!$DBH-&prepare(‘DELECT name FROM people’);}catch(PDOException $e) {echo “I’m sorry, Dave. I’m afraid I can’t do that.”;file_put_contents(‘PDOErrors.txt’, $e-&getMessage(), FILE_APPEND);}上面是一个在select statement中的内部错误; 这将会引发一个异常. 这段异常处理代码将会把错误详情发送到一个日志文件中, 然后显示一个友好的(当然,友不友好随你便)消息给用户.插入、更新数据插入新数据、或更新一个已经存在的数据,是最常见的数据库操作之一. PDO提供了一种[[normally a two-step process]]. 本节中介绍的所有内容同样适用于 UPDATE 和 INSERT 操作.下面是一个最基本的插入的例子:# STH means “Statement Handle”$STH = $DBH-&prepare(“INSERT INTO folks ( first_name ) values ( ‘Cathy’ )”);$STH-&execute();您也可以直接使用exec()方法完成相同的操作(PS:使用exec()方法可以减少一个调用). 在大多数情况下,您可能会多次调用这个方法, 所以呢, 您可以享受到prepared statements带来的好处. 甚至如果您只想调用它一次, 使用prepared statements will 也会帮您挡住 SQL injection 攻击.Prepared Statements使用 prepared statements 将帮助您防止 SQL injection 的危险.Prepared statement的语句是只需要发送数据到服务器的预编译 SQL 语句, 它具有自动处理数据以免受 SQL injection 攻击的优点。您可以通过在您的SQL语句中包含占位符来使用 prepared statement . 这里有三个例子: 一个没有占位符的, 一个有未命名占位符(Unnamed Placeholders)的, 和一个有命名占位符(Named Placeholders)的.# no placeholders – ripe for SQL Injection!$STH = $DBH-&(“INSERT INTO folks (name, addr, city) values ($name, $addr, $city)”);# unnamed placeholders$STH = $DBH-&(“INSERT INTO folks (name, addr, city) values (?, ?, ?);# named placeholders$STH = $DBH-&(“INSERT INTO folks (name, addr, city) value (:name, :addr, :city)”);您可能想避免使用第一种方法; 下面为您提供了它们直接的比较. 选择未命名占位符或命名占位符将会影响您如何为这些语句设置数据.未命名占位符(Unnamed Placeholders)# assign variables to each place holder, indexed 1-3$STH-&bindParam(1, $name);$STH-&bindParam(2, $addr);$STH-&bindParam(3, $city);# insert one row$name = “Daniel”$addr = “1 Wicked Way”;$city = “Arlington Heights”;$STH-&execute();# insert another row with different values$name = “Steve”$addr = “5 Circle Drive”;$city = “Schaumburg”;$STH-&execute();只需两步!首先,我们为不同的占位符(Placeholder)绑定变量 (lines 2-4). 然后,我们为那些占位符(Placeholder)赋值然后执行查询. 要想发送另外的一组数据,只需要改变那些变量的值,然后再执行即可.(译注: 原文在第一步与第二布均使用了assign来描述过程)这个使用很多参数的方法似乎有点麻烦?如果您的数据存储在数组中,有一个简单的方法:# the data we want to insert$data = array(‘Cathy’, ’9 Dark and Twisty Road’, ‘Cardiff’);$STH = $DBH-&(“INSERT INTO folks (name, addr, city) values (?, ?, ?);$STH-&execute($data);这很简单,不是吗?在数组中的数据等同于占位符。 $data[0]对应第一个占位符,$data[1]第二个,依此类推,但如果您的数组索引并未排序,这将无法正常工作,您将需要重新索引这个数组.命名占位符(Named Placeholders)您可能已经猜到语法了,下面给出了一个例子:# the first argument is the named placeholder name – notice named# placeholders always start with a colon.$STH-&bindParam(‘:name’, $name);您也可以在这里使用一个快捷方式,但它可以和关联数组一起使用.# the data we want to insert$data = array( ‘name’ =& ‘Cathy’, ‘addr’ =& ’9 Dark and Twisty’, ‘city’ =& ‘Cardiff’ );# the shortcut!$STH = $DBH-&(“INSERT INTO folks (name, addr, city) value (:name, :addr, :city)”);$STH-&execute($data);你的数组中的键不需要以一个冒号开始,但是必须符合指定的占位符。如果你有一个二维数组(就是数组中的数组),您可以遍历它们,只需调用执行的每个数据的数组。另一个命名占位符不错的特点是直接可以插入对象到您的数据库,如果命名的属性匹配字段的话.下面是一个例子对象:# a simple objectclass person {public $public $public $function __construct($n,$a,$c) {$this-&name = $n;$this-&addr = $a;$this-&city = $c;}# etc …}$cathy = new person(‘Cathy’,’9 Dark and Twisty’,'Cardiff’);# here’s the fun part:$STH = $DBH-&(“INSERT INTO folks (name, addr, city) value (:name, :addr, :city)”);$STH-&execute((array)$cathy);在执行中,对象被转换为一个数组.对象的属性被视为数组中的一个键. By casting the object to an array in the execute, the properties are treated as array keys.选择数据数据通过fetch()方法获得, {一种应用于陈述式句柄的方法}. 在使用fetch之间, 您最好告诉PDO您喜欢取得数据的样子. 您有以下几个选择:PDO::FETCH_ASSOC:&返回一个包含列名索引的数组PDO::FETCH_BOTH (default):&返回一个由同时包含列名和数字索引的数组PDO::FETCH_BOUND: 通过 -&bindColumn() 方法将列的值赋到变量上。PDO::FETCH_CLASS:列的值赋给指定对象的属性里。如果指定的属性不存在,会自动创建。PDO::FETCH_INTO:&更新一个已经存在的命名对象的实例PDO::FETCH_LAZY:&结合 了PDO::FETCH_BOTH,PDO::FETCH_OBJ,在它们被调用时创建对象变量PDO::FETCH_NUM:&返回一个由同时包含列数字索引的数组PDO::FETCH_OBJ:&fanhuire返回一个有对应的列名的属性的匿名对象在现实中,大多数情况下会使用以下三种: FETCH_ASSOC, FETCH_CLASS, FETCH_OBJ. 您需要使用以下语法设置获取类型:$STH-&setFetchMode(PDO::FETCH_ASSOC);您也可以直接在fetch()方法中设置获取模式.FETCH_ASSOC这种模式创建一个按列名索引的关联数组.这应该会让用过MySQL/MySQLi扩展的人感到亲切.这里有一个使用这种方法选择数据的例子.# using the shortcut -&query() method here since there are no variable# values in the select statement.$STH = $DBH-&query(‘SELECT name, addr, city from folks’);# setting the fetch mode$STH-&setFetchMode(PDO::FETCH_ASSOC);while($row = $STH-&fetch()) {echo $row['name'] . “n”;echo $row['addr'] . “n”;echo $row['city'] . “n”;}这个 while 循环将在获取完所有数据后停止.{The while loop will continue to go through the result set one row at a time until complete.}FETCH_OBJ这种模式为每一行数据创建一个标准类,下面是一个例子:# creating the statement$STH = $DBH-&query(‘SELECT name, addr, city from folks’);# setting the fetch mode$STH-&setFetchMode(PDO::FETCH_OBJ);# showing the resultswhile($row = $STH-&fetch()) {echo $row-&name . “n”;echo $row-&addr . “n”;echo $row-&city . “n”;}FETCH_CLASS您的对象的属性应该在constructor被调用前设置!这一点很重要!这种模式允许你直接将获取的数据发送到您选择的类中.当您使用FETCH_CLASS时,您的对象的属性应该在constructor被调用前设置。读一遍,它是重要的。如果属性相匹配的列名不存在,这些属性将被创建,(公共)为您。这意味着如果你需要转换后出来的数据,它可以通过你的对象自动为转换.举个列子,假设的情况下该地址必须为特定格式,我们可以通过constructor上做到这一点,下面是一个例子:class secret_person {public $public $public $public $other_function __construct($other = ”) {$this-&address = preg_replace(‘/[a-z]/’, ‘x’, $this-&address);$this-&other_data = $}}OK,再让我们看看效果如何?$STH = $DBH-&query(‘SELECT name, addr, city from folks’);$STH-&setFetchMode(PDO::FETCH_CLASS, ‘secret_person’);while($obj = $STH-&fetch()) {echo $obj-&}如果地址是,‘5 Rosebud,’ 您将会在输出中看到 ‘5 Rxxxxxx’. 当然,可能有些情况下,您希望在constructor函数在数据被赋值之前调用.PDO也可以做到~$STH-&setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, ‘secret_person’);现在,当你使用这个模式(PDO::FETCH_PROPS_LATE)的地址不会被遮,constructor会被首先调用然后再赋值.最后,如果你真的需要,你可以在使用PDO获取数据到对象时,将参数传递给构造函数:$STH-&setFetchMode(PDO::FETCH_CLASS, ‘secret_person’, array(‘stuff’));如果你需要传递不同的数据到每个对象的构造函数,你可以设置在fetch方法内设置模式法模式:$i = 0;while($rowObj = $STH-&fetch(PDO::FETCH_CLASS, ‘secret_person’, array($i))) {// do stuff$i++}其他有用的方法虽然 PDO 并没有面面俱到的(这扩展可不小!), 这里仍还还有一些您想知道的方法.$DBH-&lastInsertId();lastInsertId()方法始终调用数据库句柄,而不是表达式的句柄,并且会返回该数据库连接上一次插入语句的自增ID.$DBH-&exec(‘DELETE FROM folks WHERE 1′);$DBH-&exec(“SET time_zone = &#′”);exec()方法用于那些不能返回数据或不影响行的操作. 上面是两种调用exec()方法的例子.$safe = $DBH-&quote($unsafe);quote() 方法将字符转义为安全的字符以便在查询中使用. 如果您不使用已经准备号的语句,您可以用此方法&&*&&。$rows_affected = $STH-&rowCount();rowCount() 方法返回一个表明被一个操作影响的行数的整数(简直是废话,难不成还是浮点数?). 更具这个错误报告(http://bugs.php.net/40822) ,在最近的一个PDO版本上这个方法不能够很好的与SELECT语句工作. 如果您遇到了这个问题而不想升级PHP的话, 你可以用以下的方法来替代它:$sql = “SELECT COUNT(*) FROM folks”;if ($STH = $DBH-&query($sql)) {# check the row countif ($STH-&fetchColumn() & 0) {# issue a real select here, because there’s data!}else {echo “No rows matched the query.”;}}结尾我希望这篇文章能帮助您从mysql和mysqli扩展迁移至PDO.您有啥想法?现在想迁移到PDO么?英文原文:/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/原创文章,转载请注明来源并保留原文链接&本文链接:
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 数据库表之间的关系 的文章

 

随机推荐