学习如何在 Bluemix 上创建一个 SQL 数据库,并将其添加到您的 PHP Web 应用程序中。探索一个数据驱动、动态生成的网络商店,该商店会根据当前库存水平来改变外观。使用基于 Web 的 Bluemix SQL 数据库控制台查看和维护您的 SQL 数据库。
本教程是 developerWorks 上的 “Bluemix 基础” 教程系列的一部分。
第 3 步. 创建一个 SQL Database 服务实例并将它绑定到您的应用程序中
第 4 步. 通过 ibm_db2 PHP 模块将数据添加到 SQL 数据库中
第 6 步. 通过 Bluemix SQL 数据库控制台访问 SQL 数据库
在前一篇教程 “将大量服务添加到您的应用程序中” 中,您已经了解到,服务只是 Bluemix 或第三方合作伙伴托管的代码,它们可以给您部署的 Bluemix 应用程序增添价值。
服务给您的应用程序带来了强大的功能,比如数据库、移动应用程序支持、分析、遗留系统集成和安全管理。从某种意义上讲,它们就像是插件,您随时可以向应用程序添加和绑定服务。
在可用的 Bluemix 服务中,数据库服务是最常使用的。而 SQL Database 服务是最流行的 Web 应用程序附加功能之一。
为经典的三层架构设计的大部分 Web 应用程序(比如 Java EE 应用程序)都在第三层需要一个数据库服务:
您的应用程序逻辑在无状态的应用程序层运行,而数据存储在数据库层。此架构使您只需增加应用程序实例的数量,就可以将应用程序扩展到越来越多的用户。
本教程将快速概述如何使用 Bluemix 将一个 SQL Database 服务添加到您的 Bluemix 应用程序中。
您将创建 SQL Database 服务的一个实例,并将它绑定到您的 PHP 应用程序。然后您将在数据库中创建表(也称为模式),并在其中填入数据。您将了解 Web 应用程序如何能够根据数据库中的数据来动态地改变外观。最后,您将使用 Bluemix 上的 IBM SQL 数据库控制台,用它作为访问您的数据的替代方式。
现在将该应用程序部署到 Bluemix,创建 SQL Database 服务的一个实例并绑定到它。
cf api https://api.ng.bluemix.net/
cf login
cf push your-app-name –m 128M -b https://github.com/ibmdb/db2heroku-buildpack-php
您为您的应用程序选择的名称必须在 Bluemix 上是唯一的;换句话说,它不能被其他任何 Bluemix 用户使用。如果该名称(称为 “route”)已被使用,您将得到一个错误。
在之前的教程中,您可能已熟悉该应用程序。该商店目前销售三种印刷品;每种印刷品的页面显示了关联的名称、图像和价格。但您会注意到,这个网络商店中没有列出任何印刷品!这是因为这个网络商店将显示来自某个数据库的印刷品库存,但此版本现在未连接到任何数据库。您将在下一步中建立该连接。
Bluemix 上的 SQL Database 服务提供了 IBM DB2 的一个实例,您可以在您的应用程序中绑定这些实例并立即使用它们。目前的免费 beta 计划提供了一个支持最多 10 个并发连接和 100 MB 的实例;其他计划提供了高达 500GB 和 100 个并发连接的选项。
cf create-service sqldb sqldb_free laurenlandscapes
cf bind-service your-app-name laurenlandscapes
cf restage your-app-name
尽管该数据库服务现在已绑定到该应用程序,但应用程序中的代码还未使用该数据库。接下来的几步将解决此问题。
数据定义语言或 DDL 通常为 SQL 数据库采用 CREATE TABLE 和 DROP TABLE 语句。它定义了一个表的模式,包括字段、索引和其他关系数据库特性。
您在 第 2 步 中用来将应用程序部署到 Bluemix 的专用 构件包 (buildpack) 包含 ibm_db2 PHP 模块,一个供 PHP 应用程序访问 IBM DB2 SQL 数据库的驱动程序。
在 dataseeder 目录下,您将找到 dataseeder.php
文件,其中包含的代码访问 DB2 SQL
数据库来:
http://your-app-name/dataseeder/dataseeder.php
此时将会显示一个几乎空白的页面,其中的消息表明已成功提供数据。
这是因为该印刷品脱销了。如果查看 dataseeder.php 中的代码,您会看到 Australia 印刷品的数量被设置为 0。
我们首先回顾一下 “将 PHP 应用程序部署到云” 教程中的原始代码结构。
在原始代码中,views 目录中有 4
个模板:home.tpl
、alaska.tpl
、antarctica.tpl
和 australian.tpl
。传入的每个对 Lauren's Lovely Landscapes
商店的一个页面的 Web 请求由 index.php
路由到 4 个模板中的一个。路由到该模板时,该代码附加了一个名为
$site_title
的 PHP 变量,该变量是用 vars.php
创建的,其中包含网站标题信息。每个模板都使用此对象来呈现其标题 (Lauren’s Lovely Landscapes)。
在新代码中,如果查看 views 目录,就会注意到它现在只有 2 个模板:home.tpl
和
printdesc.tpl
。
printdesc.tpl
现在负责动态生成任一种印刷品的详细描述,取代三个单独的模板的工作。主要
index.php
继续充当传入请求的路由器,将请求定向到一个模板。
路由到模板时,index.php
完全像之前一行包含 vars.php
。
但是,vars.php
现在包含 DB2 SQL 数据库访问代码来查询数据库中的可用印刷品。除了
$site_title
变量之外,vars.php
还为 home.tpl
创建了包含印刷品对象信息数组的 $prints
变量,以便动态生成其可用印刷品列表:
$sql = "select * from print"; $result = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE)); … while($row = db2_fetch_object($result)) { $prints[] = clone $row; }
index.php
还通过为 printdesc.tpl
模板附加一个包含印刷品详细信息的
$print
变量来生成印刷品详细描述,从而处理对印刷品描述和定价页面的传入请求:
include('vars.php'); $lll_route = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $print = $prints[$_GET['id'] - 1]; if (file_exists("views/$lll_route.tpl")) { …
在最后一步中,假设一批新的 Australia 印刷品已到货,所以您需要更新数据库中的可用数量。然后您会看到网站在动态地发生变化,以包含新入库的商品。
这会将 Australia 印刷品数量从 0 增加到 3。
restock.php
代码的原理类似于 dataseeder.php
。它直接访问 SQL
数据库并将 Australia 印刷品的数量更新为 3:
$conn = db2_connect($conn_string, '', ''); … $sql = "UPDATE print set quan=3 where id=3"; $result = db2_exec($conn, $sql); if ($result) { print "item restocked"; } db2_close($conn);
如果您想知道该应用程序如何处理脱销印刷品的动态呈现,可以找到嵌入在 home.tpl
模板中的 PHP 代码,结合动态生成的
outofstock
CSS 样式类,根据可用数量来更改外观:
<?php foreach($prints as $print) { ?> <div class="preview <?php if ($print->QUAN < 1) echo 'outofstock' ?>"> <a href="printdesc?id=<?php echo $print->ID ?>" <?php if ($print->QUAN < 1) echo "class='outofstock'" ?> > <?php echo $print->TITLE ?><br> <img src="/static/images/<?php echo $print->IMGSRC ?>" class="thumb"/> </a> </div> <?php } ?>
请注意,本教程中将印刷品的图像存储为文件,以保持简单。但在生产环境中,它们应该和数据一起存储在数据库中 — 存储在 Bluemix 提供的一个可靠的对象存储服务上更好一些。
除了 SQL Database 服务之外,Bluemix 还提供了许多有趣的服务,它们可以给您的应用程序增添价值和特性。例如,IBM Watson 的许多学习和认知功能 现在都能够以 Bluemix 服务的形式提供。您可能想浏览 Bluemix 服务目录,想象您可以添加到已部署的 Web 应用程序中的所有新特性。
测试您在本教程中学到的知识。答案在下方。
1. d,2. e,3. b,4. b,5. e
在本教程中,您:
本教程是 developerWorks 上的 “Bluemix 基础” 教程系列的最后一篇!如果您已经完成了所有这些教程,那么您已经出师了!
要获取稳定的教程和技术资源流来帮助您继续使用 Bluemix 进行学习、开发和连接,请参阅 developerWorks 上的 Bluemix 页面。