您的位置:首页 > 编程语言 > PHP开发

PHP连接数据库学习手册

2017-06-13 00:00 459 查看
摘要:版权声明:本文为博主原创或整理自网络,欢迎转载,转载请注明出处。范例1:Select指令任务:连结到Access的NorthwindDSN,然后在每一列显示头2个字段。(Northwind北风数据库,在ODBC设定的DSN,是Access的标准范例数据库)在这个范例中,我们建立一个ADOConnection对象,它代表了和数据库的连结。

版权声明:本文为博主原创或整理自网络,欢迎转载,转载请注明出处。

范例1:Select指令

任务:连结到Access的NorthwindDSN,然后在每一列显示头2个字段。(Northwind北风数据库,在ODBC设定的DSN,是Access的标准范例数据库)

在这个范例中,我们建立一个ADOConnection对象,它代表了和数据库的连结。连结是以PConnect函数来初始化的,然后会持续的连结着。任何时候我们要查询数据库时,我们就呼叫ADOConnection.Execute()函数,这将会回传一个ADORecordSet对象。事实上它只是一个指向在fields[]数组中,目前记录的指针,我们使用MoveNext()来在记录间移动。

注意:另一个很有用的函数SelectLimit并没有在这个范例里使用,这个函数允许我们去限制显示的数据笔数。

<?
include('ADOdb.inc.php');#加载ADODB
$conn=&ADONewConnection('access');#建立一个连结
$conn->PConnect('northwind');#连结到MS-Access北风数据库
$recordSet=&$conn->Execute('select*fromproducts');
if(!$recordSet)
print$conn->ErrorMsg();
else
while(!$recordSet->EOF){
print$recordSet->fields[0].''.$recordSet->fields[1].'<BR>';
$recordSet->MoveNext();
}

$recordSet->Close();#选择性执行
$conn->Close();#选择性执行

?>
在这个例子中,$recordSet回传了存在$recordSet->fields数组里,目前所指向的记录。以字段编号为索引,起始值为0。我们使用MoveNext()函数来移动到下一笔记录,当到了最后一笔时,EOF属性会被设定为true。当Execute()函数执行有错误时,会回传一个false值,而不是一个recordset对象。

$recordSet->fields[]数组是由PHP数据库扩充函数库所产生的。有一些数据库扩充函数库仅支持以编号来进行索引,而不支持以字段名为索引。要强迫使用字段名索引,也就是要使用关连式数组,请使用$ADODB_FETCH_MODE全域变量来设定。当一个数据集被Execute()或是SelectLimit()函数建立时,都会储存而且使用储如此类的设定模式。

$ADODB_FETCH_MODE=ADODB_FETCH_NUM;
$rs1=$db->Execute('select*fromtable');
$ADODB_FETCH_MODE=ADODB_FETCH_ASSOC;
$rs2=$db->Execute('select*fromtable');
print_r($rs1->fields);#showsarray([0]=>'v0',[1]=>'v1')
print_r($rs2->fields);#showsarray(['col1']=>'v0',['col2']=>'v1')
上面的范例说明,如果要以顺序来存取字段,就将$ADODB_FETCH_MODE的值设为ADODB_FETCH_NUM,要以关连式数组(以字段名)存取字段,就要将值设为ADODB_FETCH_ASSOC。

要取得在被选到的记录笔数,你可以使用$recordSet->RecordCount()方法。注意,如果不能确定得到的记录笔数,会回传-1。

范例2:进阶的Select指令(使用Field对象)

任务:选取一个资料表,显示最前面的二栏。如果第二栏是一个日期或时间型态字段,将它格式化成US格式。

<?
include('ADOdb.inc.php');
$conn=&ADONewConnection('access');
$conn->PConnect('northwind');
$recordSet=&$conn->Execute('selectCustomerID,OrderDatefromOrders');
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()函数来检查第二个字段的资料型别。这将会回传一个至少有三个字段的对象,字段说明如下:

·name:字段名

·type:字段的资料原生型别nativefieldtypeofcolumn

·max_length:字段的最大长度,部份数据库像MySQL,并不回传字段的正确值,以这个例子而言,就会回传-1。

然后我们使用MetaType()去转换原生型别成通用型别,目前通用型别定义如下:

·C:character字段,应该使用<inputtype="text">标记来取值。

·X:文字字段(Text),长文字字段,使用<textarea>标记来显示资料。

·B:Blob字段或者大型的二位对象(像程序,图文件等)。

·D:日期字段

·T:时间字段

·L:逻辑字段(真假值)或位字段

·N:数字字段,包含自动进位、编号、整数、浮点数、实数等。

·R:序列字段,包含了序列、自动增进整数,只对被选择的数据库作用。

如果对应型别是日期或时间,那你可以使用UserDate()函数来设定输出的日期格式。这个函数会转换PHPSQL日期字符串格式为使用者定义的格式。另一个使用MetaType()的时机是在进行SQL新增或更新指令时,资料格式验证用。

范例3:新增

新增一笔记录到订单资料表,里面包含了日期和字符串,为了能被数据库正常存取,字符串必需校正,以避免部份标记字符。例如:有单引号的字符串,John's。

<?
include('ADOdb.inc.php');#loadcodecommontoADOdb
$conn=&ADONewConnection('access');#createaconnection

$conn->PConnect('northwind');#connecttoMS-Access,northwinddsn
$shipto=$conn->qstr("John'sOldShoppe");

$sql="insertintoorders(customerID,EmployeeID,OrderDate,ShipName)";
$sql.="values('ANATR',2,".$conn->DBDate(time()).",$shipto)";

if($conn->Execute($sql)===false){
print'errorinserting:'.$conn->ErrorMsg().'<BR>';
}
?>
在这个范例中,我们看见了ADODB更进一步的日期及标点符号的处理方式。Unix日期时间标示(长整数)被DBDate()格式化成Access可以接受的格式,而带了缩写符号的John'sOldShoppe则被qstr()函数处理成John''sOldShoppe字符串,以被数据库合法存取。

观察Execute指令的错误处理。如果Execute()执行有错误发生时,会传回False值。而最后的错误讯息可以由ErrorMsg()来显示。

附记:php_track_errors旗标可以被激活,以便将错误讯息储存起来。

范例4:除错

<?
include('ADOdb.inc.php');#loadcodecommontoADOdb
$conn=&ADONewConnection('access');#createaconnection
$conn->PConnect('northwind');#connecttoMS-Access,northwinddsn
$shipto=$conn->qstr("John'sOldShoppe");
$sql="insertintoorders(customerID,EmployeeID,OrderDate,ShipName)";
$sql.="values('ANATR',2,".$conn->FormatDate(time()).",$shipto)";
$conn->debug=true;
if($conn->Execute($sql)===false)print'errorinserting';
?>
在上面的例子中,我们藉由设定debug=true来激活除错模式。这将会在执行指令时会先将SQL指令显示,并且会显示所有的错误讯息,而不需要去呼叫ErrorMsg()。显示资料集的部份,可以参考rs2html()范例。

其它的请参考自定错误处理的说明。

范例5:MySQL及选单

连结到MySQL数据库agora,并且从SQL命令中建立一个<select>选单,<option>的标题是第一个字段,回传值是第二个字段。

<?
include('ADOdb.inc.php');#loadcodecommontoADOdb
$conn=&ADONewConnection('mysql');#createaconnection
$conn->PConnect('localhost','userid','','agora');#connecttoMySQL,agoradb
$sql='selectCustomerName,CustomerIDfromcustomers';
$rs=$conn->Execute($sql);
print$rs->GetMenu('GetCust','MaryRosli');
?>
HerewedefineamenunamedGetCust,withthemenuoption'MaryRosli'selected.SeeGetMenu().Wealsohavefunctionsthatreturntherecordsetasanarray:GetArray(),andasanassociativearraywiththekeybeingthefirstcolumn:GetAssoc().

这里,我们定义了一个名为GetCust的选单,默认值是'MaryRosli'。相关说明请参考GetMenu()。我们也将资料集以数组回传的方式写在GetArray()方法里。而另外回传关系型数组的方法则使用GetAssoc(),其中第一个字段是这个字段的键值。

在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指令

ADODB1.31版起,新增了两个数据集函数:GetUpdateSQL()及GetInsertSQL()。这允许你在执行了像"SELECT*FROMtablequeryWHERE..."这样的查询函数后,建立一个$rs->fields复本,改变这些字段,然后自动产生出更新或是新增的SQL指令。

以下我们展示如何运用这些函数,我们将存取一个资料表,带有下列字段:(ID,FirstName,LastName,Created)。在这些函数被执行前,你需要藉由一个对资料表的查询指令(select)来初始化一个数据集。

<?
#==============================================
#GetUpdateSQL()及GetInsertSQL()范例码
#==============================================
include('ADOdb.inc.php');
include('tohtml.inc.php');

#==========================
#以下的程序代码测试新增状态

$sql="SELECT*FROMADOXYZWHEREid=-1";
#从数据库中查询出一个空的资料集

$conn=&ADONewConnection("mysql");#建立一个连结
$conn->debug=1;
$conn->PConnect("localhost","admin","","test");#连结到MySQL,数据库名称为test
$rs=$conn->Execute($sql);#执行查询,并取得一个空的资料集

$record=array();#初始化一个数组,以便存放记录资料供新增用

#设定记录中的字段值
$record["firstname"]="Bob";
$record["lastname"]="Smith";
$record["created"]=time();

#传入空的资料集及字段资料数组到GetInsertSQL函数中,以执行功能
#这个函数将会依传入的资料,回传一个全格式的INSERTSQL指令

$insertSQL=$conn->GetInsertSQL($rs,$record);

$conn->Execute($insertSQL);#将记录挿入数据库中

#==========================
#以下的程序代码测试更新状态

$sql="SELECT*FROMADOXYZWHEREid=1";
#选择一笔记录以便更新

$rs=$conn->Execute($sql);#执行这个查询,并取得一个存在的记录来更新

$record=array();#初始化一个数组,以存放要更新的数据

#设定字段里的值
$record["firstname"]="Caroline";
$record["lastname"]="Smith";#更新Caroline的姓由Miranda变成Smith

#传入这个只有单一记录的资料集以及含有资料的数组到GetUpdateSQL函数里
#函数将会回传一个具有正确WHERE条件的UPDATE(更新)SQL指令
$updateSQL=$conn->GetUpdateSQL($rs,$record);

$conn->Execute($updateSQL);#更新数据库中的记录
$conn->Close();
?>

范例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*fromproducts';

if(isset($HTTP_GET_VARS['next_page']))
$curr_page=$HTTP_GET_VARS['next_page'];
if(empty($curr_page))$curr_page=1;##atfirstpage

$rs=$db->PageExecute($sql,$num_of_rows_per_page,$curr_page);
if(!$rs)die('QueryFailed');

if(!$rs->EOF&&(!$rs->AtFirstPage()||!$rs->AtLastPage())){
if(!$rs->AtFirstPage()){
?>
<ahref="<?phpecho$PHPSELF,'?next_page=',$rs->AbsolutePage()-1?>">Previouspage</a>
<?php
}
if(!$rs->AtLastPage()){
?>
<ahref="<?phpecho$PHPSELF,'?next_page=',$rs->AbsolutePage()+1?>">Nextpage</a>
<?php
}
rs2html($rs);
}
?>
以上的程序代码可以在testpaging.php范例里找到。

使用自定错误处理及PEAR_Error

在之前的版本,你可以使用像$con->debug=true;这样的设定来进行除错。但在1.50版后,我们提供了另一种方法来处理错误状态。我们让工程师可以使用ADODB的自订错误处理程序功能。

ADODB提供了两种自订处理方式,你可以配合你的的需要而修订。第一个方法放在ADOdb-errorhandler.inc.php档案里。这让你可以使用标准的PHP函数err_reporting去控制要显示怎样的错误讯息及trigger_error去呼叫PHP预设的错误处理程序。

引入了上述档案后(ADOdb-errorhandler.inc.php),当发生了下列的错误后,将会使得trigger_error($errorstring,E_USER_ERROR)被呼叫。

1.Connect()或PConnect()执行失败时。

2.执行SQL指令的函数失败时,如Execute()或SelectLimin()。

3.GenID()进入了无限循环时。

这里的$errorstring变量是由ADODB所产生的。而且会包含了有用的除错讯息,类似于随后会建立的error.log资料。所以,为了要能正确提供除错讯息,你要在建立ADOConnection对象前,就把ADOdb-errorhandler.inc.php引入到程序代码中。

Ifyoudefineerror_reporting(0),noerrorswillbeshown.Ifyouseterror_reporting(E_ALL),allerrorswillbedisplayedonthescreen.

如果你设定了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*fromproductsz');#不正确的资料表productsz');
if($rs)$rs2html($rs);
?>
如果你要把错误讯息记录下来,你可以定义两个选择性常数ADODB_ERROR_LOG_TYPE,ADODB_ERROR_LOG_DEST。有关于ADODB_ERROR_LOG_TYPE的值,你可以去参考PHP使用手册中有关于error_log的说明。在以下的范例中,我使将它设为3,意思是指将讯息记录到常数ADODB_ERROR_LOG_DEST所设定的档案中。

<?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*fromproductsz');##不正确的资料表productsz
if($rs)$rs2html($rs);
?>
以下则是写在error.log文件的错误讯息:

(2001-10-2814:20:38)mysqlerror:[1146:Table'northwind.productsz'doesn'texist]in
EXECUTE("select*fromproductsz")
第二种错误处理方法是ADOdb-errorpear.inc.php。使用这种方式,在错误发生时会产生PEAR_Error衍生对象,而最后产生的PEAR_Error对象可以被ADODB_Pear_Errir()函数取回。

<?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*fromproductsz');#不正确的资料表productsz');
if($rs)$rs2html($rs);
else{
$e=ADODB_Pear_Error();
echo'<p>',$e->message(),'</p>';
}
?>
在引入ADOdb-errorpear.inc.php档之前,藉由定义ADODB_PEAR_ERROR_CLASS常数,你可以使用一个PEAR_Error衍生类别。为了方便除错,你可以在PHP程序代码的最前面定义预设的错误理方式为PEAR_ERROR_DIE,这将会使得程序一出错,马上就输出错误讯息,并且停止执行。

include('PEAR.php');
PEAR::setErrorHandling('PEAR_ERROR_DIE');
注意,当错误产生时,ADODB并没有明确的回传一个PEAR_Error对象给你。你必需要去呼叫ADODB_Pear_Error()函数去取回最后的错误内容。或者,你可以使用PEAR_ERROR_DIE这个技巧。

资料集快取

现在,ADODB使用CacheExecute(),CachePageExecute()及CacheSelectLimit()函数来支持数据集快取。用法类似于没有快取的函数,除了要加上一个新的参数$secs2cache。

以下是一个范例:

include('ADOdb.inc.php');#加载ADODB
$ADODB_CACHE_DIR='/usr/ADODB_cache';
$conn=&ADONewConnection('mysql');#建立一个连结
$conn->PConnect('localhost','userid','','agora');#连结到MySQL,agora数据库
$sql='selectCustomerName,CustomerIDfromcustomers';
$rs=$conn->CacheExecute(15,$sql);
第一个参数是设定查询的快取秒数。随后呼叫的查询将会使用存放在由$ADODB_CACHE_DIR变量指定的快取数据。要强迫查讯执行,并且更新快取记录,使用CacheExecute()函数,并且将第一个参数设为0。或者,使用CacheFlush($sql)也行。

基于安全的考量,如果你要使用$ADODB_CACHE_DIR,我们建议你将在php.ini里的register_globals设成off。

在ADODB1.80版以后,在CacheSelectLimit()及CacheExecute()中,参数secs2cache是选择性的。如果你不填上去,系统将会使用$connection->cacheSecs属性的值,它的默认值是60分钟。

$conn->Connect(...);
$conn->cacheSecs=3600*24;//快取24小时
$rs=$conn->CacheExecute('select*fromtable');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: