65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 PHP、MySQL 和 jQTouch 进行移动 Web 开发

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2010年10月2日

MIT

5分钟阅读

viewsIcon

32394

使用 PHP、MySQL 和 jQTouch 进行移动 Web 开发

引言

在本文中,我们将使用客户端数据库的 JavaScript 数据库 API。该 API 提供了一种存储、检索和维护用户提供信息的简单方法。此外,它还提供了一个关系数据库模型,因此可以轻松处理复杂数据。我们可以使用标准的 SQL 语句来执行所有与数据库相关的任务,例如创建数据库和表,以及在表中插入、获取、删除和更新行。

让我们从创建和打开数据库开始。创建和打开客户端数据库的代码如下所示:

var datab;
var shortName = 'tmpCart';
var version = '1.0';
var displayName = 'tmpCart';
var maxSize = 200000;
datab = openDatabase(shortName, version, displayName, maxSize);

代码片段中使用的变量的用法如表 1 所示。

表 1. 客户端数据库变量

变量 用法
datab 用于在数据库连接建立后保存对数据库连接的引用。
shortName 存储我们将要在客户端创建的数据库的名称。
version 存储分配给数据库的版本号。版本号通常是数据库升级或更改所必需的。
displayName 存储对用户可用的数据库名称。
maxSize 存储我们数据库的预期大小(以千字节为单位)。如果大小超过此变量中的限制,我们将收到通知,并被询问是否允许或拒绝增加。

我们代码片段中定义的变量值表明,我们要创建一个名为 tmpCart 的客户端数据库,版本号为 1.0,大小限制为 200000 KB。为这些变量赋值后,我们可以将它们传递给 openDatabase 命令,该命令实际上会创建 tmpCart 数据库并将连接保存在 datab 变量中。

代码片段也可以这样编写:

datab = openDatabase('tmpCart', '1.0', 'tmpCart', 200000);

也就是说,我们可以直接在 openDatabase 函数中指定参数值,而无需使用任何变量。

现在我们已经创建并打开了服务器端数据库,让我们在其中创建一个表。

创建客户端表

在此示例中,我们将使用客户端数据库存储购物车信息。让我们首先在客户端数据库 tmpCart 中创建一个名为 shopcart 的表,如下面的代码片段所示:

datab.transaction(

function(transaction) {

        transaction.executeSql(

'CREATE TABLE  IF NOT EXISTS shopcart ' +

               ' (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' +

               ' cart_sess varchar(50), cart_isbn varchar(30),  cart_item_name

               varchar(100), cart_qty integer, cart_price float );'
         );
     }
 );

JavaScript 数据库 API 支持 SQL 事务,所有数据库查询都必须在事务的上下文中进行。要执行标准的 SQL 查询,我们需要调用事务对象的 executeSql 方法。为此,我们调用 datab 对象的 transaction 方法,并将一个匿名函数传递给它。然后,我们将事务传递给匿名函数,以便我们可以调用事务对象的 executeSql 方法。

executeSql 方法会在 shopcart 表不存在时创建它。该表有六个字段:id、cart_sess、cart_ISBN、cart_item_name、cart_qtycart_priceid 字段是主键。其值不能为 null,并且对于表中的每一行都是唯一的。我们将其设置为 AUTOINCREMENT,因此每添加一行表数据,其值将增加 1

在客户端表中插入行

假设用户已将一本书添加到购物车,因此我们现在有一些购物车数据需要处理——会话 ID、ISBN、标题、数量和价格。这些数据分别存储在变量 sid、ISBN、title、qtyprice 中。我们将把这些数据转移到客户端 shopcart 表的一行中,如下面的代码片段所示:

datab.transaction(

function(transaction) {

        transaction.executeSql(

           'INSERT INTO shopcart (cart_sess, cart_isbn,  cart_item_name, cart_qty,

               cart_price) VALUES (?,?,?,?,?);',

           [sid, isbn, title, qty, price],

           function(){

           },

           displayerrormessage
        );
    }
 );

注意Session id 用于会话管理——一种用于跟踪访问我们 Web 应用程序的用户的方法。服务器为当前会话生成一个唯一的 ID。

首先,我们使用事务对象的 executeSql 方法执行 SQL 查询。我们需要将五个字段或列的数据传递给此方法。VALUES 括号中的五个问号 (?) 是占位符,它们将采用数组 [sid, ISBN, title, qty, price] 中的值。第一个问号将替换为 sid 变量中的值,第二个问号将替换为 ISBN 值,依此类推。

值数组之后是一个匿名函数,称为数据回调函数,该函数可能包含在 SQL 语句成功执行后要执行的语句。例如,data callback 可能包含对其他函数的调用,以显示确认消息或导航到其他面板。如果我们不希望在 SQL 语句成功执行后执行任何操作,我们可以将此函数留空,正如我们在代码片段中所做的那样。

片段的最后一部分 displayerrormessage 是对我们希望在 SQL 语句失败时调用的错误处理函数的调用。以下是 displayerrormessage 用法的示例:

function displayerrormessage(transaction, error) {

   alert('Error:  '+error.message+' has occurred with Code: '+error.code);

   return true;

}

将两个参数传递给 displayerrormessage 函数:transaction 对象和 error 对象。error 对象显示错误消息和错误代码。将 transaction 对象传递给 displayerrormessage 函数的原因是为了允许在函数内部执行更多 SQL 语句(如果需要)。displayerrormessage 函数可以返回 true 来中止执行并回滚整个事务,或者返回 false,在这种情况下,事务将继续。

错误代码

表 2 快速查看了在客户端数据库表上执行事务时生成的常见错误代码。

表 2 错误代码和发生情况

错误代码 发生情况
0 事务因其他非数据库相关错误而失败。
1 事务因其他数据库相关错误而失败。
2 事务失败,因为数据库版本与用户请求的版本不匹配。
3 事务失败,因为从数据库返回的数据太大。
4 事务失败,因为存储空间不足,或者用户不想让数据库超出现有限制。
5 事务失败,因为事务包含语法错误、参数数量不匹配、在只读事务中修改数据库的语句等。
6 事务失败,因为约束冲突,例如,为两个具有相同主字段值的行赋值。

如果我们不关心捕获错误,可以省略数据回调和错误处理回调函数。如果这样做,代码片段将显示如下:

datab.transaction(

    function(transaction) {

       transaction.executeSql(

          'INSERT INTO shopcart (cart_sess, cart_isbn,  cart_item_name, cart_qty,

              cart_price) VALUES (?,?,?,?,?);',

          [sid, isbn, title, qty, price]

       );

   }

);

有关更多信息,请参阅我的书:“Beginning Web Development for Smartphones: Developing Web Applications with PHP, MySQL and jQTouch”,可在 Amazon 上购买。

历史

  • 2010 年 9 月 30 日:初始版本
© . All rights reserved.