天天看点

PHP连接数据库学习手册

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

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

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

上面的范例说明,如果要以顺序来存取字段,就将 $adodb_fetch_mode 的值设为 adodb_fetch_num,要以关连式数组(以字段名)存取字段,就要将值设为 adodb_fetch_assoc。

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

·         name: 字段名

·         type: 字段的资料原生型别native field type of column

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

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

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

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

·         d: 日期字段

·         t: 时间字段

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

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

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

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

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

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

在 1.50 版以后的 adodb 里,是使用公共变量 $adodb_fetch_mode 来设定回传的数组是以编号或是关连式字符串做索引。

adodb 1.31版起,新增了两个数据集函数:getupdatesql()及getinsertsql()。这允许你在执行了像"select * from table query where..."这样的查询函数后,建立一个 $rs->fields复本,改变这些字段,然后自动产生出更新或是新增的sql指令。

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

<?

#==============================================

#  getupdatesql() 及 getinsertsql() 范例码

include('adodb.inc.php');

include('tohtml.inc.php');

#==========================

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

$sql = "select * from adoxyz where id = -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函数中,以执行功能

# 这个函数将会依传入的资料,回传一个全格式的 insert sql指令

$insertsql = $conn->getinsertsql($rs, $record);

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

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

$sql = "select * from adoxyz where id = 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();

?>

我们使用http取得 $next_page 变量,以追踪要跳去那一页并且储存目前页码在 session 变量 $curr_page 里。

我们呼叫连结对象的 pageexecute()函收去取得我们要的资料集,然后我们使用数据集的 atfirstpage() 及 atlastpage() 函数去决定是否显示下一页和上一页按钮。

以上的程序代码可以在 testpaging.php 范例里找到。

在之前的版本,你可以使用像 $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 引入到程序代码中。

if you define error_reporting(0), no errors will be shown. if you set error_reporting(e_all), all errors will be displayed on the screen.

如果你设定了 error_reporting(0) 的话,将不会有任何错误被显示。如果你设定了 error_reporting(e_all),那将会显示所有的错误讯息。

以下是一个简单的范例:

如果你要把错误讯息记录下来,你可以定义两个选择性常数 adodb_error_log_type, adodb_error_log_dest。有关于 adodb_error_log_type 的值,你可以去参考 php 使用手册中有关于 error_log 的说明。在以下的范例中,我使将它设为 3,意思是指将讯息记录到常数 adodb_error_log_dest 所设定的档案中。

以下则是写在 error.log 文件的错误讯息:

第二种错误处理方法是 adodb-errorpear.inc.php 。使用这种方式,在错误发生时会产生 pear_error 衍生对象,而最后产生的 pear_error 对象可以被 adodb_pear_errir() 函数取回。

在引入 adodb-errorpear.inc.php 档之前,藉由定义 adodb_pear_error_class 常数,你可以使用一个 pear_error 衍生类别。为了方便除错,你可以在 php 程序代码的最前面定义预设的错误理方式为 pear_error_die,这将会使得程序一出错,马上就输出错误讯息,并且停止执行。

注意,当错误产生时,adodb并没有明确的回传一个 pear_error 对象给你。你必需要去呼叫 adodb_pear_error() 函数去取回最后的错误内容。或者,你可以使用 pear_error_die 这个技巧。

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

以下是一个范例 :

第一个参数是设定查询的快取秒数。随后呼叫的查询将会使用存放在由  $adodb_cache_dir 变量指定的快取数据。要强迫查讯执行,并且更新快取记录,使用 cacheexecute() 函数,并且将第一个参数设为 0 。或者,使用 cacheflush($sql) 也行。

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

在 adodb 1.80版以后,在 cacheselectlimit() 及 cacheexecute() 中,参数 secs2cache 是选择性的。如果你不填上去,系统将会使用 $connection->cachesecs 属性的值,它的默认值是 60 分钟。