科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道利用DB2 9原生XML和PHP来简化XML应用程序

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文讲述了模式演化对应用程序的影响,并通过使用情景向用户说明设置 PHP 环境的容易程度;将DB2原生XML 功能与PHP应用程序(包括用PHP和 XQuery编写的Web服务)集成的容易程度。

作者:Hardeep Singh 来源:IT专家网 2008年6月5日

关键字: IBM 数据库 DB2

  • 评论
  • 分享微博
  • 分享邮件
注意: 使用此 API 比操作 DOM 对象容易得多,该对象在 PHP 版本 5 之前是惟一选择。
  1. 创建数据库连接:

    $conn =db2_connect($dbname, $dbuser, $dbpass);

  2. 从文件打开文档,成为一个变量:

    $fileContents = file_get_contents("products/p1.xml");

  3. 从此变量创建简单的 XML 对象:

    $dom = simplexml_load_string($fileContents);

  4. 从文档中提取产品 ID:

    $prodID = (string) $dom["pid"];

  5. 创建准备好的语句,将 XML 文档插入数据库中:

    $stmt =db2_prepare($conn, "INSERT INTO xmlproduct VALUES (?, ?)");

  6. 将从文档中提取的产品 ID 作为参数与文档一起传递到查询:

    db2_execute($stmt, array($prodID, $fileContents);

注意插入数据到 XML 列中与插入数据到任何 CLOB 列中没有区别。因为这个 DB2 新版本允许在插入时对 XML 数据进行隐式分析,我们不需要对传入值显式地调用 XMLPARSE。如果我们希望在 XML 标记周围保留无关空格,则可以使用带 RESERVE WHITESPACE 选项的 XMLPARSE 函数。

注意: 这些代码段中的查询都使用斜体表示,以区别于 PHP 应用程序代码。

非 XML RDBMS
因为此数据库不具有任何 XML 功能,产品文档需要分解到两个关系表中。关系模式和 XML 模式之间的映射信息将直接嵌入 PHP 应用程序代码中。
  1. 首先加载文档到 DOM 中:

    $fileContents = file_get_contents("$products/p1.xml");
    $dom = simplexml_load_string($fileContents);

  2. 现在将产品的单个元素分割到本地变量中:

    $prodID = (string) $dom["pid"];
    $prodName = (string) $dom->description->name;
    $prodDetails = (string) $dom->description->details;
    $prodPrice = (float) $dom->description->price;

  3. 每个产品的图像 URL 需要存储在单独的图像表中:

    $images = array();
    foreach($dom->description->images->image as $image) {
    switch((string) $image[type']) {
    case thumbnail':$prodImgThumb = (string) $image;
    $prodImgAlias = (string) $image[alias'];
    if(!$prodImgAlias) $prodImgAlias = NULL;
    $stmt = db2_prepare($conn, "INSERT INTO sqlimages (Pid, Type, Alias, Location) VALUES (?, ?, ?, ?)");
    db2_execute($stmt, array($prodID, thumbnail', $prodImgAlias, $prodImgThumb));
    case full':
    $prodImgFull = (string) $image;
    $prodImgAlias = (string) $image[alias'];
    if(!$prodImgAlias) $prodImgAlias = NULL;
    $stmt = db2_prepare($conn, "INSERT INTO sqlimages (Pid, Type, Alias, Location) VALUES (?, ?, ?, ?)");
    db2_execute($stmt, array($prodID, full', $prodImgAlias, $prodImgFull));
    }
    }

  4. 当前实现 ibm_db2 驱动程序不能适当地将 NULL 变量作为参数来处理,以便执行函数;因此我们使用一个非强制性解决方案:

    if(!$prodBrand) $prodBrand = " ";
    if(!$prodCategory) $prodCategory = " ";
    if(!$prodImgFull) $prodImgFull = " ";

  5. 现在保存产品表中的产品信息:

    $stmt = db2_prepare($conn, "INSERT INTO sqlproduct (Pid, Name, Details, Brand,
    Category, Price, Weight, Size, Description) VALUES
    (?, ?, ?, ?, ?, ?, ?, ?, ?)");
    db2_execute($stmt, array($prodID, $prodName,
    $prodDetails, $prodBrand, $prodCategory,
    $prodPrice, $prodWeight, $prodSize, $fileContents));

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章