分享
 
 
 

PHP PEAR中Database(DB)使用介绍

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

DSN连接方式

DB目前支持的连接方式如下

最完整的格式:

phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value

别外还有一些缩写的格式:

phptype://username:password@protocol+hostspec:110//usr/db_file.db

phptype://username:password@hostspec/database

phptype://username:password@hostspec

phptype://username@hostspec

phptype://hostspec/database

phptype://hostspec

phptype:///database

phptype:///database?option=value&anotheroption=anothervalue

phptype(dbsyntax)

phptype

其中phptype表示数据库类型,可用的选项有:

dbase -> dBase

fbsql -> FrontBase

ibase -> InterBase

ifx -> Informix

msql -> Mini SQL

mssql -> Microsoft SQL Server

mysql -> MySQL (for MySQL <= 4.0)

mysqli -> MySQL (for MySQL >= 4.1) (since DB 1.6.3)

oci8 -> Oracle 7/8/9

odbc -> ODBC (Open Database Connectivity)

pgsql -> PostgreSQL

sqlite -> SQLite

sybase -> Sybase

以下是一些常用的连接例子:

l 连到一非标准端口的数据库

pgsql://user:pass@tcp(localhost:5555)/pear

l 通过SOCKET方式连到数据库

mysql://user@unix(/path/to/socket)/pear

l 在UNIX机上,连接SQLite数据库

sqlite:////full/unix/path/to/file.db?mode=0666

l 在Windows机上,连接SQLite数据库

sqlite:///c:/full/windows/path/to/file.db?mode=0666

l 使用SSL,连接到MySQLi

mysqli://user:pass@localhost/pear?key=client-key.pem&cert=client-cert.pem

l 通过ODBC连接到一个ACCESS数据库

odbc(access)://username:password@/datasourcename

DB连接实例

<?php

require_once 'DB.php';

$dsn = 'mysql://username:password@localhost/dbname';

/**

也可以用以下的方式

$dsn = array(

'phptype' => 'pgsql',

'username' => 'someuser',

'password' => 'apasswd',

'hostspec' => 'localhost',

'database' => 'thedb',

);

*/

//$options是可选的

$options = array(

'debug' => 2,

'portability' => DB_PORTABILITY_ALL,

);

$db =& DB::connect($dsn, $options);

if (DB::isError($db)) {

die($db->getMessage());

}

//设置数据库的默认查询方式

$db->setFetchMode(DB_FETCHMODE_ASSOC);

//执行一个普通的查询语句

$res =& $db->query('SELECT * FROM products');

//取得一个SQL查询的结果集行,列数

printf("共有%d行,%d列数据", $res->numRows(), $res->numCols());

//当前表的结构信息

echo ("<pre>");

print_r($db->tableInfo($res));

echo ("</pre>");

//执行一个带参数的查询

$sql = 'select * from products where products_id < ?';

$data = 50;

$res =& $db->query($sql, $data);

//执行含有多个参数的查询

$sql = 'select * from products where products_volt < ? and products_capacity > ?';

$data = array(10, 4000);

$res =& $db->query($sql, $data);

// 记得永远要检查执行的动作是否有错误

if (DB::isError($res)) {

die($res->getMessage());

}

//按默认方式DB_FETCHMODE_ORDERED,循环显示,输出结果,这种方式下,只能以序号的方式来访问数据字段

while ($row =& $res->fetchRow()) {

echo $row[0] . "<br />\n";

}

//按DB_FETCHMODE_ASSOC方式,循环显示,输出结果,这种方式下,以字段名称的方式来访问数据字段

while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {

echo $row['id'] . "\n";

}

//获取指定范围的行数据

$from = 50;

$resPage = 10;

$to = $from + $resPage;

foreach (range($from, $to) as $rowNum) {

if (!$row =& $res->fetchRow($fetchmode, $rowNum)) {

break;

}

echo $row[0] . "\n";

}

//释放资源

$res->free();

//通过getAll(),可以获取整个查询的结果集

$result = $db->getAll("select * from tablename");

//得到UPDATE/INSERT/DELETE等语句,所影响的行数

$db->query('DELETE * FROM clients');

echo 'I have deleted ' . $db->affectedRows() . ' clients';

//close database connection

$db->disconnect();

?>

Prepare/Execute使用详解

当要多次执行一组查询,只是有些参数不同时

INSERT INTO tle_name(col1, col2) VALUES(‘val1’, val2);

INSERT INTO tle_name(col1, col2) VALUES(‘val3’, val4);

……

或者你的语句要符合多个不同语法的数据库时db1: INSERT INTO tbl_name (col1, col2) VALUES (expr1, expr2)

db2: INSERT INTO tbl_name SET col1=expr1, col2=expr2

可以使用prepare/execute语句,以提供更好的兼容性和可扩展性能

使用prepare/execute语句,要分2个步骤

1. 用prepare()来准备SQL语句:

假设你有一个类似于这样的SQL语句

SELECT surname, name, age

FROM person

WHERE name = 'name_to_find' AND age < age_limit

使用prepare()时,你可以这样来写:

SELECT surname, name, age

FROM person

WHERE name = ? AND age < ?

其中的?类似于JSP或其它语言中的参数变量,类似的还有:

?(推荐)

标准的用来代替数字(或字符)型变量的参数,它可以自动地eacape或根据当前的DBMS系统的需要,来quoted数据

!

stands for a scalar value and will inserted into the statement "as is"

&

请求一个已经存在的文件,这个文件的内容将用于替换&,常用于保存二进制文件或图象内容到数据库中

2.execute() 把变量传递给prepare的SQL语句,然后执行它,execute()需要2个参数,一个是prepare()调用时指定的变量,另一个就是要传递给?的变量(可以用数组)

一个简单的例子

<?php

// 假设你已经有一个有效的数据库连接变量$db …

$sth = $db->prepare('INSERT INTO numbers (number) VALUES (?)');

$db->execute($sth, 1);

$db->execute($sth, 8);

?>

一个保存图象到数据库的例子

假设数据库中有一个test表,它的结构如下:

CREATE TABLE `test` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(100) default NULL,

`image` blob,

`description` text,

`note` text,

PRIMARY KEY (`id`)

) TYPE=MyISAM

insert.php

<?php

require_once 'DB.php';

$dsn = 'mysql://username:password@localhost/test';

$options = array(

'debug' => 2,

'portability' => DB_PORTABILITY_ALL,

);

$db =& DB::connect($dsn, $options);

if (DB::isError($db)) {

die($db->getMessage());

}

$db->setFetchMode(DB_FETCHMODE_ASSOC);

$sth = $db->prepare("INSERT test(name, image) VALUES(?, &)");

$db->execute($sth, array('jxyuhua', 'D://websamples//PEAR//Database//welcome.jpg'));

if (DB :: isError($db)) {

die($db->getMessage());

}

//$res->free();

$db->disconnect();

?>

存入数据库之后(注意内容大小的限制),你就可以再将内容取出来显示了

显示的例子

image.php

<?php

require_once 'DB.php';

$dsn = 'mysql://username:password@localhost/test';

$options = array(

'debug' => 2,

'portability' => DB_PORTABILITY_ALL,

);

$db =& DB::connect($dsn, $options);

if (DB::isError($db)) {

die($db->getMessage());

}

$db->setFetchMode(DB_FETCHMODE_ASSOC);

$res = $db->query("select image from test where name = ? order by name", $_REQUEST['name']);

if (DB :: isError($res)) {

die($res->getMessage());

}

while ($row = $res->fetchRow()) {

$data = $row['image'];

}

header("Content-type: image/jpeg"); //如果是其它的图象格式,如GIF,要做相应的更改image/gif

echo ($data);

$res->free();

$db->disconnect();

?>

DB允许你一次进行一组数据库操作,例如,你要一次性地插入/更新一批数据,

<?php

//假设数据库已经连接

$alldata = array(array(1, 'one', 'en'),

array(2, 'two', 'to'),

array(3, 'three', 'tre'),

array(4, 'four', 'fire'));

$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');

foreach ($alldata as $row) {

$db->execute($sth, $row);

}

?>

以上语句将执行等效于下面的SQL语句功能:

INSERT INTO numbers VALUES ('1', 'one', 'en')

INSERT INTO numbers VALUES ('2', 'two', 'to')

INSERT INTO numbers VALUES ('3', 'three', 'tre')

INSERT INTO numbers VALUES ('4', 'four', 'fire')

如果你想更省事一点,可以使用executeMultiple()

<?php

//假设数据库已经连接

$alldata = array(array(1, 'one', 'en'),

array(2, 'two', 'to'),

array(3, 'three', 'tre'),

array(4, 'four', 'fire'));

$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');

$db->executeMultiple($sth, $alldata);

?>

有没有这样的经历,当你在一个表中加了(或删除)一些字段之后,你原来的SQL语句就必须要重新写过,这样是不是很烦人?

例如,你有一个user表,它有3个字段(id, name, country),你以前的INSERT/UPDATE语句:

INSERT INTO user (id, name, country) VALUES (?, ?, ?)

UPDATE user SET id=?, name=?, country=? WHERE ...

当你增加了一个字段(假设是birthday)之后,你就必须重新你以前的INSERT/UPDATE语句,而这很有可能会导至BUG的出现(假设你漏改了某些地方).

现在让我们来看看怎样用autoPrepare()/autoExecute()来解决这个问题

1. autoPrepare()

用autoPrepare(),你不必列出INSERT/UPDATE的详细语句,而只要指定它的基本信息

resource autoPrepare (string $table, array $table_fields, integer $mode = DB_AUTOQUERY_INSERT [, string $where = FALSE])

$table 表名

$table_fields 要进行操作的字段名列表(数组类型)

$mode (DB_AUTOQUERY_INSERT || DB_AUTOQUERY_UPDATE)

$where WHERE语句,用于过滤数据

<?php

// 假设你已经有一个有效的数据库连接变量$db …

$table_name = 'user';

$table_fields = array('id', 'name', 'country');

$sth = $db->autoPrepare($table_name, $table_fields,

DB_AUTOQUERY_INSERT);

if (DB::isError($sth)) {

die($sth->getMessage());

}

$table_values = array(1, 'Fabien', 'France');

$res =& $db->execute($sth, $table_values);

if (DB::isError($res)) {

die($res->getMessage());

}

?>

在这个例子中,autoPrepare()会把它自动翻译成

INSERT INTO user (id, name, country) VALUES (?, ?, ?)

然后再自动调用prepare()

注意:如果你使用DB_AUTOQUERY_UPDATE, 记得指定$where条件,否则将更新所有的数据.

2.autoExecute()

autoExecute()是autoPrepare()和execute()的混合体,它可以方便地执行INSERT/UPDATE

DB_Result autoExecute (string $table, array $fields_values [, integer $mode = DB_AUTOQUERY_INSERT [, string $where = FALSE]])

$table 表名

$table_fields 要进行操作的字段名列表(数组类型)

$mode (DB_AUTOQUERY_INSERT || DB_AUTOQUERY_UPDATE)

$where WHERE语句,用于过滤数据

<?php

// 假设你已经有一个有效的数据库连接变量$db …

$table_name = 'user';

$fields_values = array(

'id' => 1,

'name' => 'Fabien',

'country' => 'France'

);

$res = $db->autoExecute($table_name, $fields_values,

DB_AUTOQUERY_INSERT);

if (DB::isError($res)) {

die($res->getMessage());

}

?>

它执行等效于下面的语句

INSERT INTO user (id, name, country) VALUES (1, 'Fabien', 'France')

是不是很方便?简直帅呆了!

注意:如果你使用DB_AUTOQUERY_UPDATE, 记得指定$where条件,否则将更新所有的数据.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有