--PDO的含义
PDO是PhP Date Object的简称,它是一个数据库访问抽象层,可以访问各种数据库。以后发展趋势是使用统一的接口替代各种单独的模块。
PDO借助于驱动,连接各个数据库。
--安装PDO (windows下)
版本要求:
php5.1以及以后版本的程序包里已经带了;
php5.0.x则要到pecl.php.net下载,放到你的扩展库,就是PHP所在的文件夹的ext文件夹下;
手册上说5.0之前的版本不能运行PDO扩展。
配置:
修改你的php.ini配置文件,使它支持pdo.(php.ini这个东西没有弄懂的话,先弄清楚,要修改调用你的phpinfo()函数所显示的那个php.ini)
把
extension=php_pdo.dll前面的分号去掉,‘;’是php配置文件注释符号,这个扩展是必须的。
往下还有:
;extension=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;extension=php_pdo_mssql.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
各个扩展所对应的数据库是:
Driver name
Supported databases
PDO_DBLIB
FreeTDS / Microsoft SQL Server / Sybase
PDO_FIREBIRD
Firebird/Interbase 6
PDO_INFORMIX
IBM Informix Dynamic Server
PDO_MYSQL
MySQL 3.x/4.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相关的类
PDO有3个类:
PDO类,与数据库连接,数据库执行相关。
PDOStatement类,预处理类,处理结果集类。
PDOException类,处理异常。
PDO的方法比mysqli少,但实现的功能一样。要使用好PDO,需要用好PDO中的常量。
----------------PDO类----------------
--PDO中连接MySQL(或其他DBMS),选择数据库
PDO连接数据库的方法:创建一个PDO对象,在构造函数中连接MySQL。
classPDO {
PDO __construct ( string dsn [, string username [, string password [, arraydriver_options]]] )
}
dsn(data source name)数据源名,包含主机位置,数据库名,所连接的哪种数据库的驱动名。在PDO所支持的各个驱动里面有dsn的详细说明,比如mysql的驱动,他的dsn是:
The PDO_MYSQL Data Source Name (DSN) is composed of the following elements:
DSN prefix
The DSN prefix is mysql:.
host
The hostname on which the database server resides.
port
The port number where the database server is listening.
dbname
The name of the database.
unix_socket
The MySQL Unix socket (shouldn't be used with host orport).
举例:
$pdo=newPDO("mysql:host=localhost;port=3307;dbname=testdb","root","123456");
红色的部分就是dsn,驱动是mysql,主机位置是localhost,端口是3307,数据库名是testdb。
数据库连接的例子:
$dbms='mysql';//数据库类型mysql对于开发者来说,使用不同的数据库,只要改这个,不用记住那么多的函数了
$host='localhost';//数据库主机名
$dbName='test';//使用的数据库
$user='root';//数据库连接用户名
$pass='';//对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";
//
try {
$dbh=newPDO($dsn,$user,$pass);//初始化一个PDO对象,就是创建了数据库连接对象$dbh
echo"连接成功
";
/*你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from FOO') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
*/
$dbh= null;
} catch (PDOException $e) {
die("Error!: ".$e->getMessage() ."
");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT => true));
参考:http://www.phpv.net/html/1579.html
--预定义常量
PDO中的成员函数没有mysqli那么多,主要因为它有很多预定义常量,借助于预定义常量一个函数可以完成许多功能。如:使用PDO::ATTR_SERVER_VERSION,PDO::ATTR_SERVER_INFO可以用getAttribute(int attribute)获得服务器版本,服务器信息。这些信息保存在成员属性中。
--读取成员属性
借助预定义常量,向
向classPDO {
mixed getAttribute ( int attribute )
}
函数传值,可以获得成员属性,获取如服务器版本,服务器信息等信息。
--设置成员属性
借助预定义常量,向
classPDO {
bool setAttribute ( int attribute, mixed value )
}
函数传值,可以设置成员属性。
--PDO的执行语句
PDO有3个方法执行SQL语句:exec(),query(),prepare()。
exec()用来执行能影响行数的语句。如update,delete语句。
query()用来执行有返回结果集的语句。如SELECT语句。
prepare()执行预处理语句。
--exec()语句
class PDO {
intexec( string statement )
}
用来执行能影响行数的语句,返回影响的行数。statement为SQL语句。
--获取自动增长的ID
classPDO {
string lastInsertId ( [string name] )
}
参数name指出了哪个列应该被返回,如果数据库只有1个自动增长的列,该参数可以省略。
--query()语句
classPDO {
PDOStatement query ( string statement )
}
返回预处理对象。
--PDO处理预处理
确定是否为InnoDB表(MYISAM不支持事务处理)。
首先在建立PDO对象,或者使用setattribute(int attribute)方法,关闭自动提交。
使用PDO方法beginTransaction()开启事务处理。
classPDO {
bool beginTransaction ( void )
}
在try{}中包含事务语句,如果任何一条语句出错,则抛出异常,跳转到catch。在每条SELECT语句后判断是否影响到行数,如果没有影响到1行,则抛出异常。
在try{}的最后1句,使用PDO方法commit(),提交事务;
在catch(){}中包含异常处理语句,处理异常。
使用setattribute(int attribute)方法,开启自动提交。
----------------PDOStatement类----------------
--PDOStatement类的作用
准备一个语句。
处理结果集。
预处理类执行SQL的效率高,安全性高,是推荐使用的方法。
--获得预处理对象
classPDO {
PDOStatement prepare ( string statement [, arraydriver_options] )
}
使用PDO对象的prepare(string statement)方法,获得预处理对象。statement是SQL语句。执行完该方法,在数据库端就已经接受到SQL语句并编译完成,等待分配数据。
--PDOStatement中的占位符
索引形式的:'?参数',此占位符按索引顺序使用。
关联形式的:'名字参数',此占位符与顺序无关。
名字参数的格式是 ':参数名称'(冒号+参数名称)
--绑定参数
使用PDOStatement中的bindParam(mixed parameter)方法,绑定参数。
classPDOStatement {
bool bindParam ( mixed parameter, mixed &variable [, int data_type
[, int length [, mixed driver_options]]] )
}
例如:
$sth->bindParam(':calories', $calo);
sth是PDOStatement类的对象,$calo是用于绑定的变量,:calories是prepare所准备的参数。每次只绑定一个变量。有几个参数需要绑定,就执行几次bindParam(mixed parameter,mixed $variable)。
--执行准备语句
使用PDOStatement中的execute()方法,执行准备语句。
classPDOStatement {
bool execute ( [arrayinput_parameters] )
}
成功返回true,失败返回false。
如果在前面绑定了参数,execute的参数为空。
如果前面没有绑定参数,也可以在execute里面的数组放参数对应关系,形式如下:
$sth=$dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories
$sth->execute(array(':calories'=>$calories,':colour'=>$colour));
甚至可以把表单中的变量名字起成参数名,然后直接execute($_POST)
--获取结果集
使用PDOStatement中的fetch([int fetch_style [, int cursor_orientation [, int cursor_offset]]] )方法,获取结果集中的1行。
classPDOStatement {
mixed fetch ( [int fetch_style [, int cursor_orientation [, int cursor_offset]]] )
}
成功返回true,失败返回false,常配合while()使用。
默认情况下以关联数组、索引数组两种方式返回数据,可以通过在参数中设置返回方式:
如果参数为PDO::FETCH_ASSOC,只返回关联数组;
如果参数为PDO::FETCH_NUM,返回索引数组;
如果参数为PDO::FETCH_BOTH,两种都返回(默认方式)
可以使用PDOStatement中的setFetchMode()方法,设置获取模式,这样不用在每个fetch()函数中设置了。
classPDOStatement {
bool setFetchMode ( int PDO::FETCH_CLASS, string classname, arrayctorargs )
}
还可以使用PDOStatement中fetchAll([int fetch_style [, int column_index]] )方法,一次获取结果集的所有数据,以二维数组的方式返回。
--绑定列
使用PDOStatement的bindColumn ( mixed column, mixed ¶m [, int type] )方法绑定列,绑定列不影响绑定参数,实际上绑定列只是在结果集上绑定的(可以execute()后再绑定)。
classPDOStatement {
bool bindColumn ( mixed column, mixed ¶m [, int type] )
}
绑定的列可以用列名,也可以用列的序号,如下:
$sql='SELECT name, colour, calories FROM fruit';
try {
$stmt=$dbh->prepare($sql);
$stmt->execute();
/* Bind by column number */
$stmt->bindColumn(1,$name);
$stmt->bindColumn(2,$colour);
/* Bind by column name */
$stmt->bindColumn('calories',$cals);
while($row=$stmt->fetch(PDO::FETCH_BOUND)) {
$data=$name."\t".$colour."\t".$cals."\n";
print $data;
}
}
catch (PDOException $e) {
print $e->getMessage();
}
输出结果如下:
apple red 150
banana yellow 175
kiwi green 75
orange orange 150
mango red 200
strawberry red 25
--获取结果集行数
使用PDOStatement的rowCount(void)方法,可以获取结果集的行数。
classPDOStatement {
int rowCount ( void )
}
--获取字段数
使用PDOStatement的columnCount( void )方法,可以获取结果集的字段数。
classPDOStatement {
int columnCount ( void )
}
--获取字段信息
使用PDOStatement的getColumnMeta( int column )方法,可以获取字段信息。
classPDOStatement {
mixed getColumnMeta ( int column )
}
每次执行返回1个数组,包含某1列的信息,到最后1列返回false。