PHP PEAR中Database(DB)使用介绍

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() 把变量传递给prepareSQL语句,然后执行它,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条件,否则将更新所有的数据.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值