使用 PHP、MySQL 和 jQTouch 进行移动 Web 开发
使用 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_qty
和 cart_price
。id
字段是主键。其值不能为 null
,并且对于表中的每一行都是唯一的。我们将其设置为 AUTOINCREMENT
,因此每添加一行表数据,其值将增加 1
。
在客户端表中插入行
假设用户已将一本书添加到购物车,因此我们现在有一些购物车数据需要处理——会话 ID、ISBN、标题、数量和价格。这些数据分别存储在变量 sid、ISBN、title、qty
和 price
中。我们将把这些数据转移到客户端 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 日:初始版本