ADODB 入门(二)

 

9. 取出记录(Select)

Select 的用法如下:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 不侦错
$conn->debug=false;

// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 执行 Select 由表格 t 取出数据,
// 它会传回一个 ADORecordSet 记录集对象 $rs (RecordSet)
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录(row 或称 record),
// 该记录的所有字段数据的内容,存放在 fields 这个数组之中
// ,以数字为索引,第一个由 0 开始
$rs = &$conn->Execute('select * from t');

// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
    print $conn->ErrorMsg();
} else {

// 当尚未到达 记录集 $rs 的结束位置(EOF:End Of File)时,(即:还有记录尚未取出时)
    while (!$rs->EOF) {
        // 秀出所有字段,$FieldCount() 会传回字段总数
    for ($i=0, $max=$rs->FieldCount(); $i < $max; $i++) {
        print $rs->fields[$i] . " ";
    }

        // 移至下一笔记录
    $rs->MoveNext();
   
    // 换列
    echo "<br>/n";
    }
}

$rs->Close(); // 可不用
$conn->Close(); // 可不用
?>


$rs->fields[] 数组是由 PHP 的数据库扩展功能产生的,某些扩展功能并不支持使用字段名称当作索引。

若欲使用名称当作索引,也就是俗称的 hash 或 associative arrays,则需使用全域变量 $ADODB_FETCH_MODE 加以指定。

以下设定:使用数字索引 $ADODB_FETCH_MODE= ADODB_FETCH_NUM;


以下设定:使用名称索引 $ADODB_FETCH_MODE= ADODB_FETCH_ASSOC;


下面是使用名称索引的例子:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 不侦错
$conn->debug=false;

// DSN 四项基本数据设定
$mch="localhost";
$user="root";
$pwd="jack168";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 执行 sql 之前,指定使用名称索引
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;

// 执行 Select,它会传回一个 ADORecordSet 记录集对象 $rs
// 实际上 $rs 是一个 cursor 指标,它拥有目前的记录内容,
// 该记录存放在 fields 这个数组之中
$rs = &$conn->Execute('select * from t');

// 若 $rs 为 false,则秀出错误讯息
if (!$rs) {
    print $conn->ErrorMsg();
} else {

// 当尚未到达记录集结束位置(EOF)时,
    while (!$rs->EOF) {
        // 秀出所有字段

    print $rs->fields['name'] . " " . $rs->fields['year'];

        // 移至下一笔记录
    $rs->MoveNext();
   
    // 换列
    echo "<br>/n";
    }
}

$rs->Close();  // 可不用
$conn->Close(); // 可不用
?>

10. 取出记录(使用 FetchRow)

这里示范 FetchRow 的用法:

$sql = "select * from t";

$rs = $conn->Execute($sql);

if ($rs) {
    while( $ar = $rs->FetchRow() ) {
        print $ar['name'] ." " . $ar['year'];
        print "<br>/n";
    }

}


FetchRow() 会将取出的记录传回,您可用一个 array 来接取。

注意 ! 使用 FetchRow() 就不必再用 MoveNext(),FetchRow 内部会自动完成移至下一笔记录的动作。

11. 更新记录(Update)

您可以用传统的方式:

$sql ="UPDATE t SET name='john', year=28 WHERE year=18";
$conn->Execute($sql);


也可以用以下这种方式:

<?php

// 引入 ADODB
include('adodb/adodb.inc.php');

// 建立联机对象
$conn = &ADONewConnection('mysql');

// 侦错
$conn->debug=true;

// DSN 四项基本数据设定
$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

// 连接至数据库 test
$conn->PConnect($mch, $user, $pwd, $database);

// 选择要更新的那一笔记录
$sql = "select * from t where year=18";

$rs = $conn->Execute($sql);


// 用一个空数组来装要更新的数据
$r = array();

$r['name']='john';
$r['year']=28;

// 用 GetUpdateSQL 函式来制作一个完整的 sql 命令,此 sql 命令放在 $updateSQL 中
$updateSQL = $conn->GetUpdateSQL($rs, $r);

// 执行更新
$conn->Execute($updateSQL);

$conn->Close();
?>


侦错讯息如下:

-------------------------------------------------------------
(mysql): select * from t where year=18
-------------------------------------------------------------
(mysql): UPDATE t SET name = 'john', year = 28 WHERE year=18
-------------------------------------------------------------

12. 删除记录(Delete)

删除记录很简单,采传统方式即可: $sql = "DELETE FROM t WHERE year=18";

$rs = $conn->Execute($sql);

13. 使用字段对象(Field Objects)

这里示范字段对象 FetchField 的用法,用以取得字段名称及字段型态:

$sql = "select * from t";

$rs = &$conn->Execute($sql);

if ($rs) {
   while (!$rs->EOF) {
    // 取出第二个字段
    $f = $rs->FetchField(1);

    // 印出字段名称 及 字段型态
    print $f->name . ":" . $f->type;

    $rs->MoveNext();

    print "<br>/n";
   }
}
 

另外,ADODB 提供一个 RecordSet 函式 MetaType(),可将原始的字段型态转成一般型态代码:

C : 字符
X : text
B : blob
D : 日期
T : timestamp
L : 布尔值或位
I : 整数
N : 数字型态,包括:自动增加、数值、浮点数、实数及整数
R : serial、自动增加


用例: 

    $f = $rs->FetchField(1);

    // 印出字段名称 及 字段型态的代码
    print $f->name . ":" . $rs->MetaType($f->type);

14. 简单分页(Pager)

ADODB 提供一种简单分页显示记录的方法,使用前,要将 adodb-pager.inc.php 引入。

<?php

include('adodb/adodb.inc.php');

// 引入分页功能
include('adodb/adodb-pager.inc.php');

// 启动 session
session_start();

$db = ADONewConnection('mysql');

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$db->Connect($mch, $user, $pwd, $database);

$sql = "select * from t";

// 产生 pager 对象
$pager = new ADODB_Pager($db, $sql);

// 每一页秀 5 笔记录
$pager->Render($rows_per_page=5);

?>


结果如下:

Figure 1. 简单分页功能


每页显示记录的数目是由 Render() 来控制的,若没有传入指定的 row 数给 Render(),默认值每页秀 10 笔。

另外,字段名称也可以改变,如下示范:

<?php

include('adodb/adodb.inc.php');

// 引入分页功能
include('adodb/adodb-pager.inc.php');

// 启动 session
session_start();

$db = ADONewConnection('mysql');

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$db->Connect($mch, $user, $pwd, $database);

$sql = "select name as '姓名', year as '年纪' from t";

// 产生 pager 对象
$pager = new ADODB_Pager($db, $sql);

// 每一页秀 5 笔记录
$pager->Render($rows_per_page=5);
?>


结果如下:

Figure 2. 改变字段名称


15. 输出 CSV 档

ADODB 提供输出 CSV 档的方法,使用前,要将 toexport.inc.php 引入。

<?php

include('adodb/adodb.inc.php');

// 引入输出 CSV 文件功能
include('adodb/toexport.inc.php');

$db = ADONewConnection('mysql');

$mch="localhost";
$user="piza";
$pwd="ooo123";
$database="test";

$db->Connect($mch, $user, $pwd, $database);

$sql = "select name as '姓名', year as '年纪' from t";

$rs = $db->Execute($sql);

// 秀出 CSV 格式
print rs2csv($rs);
?>


结果如下:

姓名,年纪
abcde,45
yyy,20
ppp,34
mmm,13
hhh,41
rrr,65
kkk,29
miso,154
sss,89
abc,18
abcde,0
uyt,58
john,28


也可用 tab 分隔字段,使用 rs2tab 方法如下:

print rs2tab($rs, false);

注: false 表示不显示字段名称

结果如下:

abcde  45
yyy    20
ppp    34
mmm    13
hhh    41
rrr    65
kkk    29
miso   154
sss    89
abc    18
abcde  0
uyt    58
john   28

若是 print rs2tab($rs, true);
结果如下:

姓名    年纪
abcde   45
yyy     20
ppp     34
mmm     13
hhh     41
rrr     65
kkk     29
miso    154
sss     89
abc     18
abcde   0
uyt     58
john    28


也可以将结果由标准输出(STDOUT)显示,使用 rs2tabout 方法如下:

print rs2tabout($rs);


执行结果如下:

Figure 1. 在console中显示结果


也可以存成 CSV 档:

// 档案路径
$path = "/tmp/test.csv";

// 开档供写入
$fhd = fopen($path, "w");

// 若开档成功
if ($fhd) {

   // 则写入 CSV
   rs2csvfile($rs, $fhd);

   // 也可以使用 rs2tabfile($rs, $fhd);

   // 关档
   fclose($fhd);
}

结果如下:

[ols3@p web]$ cat /tmp/test.csv
姓名,年纪
abcde,45
yyy,20
ppp,34
mmm,13
hhh,41
rrr,65
kkk,29
miso,154
sss,89
abc,18
abcde,0
uyt,58
john,28

16. 取出一定笔数的记录 (使用 SelectLimit)

ADODB 提供一个 ADOConnect 函式 SelectLimit,可供您取出一定笔数的记录,用法如下:

$conn->Connect($mch, $user, $pwd, $database);

rs = $conn->SelectLimit("Select * from t", 3, 1);
//                             取出 3 笔、在第 1 笔之后

// 秀出这 3 笔记录
if ($rs) {
    while( $ar = $rs->FetchRow() ) {
        print $ar['name'] ." " . $ar['year'];
        print "<br>/n";
    }

}


上式是说:在第 1 笔记录之后,取出 3 笔,也就是第 2、3、4 笔记录。

结果如下:

--------------------------------------
(mysql): select * from t LIMIT 1,3
--------------------------------------

注意 ! SelectLimit 的写法刚好和 MySQL 语法相反 !

17. 结语

本讲义,主要是为:有心参与 SFS3 (sfs.wpes.tcc.edu.tw) 计划的伙伴们而写的。做为一份入门文件,以上这些介绍,应该是足够让您了解 ADODB 并且能把它应用在 SFS3 或其它有意义的地方了吧?若果真如此,小弟就心满意足了 !

ref. 参考资源

ADODB 网站

ADODB 手册

PHP 对象导向入门

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值