新客网WWW.XKER.COM:致力做中国最专业的网络学院!
学院: 操作系统 - 网络应用 - 服务器 - 网络安全 - 工具软件 - 办公软件 - Web开发 - 数据库 - 网页设计 - 图形图像 - 媒体动画 - 硬件学堂 - 存储频道 - QQ专区
您的位置:首页 > 软件开发 > 数据库 > DB2教程 > 正文:利用DB2 9原生XML和PHP来简化XML应用程序

利用DB2 9原生XML和PHP来简化XML应用程序

新客网 XKER.COM 2006-08-27 来源: 收藏本文
  • 非 XML RDBMS

    插入语句将发生变化以包括新列。
  • 创建索引所需的查询将发生变化以在 WHERE 子句中包括这个新列。同样,用于根据索引中的选择列出货品的查询也将发生变化以包括新条件。

    对应用程序代码的影响
    • DB2 Viper

      应用程序代码将没有任何更改。
    • 非 XML RDBMS

      • 将需要额外的 DOM 代码,以分割出子种类信息。
      • INSERT 语句将需要额外的参数。
      • 所有数据都有可能需要重新插入,这导致终端用户有一段时间无法操作。
    用户单击种类或品牌时列出货品

    用户单击特定种类或品牌时,将生成该种类或品牌中所有货品的列表。列表中的每个货品都有简短描述和到缩略图像的 URL。此列表显示在主页中并在其中进行格式设置。

    图 6. 某一种类中的货品列表

    某一种类中的货品列表

    DB2 Viper

    DB2 中,XQuery 不仅创建列表,而且还将其转换为 HTML 输出,从而浏览器可以直接使用。使用 XQuery 的此功能,不仅可以推出业务逻辑,而且可以发布到数据库服务器,从而有效地使中间层应用程序非常简单。这正是使用 PHP 而不使用 Java™ 或 VS .NET® 的原因。


    $xquery =for $i in $t/product

    let $thumb := $i/description/images/image[@type="thumbnail"]

    where $i/description/category = " . htmlentities($category) . "

    return









    {$i/description/name}



    ;

    $stmt = db2_prepare($conn, "SELECT XMLSERIALIZE(XMLQUERY(

    $xquery' PASSING BY REF T.DESCRIPTION AS \"t\"

    RETURNING SEQUENCE) AS CLOB(32K)) FROM xmlproduct AS t");

    db2_execute($stmt);

    while(list($product) = db2_fetch_array($stmt)){echo $product;}


    查看上面的应用程序代码,我们注意到 PHP 代码减少为两行,而数据库查询包含大部分逻辑。

    注意: 我们需要对使用 HTML 实体的任何传入 CGI 变量(如种类)进行转义,从而它们在插入 XQuery 时不包含任何非法的非转义实体。

    虽然 XQuery 可以进行发布转换,但在许多情况下可能不适合进行此操作。由于设计、性能和样式原因,可能更适合于在中间层或客户机中使用 XSLT 转换来创建最终的 Web 页。在许多情况中,将两个查询捆绑为一个查询会更方便。使用 XQuery 并不阻止开发人员使用 XSLT 进行转换。我们在此的尝试将显示 XQuery 不仅可以进行数据搜索,而且可以对数据运行复杂业务逻辑和转换。

    非 XML RDBMS

    首先查询数据库以获取与所选种类匹配的所有货品的行集:



    $sql = "SELECT P.Pid, P.Name, I.Location FROM sqlproduct P, sqlimages I

    WHERE P.Category = ? AND I.Pid = P.Pid AND I.Type = ?");

    $stmt = db2_prepare($conn, $sql);

    db2_execute($stmt, array($category, "thumbnail"));


    然后在结果集中循环并使用 PHP 代码创建 Web 页:


    while(list($prodPid, $prodName, $prodImg) = db2_fetch_array($stmt)) {

    ?>














    }

    ?>


    虽然发布代码与 XQuery 中的非常相似,一个显著区别就是此代码在中间层中运行和维护,而不是在数据库服务器中。所以如果 XQuery 在数据库服务器中注册为存储过程,其维护将作为数据库的一部分。我们将在下一步中进行此操作。

    产品详细信息

    用户单击商店列出的任何产品时,应用程序都会创建一个详细产品页面,其中包含该产品的说明、尺寸、价格和可能的附加图像等信息。

    图 7. 产品详细信息

    产品详细信息

    DB2 Viper

    创建产品详细信息的 XQuery 保存为存储过程。

    用于创建产品详细信息的存储过程

    用 SQL/PL 编写 getProduct 存储过程,其接受产品 ID 作为参数,并返回记录集的游标。这个存储过程主要执行 XQuery,其在页面一侧生成显示产品详细信息及其图片以及其他缩略图的版面。

    收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭
    发表评论
    要记得去论坛讨论,点击注册新会员匿名评论
    评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
    阅读排行
    随机推荐
    实用信息推荐