范例 1: Select 指令
任务:连结到 Access 的 Northwind DSN,然后在每一列显示头2个字段。(Northwind 北风数据库,在ODBC设定的DSN,是Access的标准范例数据库)
注意:另一个很有用的函数 SelectLimit 并没有在这个范例里使用,这个函数允许我们去限制显示的数据笔数。
<?
include('ADOdb.inc.php'); # 加载ADODB
$conn = &ADONewConnection('access'); # 建立一个连结
$conn->PConnect('northwind'); # 连结到 MS-Access 北风数据库
$recordSet = &$conn->Execute('select * from products');
if (!$recordSet)
print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
$recordSet->MoveNext();
}
$recordSet->Close(); # 选择性执行
$conn->Close(); # 选择性执行
?>
$ADODB_FETCH_MODE = ADODB_FETCH_NUM;
$rs1 = $db->Execute('select * from table');
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$rs2 = $db->Execute('select * from table');
print_r($rs1->fields); # shows array([0]=>'v0',[1] =>'v1')
print_r($rs2->fields); # shows array(['col1']=>'v0',['col2'] =>'v1')
要取得在被选到的记录笔数,你可以使用$recordSet->RecordCount()方法。注意,如果不能确定得到的记录笔数,会回传 -1 。
范例 2: 进阶的 Select 指令(使用 Field 对象)
任务:选取一个资料表,显示最前面的二栏。如果第二栏是一个日期或时间型态字段,将它格式化成US格式。
<?
include('ADOdb.inc.php');
$conn = &ADONewConnection('access');
$conn->PConnect('northwind');
$recordSet = &$conn->Execute('select CustomerID,OrderDate from Orders');
if (!$recordSet)
print $conn->ErrorMsg();
else
while (!$recordSet->EOF) {
$fld = $recordSet->FetchField(1);
$type = $recordSet->MetaType($fld->type);
if ( $type == 'D' || $type == 'T')
print $recordSet->fields[0].' '.
$recordSet->UserDate($recordSet->fields[1],'m/d/Y').'<BR>';
else
print $recordSet->fields[0].' '.$recordSet->fields[1].'<BR>';
$recordSet->MoveNext();
}
$recordSet->Close(); # optional
$conn->Close(); # optional
?>
在这个例子中,我们使用 FetchField() 函数来检查第二个字段的资料型别。这将会回传一个至少有三个字段的对象,字段说明如下:
· type: 字段的资料原生型别native field type of column
· max_length: 字段的最大长度,部份数据库像MySQL,并不回传字段的正确值,以这个例子而言,就会回传 -1 。
然后我们使用 MetaType() 去转换原生型别成通用型别,目前通用型别定义如下:
· C: character 字段,应该使用 <input type="text"> 标记来取值。
· X: 文字字段(Text) , 长文字字段,使用 <textarea> 标记来显示资料。
· B: Blob 字段或者大型的二位对象(像程序,图文件等)。
· N: 数字字段,包含自动进位、编号、整数、浮点数、实数等。
· R: 序列字段,包含了序列、自动增进整数,只对被选择的数据库作用。
范例 3: 新增
新增一笔记录到订单资料表,里面包含了日期和字符串,为了能被数据库正常存取,字符串必需校正,以避免部份标记字符。例如:有单引号的字符串,John's。
<?
include('ADOdb.inc.php'); # load code common to ADOdb
$conn = &ADONewConnection('access'); # create a connection
$conn->PConnect('northwind'); # connect to MS-Access, northwind dsn
$shipto = $conn->qstr("John's Old Shoppe");
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->DBDate(time()).",$shipto)";
if ($conn->Execute($sql) === false) {
print 'error inserting: '.$conn->ErrorMsg().'<BR>';
}
?>
观察 Execute 指令的错误处理。如果 Execute() 执行有错误发生时,会传回 False 值。而最后的错误讯息可以由 ErrorMsg() 来显示。
附记:php_track_errors旗标可以被激活,以便将错误讯息储存起来。
范例 4: 除错
<?
include('ADOdb.inc.php'); # load code common to ADOdb
$conn = &ADONewConnection('access'); # create a connection
$conn->PConnect('northwind'); # connect to MS-Access, northwind dsn
$shipto = $conn->qstr("John's Old Shoppe");
$sql = "insert into orders (customerID,EmployeeID,OrderDate,ShipName) ";
$sql .= "values ('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
$conn->debug = true;
if ($conn->Execute($sql) === false) print 'error inserting';
?>
范例 5: MySQL及选单
连结到MySQL数据库 agora ,并且从SQL命令中建立一个 <select> 选单,<option>的标题是第一个字段,回传值是第二个字段。
<?
include('ADOdb.inc.php'); # load code common to ADOdb
$conn = &ADONewConnection('mysql'); # create a connection
$conn->PConnect('localhost','userid','','agora');# connect to MySQL, agora db
$sql = 'select CustomerName, CustomerID from customers';
$rs = $conn->Execute($sql);
print $rs->GetMenu('GetCust','Mary Rosli');
?>
在 1.50 版以后的 ADODB 里,是使用公共变量 $ADODB_FETCH_MODE 来设定回传的数组是以编号或是关连式字符串做索引。
范例 6: 一次连结两个数据库
<?
include('ADOdb.inc.php'); # 加载 ADOdb
$conn1 = &ADONewConnection('mysql'); # 建立一个 mysql 连结
$conn2 = &ADONewConnection('oracle'); # 建立一个 oracle 连结
$conn1->PConnect($server, $userid, $password, $database);
$conn2->PConnect(false, $ora_userid, $ora_pwd, $tnsname);
$conn1->Execute('insert ...');
$conn2->Execute('update ...');
?>
范例 7: 产生 Update 及 Insert 的SQL指令
范例 8: 使用上一笔及下一笔实作卷动
我们使用HTTP取得 $next_page 变量,以追踪要跳去那一页并且储存目前页码在 session 变量 $curr_page 里。
我们呼叫连结对象的 PageExecute()函收去取得我们要的资料集,然后我们使用数据集的 AtFirstPage() 及 AtLastPage() 函数去决定是否显示下一页和上一页按钮。
<?php
include_once('ADOdb.inc.php');
include_once('tohtml.inc.php');
session_register('curr_page');
$db = NewADOConnection('mysql');
$db->Connect('localhost','root','','xphplens');
$num_of_rows_per_page = 10;
$sql = 'select * from products';
if (isset($HTTP_GET_VARS['next_page']))
$curr_page = $HTTP_GET_VARS['next_page'];
if (empty($curr_page)) $curr_page = 1; ## at first page
$rs = $db->PageExecute($sql, $num_of_rows_per_page, $curr_page);
if (!$rs) die('Query Failed');
if (!$rs->EOF && (!$rs->AtFirstPage() || !$rs->AtLastPage())) {
if (!$rs->AtFirstPage()) {
?>
<a href="<?php echo $PHPSELF,'?next_page=',$rs->AbsolutePage() - 1 ?>">Previous page</a>
<?php
}
if (!$rs->AtLastPage()) {
?>
<a href="<?php echo $PHPSELF,'?next_page=',$rs->AbsolutePage() + 1 ?>">Next page</a>
<?php
}
rs2html($rs);
}
?>
以上的程序代码可以在 testpaging.php 范例里找到。
使用自定错误处理及 PEAR_Error
引入了上述档案后(ADOdb-errorhandler.inc.php),当发生了下列的错误后,将会使得 trigger_error($errorstring,E_USER_ERROR)被呼叫。
1. Connect() 或 PConnect() 执行失败时。
2. 执行 SQL 指令的函数失败时,如 Execute() 或 SelectLimin() 。
如果你设定了 error_reporting(0) 的话,将不会有任何错误被显示。如果你设定了 error_reporting(E_ALL),那将会显示所有的错误讯息。
<?php
error_reporting(E_ALL); # 显示所有的错误讯息
include('ADOdb-errorhandler.inc.php');
include('ADOdb.inc.php');
include('tohtml.inc.php');
$c = NewADOConnection('mysql');
$c->PConnect('localhost','root','','northwind');
$rs=$c->Execute('select * from productsz'); #不正确的资料表 productsz');
if ($rs) $rs2html($rs);
?>
<?php
error_reporting(0); # 不显示任何的错误讯息
define('ADODB_ERROR_LOG_TYPE',3);
define('ADODB_ERROR_LOG_DEST','C:/errors.log');
include('ADOdb-errorhandler.inc.php');
include('ADOdb.inc.php');
include('tohtml.inc.php');
$c = NewADOConnection('mysql');
$c->PConnect('localhost','root','','northwind');
$rs=$c->Execute('select * from productsz'); ## 不正确的资料表 productsz
if ($rs) $rs2html($rs);
?>
(2001-10-28 14:20:38) mysql error: [1146: Table 'northwind.productsz' doesn't exist] in
EXECUTE("select * from productsz")
<?php
include('ADOdb-errorpear.inc.php');
include('ADOdb.inc.php');
include('tohtml.inc.php');
$c = NewADOConnection('mysql');
$c->PConnect('localhost','root','','northwind');
$rs=$c->Execute('select * from productsz'); #不正确的资料表 productsz');
if ($rs) $rs2html($rs);
else {
$e = ADODB_Pear_Error();
echo '<p>',$e->message(),'</p>';
}
?>
include('PEAR.php');
PEAR::setErrorHandling('PEAR_ERROR_DIE');
资料集快取
include('ADOdb.inc.php'); # 加载ADODB
$ADODB_CACHE_DIR = '/usr/ADODB_cache';
$conn = &ADONewConnection('mysql'); # 建立一个连结
$conn->PConnect('localhost','userid','','agora');# 连结到 MySQL, agora 数据库
$sql = 'select CustomerName, CustomerID from customers';
$rs = $conn->CacheExecute(15,$sql);
基于安全的考量,如果你要使用 $ADODB_CACHE_DIR,我们建议你将在 php.ini 里的 register_globals 设成 off。
$conn->Connect(...);
$conn->cacheSecs = 3600*24; // 快取24小时