当然,您需要创建一个表。您将把新的 Word 格式中的 XML 存储在 XML 列中,而不是一个 Character Large Object (CLOB) 中。为此,需要创建一个支持 XML 或 UTF-8 的数据库。
清单 1. 创建一个支持 XML 的数据库
CREATE DATABASE ODF AUTOMATIC STORAGE YES USING CODESET UTF-8 TERRITORY US
现在,需要连接到数据库,并用下面的定义创建一个表。下面的代码假设您有一个具有 CREATETAB 权限的用户名 “db2admin”。如果不具备这种用户设置,可以修改这些脚本,使具有适当的数据库用户。
清单 2. 创建用于包含 ODF 和 MS Office 2007 文档的支持 XML 的表
CREATE TABLE DB2ADMIN.DOCUMENT ( ID INT NOT NULL PRIMARY KEY, OWNER VARCHAR(128), DOC XML )
代码将使用 PHP 的 ZIP 实用程序和 PDO。PDO 已经针对 Zend Core for IBM 设置完毕,但是需要将 “zip” 添加到配置中:
- 打开 Zend Core Administration Console。
- 切换到 Configuration 选项卡和 Extensions 子选项卡。
- 向下滚动到 ZIP 扩展。
- 单击 switch 图标将其打开。
- 单击 Save Settings。
- 重新启动 Apache2。
- 如果它不在运行,即在系统托盘中显示为红色羽毛,那么启动 C:\Program Files\Zend\Apache2\bin\ApacheMonitor.exe。
- 单击它,从菜单中重新启动 Apache2 HTTP Server。
如果这样不行,那么试着编辑文件,确保 “C:\Program Files\Zend\Core for IBM\etc” 文件夹下的 php.ini 文件中包含下面几行。将下面用粗体表示的一行添加到 php.ini 中:
清单 3. 对 php.ini 的修改
extension=php_zip.dll extension=php_pdo.dll extension=php_pdo_ibm.dll extension_dir="c:\program files\Zend\Core for IBM\lib\phpext"
现在,可以开始使用 opendoc.odt 了,它是下载小节中提供的一个 ODF 文件。虽然 图 2显示了该文档的 MS Word 外观,但这个 ODF 文件看起来类似于清单 4。该文档使用像 “Heading 1” 和 “Heading 2” 这样的样式作为格式。然后,我们将查询 Heading 2 样式,因为 OpenOffice 格式中使用了它。注意,在生产代码中,还需要包括适当的错误处理代码。
我还在下载小节中包括了一个 submit.docx 文档,该文档使用 MS Office 2007 格式。图 2显示这个文档在 Word 中的样子。和 ODF 一样,该文档利用 “Heading 1” 和 “Heading 2” 之类的 Word 样式作为格式。然后,我们将查询 Heading 2 样式。

图 2. OpenOffice 或 MS Word 中显示的示例文档
下面的 PHP 代码使用了这个文档,它对 ZIP 清单中的项进行遍历,并提取具有相关数据的 XML 文档。清单 4 提供了该代码。将该代码保存为 “odfconsume.php”,以便后面引用。
清单 4. 使用 OpenOffice (ODF) 格式 (odfconsume.php) 的 PHP 代码
<?php $user = "db2admin"; $password = "secret"; $zip = zip_open("c:\opendoc.odt"); $db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" . "HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password); echo $user." Connected\n"; if ($zip) { while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry, "r") && zip_entry_name($zip_entry) == 'content.xml' ) { $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $insstr ="INSERT INTO DB2ADMIN.DOCUMENT (ID,OWNER,DOC) VALUES (2,'Linux Office',:buf)"; $stmt = $db->prepare( $insstr ); $stmt->bindParam( ':buf' , $buf , PDO::PARAM_LOB , strlen($buf) ); $stmt->execute(); echo "\nResult: ".$db->errorCode()."\n"; zip_entry_close($zip_entry); } echo "\n"; } zip_close($zip); } ?>
使用下面的命令行运行该代码:
php odfconsume.php
|
这会将一个 XML 文档插入到数据库中,并打印出一个错误码。这里错误码很可能是 0。
清单 4.1 是使用 MS Word 的代码。将该代码保存为 “msconsume.php”,以便后面引用。
清单 4.1 使用 MS Office 2007 格式 (msconsume.php) 的 PHP 代码
<?php $user = "db2admin"; $password = "secret"; $zip = zip_open("c:\submit.docx"); $db = new PDO("ibm:DRIVER={IBM DB2 ODBC DRIVER};DATABASE=ODF;" . "HOSTNAME=localhost;PORT=50000;PROTOCOL=TCPIP;", $user, $password); echo $user." Connected\n"; if ($zip) { while ($zip_entry = zip_read($zip)) { if (zip_entry_open($zip, $zip_entry, "r") & zip_entry_name($zip_entry) == 'word/document.xml' ) { $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); $insstr ="INSERT INTO DB2ADMIN.DOCUMENT VALUES (1,'BILLY ONAIRE',:buf)"; $stmt = $db->prepare( $insstr ); $stmt->bindParam( ':buf' , $buf , PDO::PARAM_LOB , strlen($buf) ); $stmt->execute(); echo "Result: ".$db->errorCode(); zip_entry_close($zip_entry); } echo "\n"; } zip_close($zip); } ?>
和前面一样,用下面的命令行运行该代码:
php msconsume.php
|
这会将一个 XML 文档插入到数据库中,并打印出一个错误码。同样,这里错误码很可能是 0。