频道直达 - 专题 - 新闻 - 基础 - 高级 - 安装 - 技巧 - 数据库 - 手册 - PHP - Linux - Java - MySQL - Apache - 麻辣堂 - 狼盟 - Rails社群 - 搜索 - 下载 - 开源 - 论坛
PHP开发资源网 主页>>PHP基础教程>> 收藏此文 | 收藏本站 | 设为首页

PHP ADODB 入门教程(8)

来源:www.phpres.com 作者:Angelover 出处:www.phpres.com 2007-7-19 12:41:29 进入讨论组
关 键 词: PHP ADODB 入门教程(8)

在运作中增加一个结合参数。目前兼容于 Microsoft SQL 及 Oracle oci8。以下是参数说明:


$stmt  由 Prepare() 或 PrepareSP() 回传的指令。
$var 要结合的 PHP 变量。
$name 要结合的预储程序的变量名。
[$isOutput] 设定参数传导的方向,0/false = IN 1=OUT 2= IN/OUT 。 在 oci8 中这个参数会被忽略,因为驱动程序会自动侦测。
[$maxLen] 参数变量的最大长度。
[$type] 参考 mssql_bind 及 ocibindbyname 在 PHP.NET 的文件说明以取得更多正确值的信息。

在 mssql,$opt 可以被下列的元素所影响:mssql_bind and ocibindbyname 。 例如 ;

# @RETVAL = SP_RUNSOMETHING @myid,@group
$stmt = $db->PrepareSP('SP_RUNSOMETHING');
# note that the parameter name does not have @ in front!
$db->Parameter($stmt,$id,'myid');
$db->Parameter($stmt,$group,'group',false,64);
# return value in mssql - RETVAL is hard-coded name
$db->Parameter($stmt,$ret,'RETVAL',true);
$db->Execute($stmt);
一个 oci8 的例子:

#对于 oracle, Prepare 及 PrepareSP 是相同的
$stmt = $db->PrepareSP(
       "declare ret integer;
     begin
                :RETVAL := SP_RUNSOMETHING(:myid,:group);
     end;");
$db->Parameter($stmt,$id,'myid');
$db->Parameter($stmt,$group,'group',false,64);
$db->Parameter($stmt,$ret,'RETVAL',true);
$db->Execute($stmt);
请注意,在 oci8 及 mssql 间只有语法上的不同,那是各数据库实作 SQL 语法问题,ADODB 对于这一部份无能为力。

如果 $type 参数被设定成 false 。在 mssql ,$type 将会动态的由 PHP 变量传来的型别决定(string => SQLCHAR, boolean =>SQLINT1, integer =>SQLINT4 或  float/double=>SQLFLT8),在 oci8,$type 可以被设成 OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) 及 OCI_B_ROWID (ROWID)。如果要传入空值,使用  $db->Parameter($stmt, $null=null, 'param')。

最后,在 oci8,结合参数可以重复被使用,而无需再一次呼叫 PrepareSP() 或 Parameters。但这对 mssql 是不行的。一个 oci8 的范例如下:

$id = 0; $i = 0;
$stmt = $db->PrepareSP( "update table set val=:i where id=:id");
$db->Parameter($stmt,$id,'id');
$db->Parameter($stmt,$i, 'i');
for ($cnt=0; $cnt < 1000; $cnt++) {
        $id = $cnt;
        $i = $cnt * $cnt; # oci8 下可以运作
        $db->Execute($stmt);
}
Bind($stmt, $var, $size=4001, $type=false, $name=false)

这是一个低阶函数,只有 oci8 驱动程序支持。只有你确定系统仅支持 Oracle 否则请避免使用它。Parameter() 函数是使用结合变量的另一个建议方式。

Bind() 允许你使用结合变量在你的 sql 叙述中。这里结合一个PHP变量给一个在之前被 Prepare() 预先编译的 Oracle sql 叙述里定义的名称。Oracle 以一个冒号为开头来命名一个变量,而且 ADODB 需要一个被命名的变量去对应 :0,:1,:2,:3,等等。第一次被 Bind() 取得的将会代入 :0,而第二次将会代入 :1,依此类推。对 insert , select 及 update 指令,结合可以提供 100% 的效能提升。

在其余的参数里,$size 设定资料储存的暂存区大小,$type 是 OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) 及 OCI_B_ROWID (ROWID) 的类别选项。最后,代替使用预设的 :0,:1 等等名称,你可以使用 $name 来定义你自己的连结名称。

接下来的例子展示3个连结变量,使用 p1,p2及p3来结合。这些变量将会配到 :0 , :1 及 :2 。

$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:0, :1, :2)");
$DB->Bind($stmt, $p1);
$DB->Bind($stmt, $p2);
$DB->Bind($stmt, $p3);
for ($i = 0; $i < $max; $i++) {
   $p1 = ?; $p2 = ?; $p3 = ?;
   $DB->Execute($stmt);
}
你也可以使用名称变量:

$stmt = $DB->Prepare("insert into table (col0, col1, col2) values (:name0, :name1, :name2)");
$DB->Bind($stmt, $p1, "name0");
$DB->Bind($stmt, $p2, "name1");
$DB->Bind($stmt, $p3, "name2");
for ($i = 0; $i < $max; $i++) {
   $p1 = ?; $p2 = ?; $p3 = ?;
   $DB->Execute($stmt);
}

--------------------------------------------------------------------------------

ADOConnection 公用函数
BlankRecordSet([$queryid])

不再使用,本版已移除。

Concat($s1,$s2,....)

产生一个结合 $s1,$s2,..等 sql 字符串的字符串,使用了在 concat_operator 字段定义的结合运算符号。如果结合运算符号不被使用,那这个函数将无效,例如 MySQL 。

本函数回传含结合符号的字符串。

DBDate($date)

格式化 $date 成数据库可以接收的格式,这可以是一个 Unix 整数时间记录格式或是一个 ISO 格式的 Y-m-d。使用 fmtDate 字段所定义的格式。如果传入的是 null 或是 false 或是 '' ,那将会转成一个 SQL 的 null。

回传一个日期字符串。

DBTimeStamp($ts)

格式化时间记录格式的 $ts 成数据库可接受的格式。这可以是一个 Unix 整数时间记录格式或是一个 ISO 格式的 Y-m-d。使用 fmtDate 字段所定义的格式。如果传入的是 null 或是 false 或是 '' ,那将会转成一个 SQL 的 null。

回传一个时间字符串。

qstr($s,[$magic_quotes_enabled=false])

将一个字符串放在引号内,以送到数据库中。$magic_quotes_enabled 参数可能看起来很有趣,但这个想法是假设你已经用一个引号来处理了从 POST/GET 变量取来的字符串后,然后以 get_magic_quotes_gpc() 做为第二个参数。这会确定这个变量不会被引号处理二次,一次被 qstr 处理,一次被 magic_quotes_gqc。

例如:  $s = $db->qstr(HTTP_GET_VARS['name'],get_magic_quotes_gpc());

回传值是一个被引号处理过的字符串。

Affected_Rows( )

回传被SQL指令更新或被删除掉的数据笔数。如果数据库不支持,回传一个 false 值。

目前 interbase/firebird 不支持本函数。

Insert_ID( )

回传最后插入时的自动增进值 ID。如果系统不支持,回传 false。

只支持有提供自动增进或对象 ID 的数据库,目前像是 PostgreSQL, MySQL 以及 MSSQL 都有。PostgreSQL 回传一个 OID,可以在数据库重加载时改变。只有使用持续连结方式,当你完成一笔交易时,这个函数才会有精确的结果。这是因为被 Execute() 宣告的连结可能和下一个 Execute() 时用的连结不同。

MetaDatabases()

回传一个在服务器中的数据库清单于数组里。首先你必需连结到服务器。目前只支持 ODBC, MySQL 及 ADO。

MetaTables()

回传目前数据库中全部资料表名称于一个数组中。如果可能,这个数组将会排除系统目录资料表。

MetaColumns($table)

回传一个 ADOFieldObject 的数组,一个字段对象对应到一个 $table 的所有行。目前 Sybase 不能辨别资料型别,ADO 不能辨识正确的资料型别(所以我们预设为 varchar)..

MetaColumnNames($table)

回传 $table 的行名于一个数组中。


--------------------------------------------------------------------------------

欢迎进入PHP开发资源论坛讨论。
收藏此文】【 】【打印】【关闭
相关文章
图文推荐
论 坛 资 源
PHP开发资源网奋斗目标
阅读排行:
热门技术文档
最新图文档
本站编辑推荐:(本站开通Delphi4PHP专区,欢迎进入论坛交流!)
编缉最近更新文章
网站赞助商
搜索您感兴趣的内容
 
   网站首页 -  网站地图 -  网站合作 -  手册中心 -  通用网址 -  网站论坛 -  网站投稿 -  友情链接 -  帮助中心
版权所有:PHP开发资源网 © 2003-2008 通用网址:PHP资源网 合作媒体: 赛迪网IT技术
互联网违法和不良信息举报中心 | 不良信息举报信箱