php pdo sybase 例子,php学习_第16章_PDO操作数据库

--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 &param [, int type] )方法绑定列,绑定列不影响绑定参数,实际上绑定列只是在结果集上绑定的(可以execute()后再绑定)。

classPDOStatement {

bool bindColumn ( mixed column, mixed &param [, 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值