二、创建服务端数据存储和操作
2.1 创建数据表
为了把笔记以及笔记本数据存储到服务端,首先要在服务器端的MySQL数据库系统中建立相应的note表和notebook表。我们维持原来版本的表结构不变,只是将其从设备本地迁移到远程服务器。
仍然通过在phpMyAdmin中运行SQL语句创建数据表。建表语句大同小异,根据MySQL数据库系统以及远程服务器端存储的特点和要求进行少量调整:
# 创建笔记表note
CREATE TABLE `simplenote`.`note` (
`id` INT NOT NULL AUTO_INCREMENT ,
`title` VARCHAR(255) NOT NULL ,
`content` TEXT NOT NULL ,
`createTime` BIGINT NOT NULL ,
`notebookId` INT NOT NULL ,
`email` TEXT NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;
#创建笔记本表notebook
CREATE TABLE `simplenote`.`notebook` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` TEXT NOT NULL ,
`email` TEXT NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;
以上语句的表结构与我们在APP内部创建的表结构相比,每个表都多了一个“email”字段,这是为了使数据与用户相关联。与单机版本不通,服务器端存储的是全部用户的数据。
在phpMyAdmin中选择“SQL”标签,将以上SQL语句拷贝到编辑区:
点击“执行”完成两个表的创建:
2.2 基于PHP语言实现数据操作
2.2.1 实现对笔记数据的操作
在DreamWeaver(以下简称DW)中创建名为note.php的新的PHP文件,并保存到站点根目录simplenote下。在这个文件中,我们实现以下操作:
- 保存笔记
- 根据id查询笔记
- 获取全部笔记
如何区分这三个操作呢?我们在每次访问中,通过URL参数来指定操作类型。URL参数在PHP环境下,可以根据参数名字从_GET数组中获取。
假设页面的URL为:
http://192.168.1.106/simplenote/note.php
则定义三种操作对应的参数分别为:
- 保存笔记
http://192.168.1.106/simplenote/note.php?p=save
对于被保存的笔记数据,仍然通过POST操作提交,并从_POST数组中取得。
- 根据id查询笔记
http://192.168.1.106/simplenote/note.php?p=find&id=234
以上URL表明要PHP查找id为234的笔记数据
- 获取全部笔记
http://192.168.1.106/simplenote/note.php?p=findall
执行这些操作时,还需要以POST方式提供用户账户名称。因为所有操作的针对的都是特定用户的数据。
下面我们开始编码实现。
首先获取URL参数,根据参数的不通,建立逻辑框架:
session_start();
include( "conn.php" );
$pType = $_GET["p"];
$email = $_POST["email"];
if ($pType == "save") { // 保存
} elseif ($pType == "find") { // 根据id查找
} elseif ($pType == "findall") { // 获取全部笔记
}
?>
接下来,分别实现三种操作。
实现保存笔记
保存笔记的思路就是从用户提交的POST数据中读取要保存的笔记数据,然后插入到数据库中,根据操作的成功或失败向用户返回相关信息。
if ($pType == "save") {
// 保存笔记
// 1. 读取要保存的笔记数据
$title = $_POST["title"];
$content = $_POST["content"];
$createTime = $_POST["createTime"];
$notebookId = $_POST["notebookId"];
// 2. 向数据库插入新的笔记记录
$sql = "INSERT INTO `note` (`id`, `title`, `content`, `createTime`, `notebookId`, `email`) VALUES (NULL, '$title', '$content', '$createTime', '$notebookId', '$email')";
mysql_query($sql);
$id = mysql_insert_id();
if ($id > 0) {
// 2.1 信息写入成功,返回新记录的id
$ret = array(
"code" => 1,
"msg" => "笔记已保存",
"id" => $id
);
} else {
// 2.2 信息写入失败
$ret = array(
"code" => -1,
"msg" => "笔记保存失败"
);
}
// 3. 以JSON格式返回操作结果信息
header('Content-type: text/json');
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
}
实现按ID查找笔记
此项操作思路是,根据用户提供的email账号以及指定的id查询数据库,如果存在对应的笔记记录,则以JSON形式返回笔记数据;否则返回出错信息。我们将笔记数据JSON串定义为如下的形式:
{
"code": "1",
"msg": "OK",
"note": {
"id": "2",
"title": "t2",
"content": "t2",
"createTime": "t2",
"notebookId": "1",
"email": "[email protected]"
}
}
编写代码如下:
elseif ($pType == "find") {
// 根据id查找笔记
$noteId = $_GET["id"];
// 1. 在数据库中查询与email和id完全匹配的记录
$sql = "SELECT * FROM `note` WHERE `email`='$email' AND `id`='$noteId'";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result);
if ($num_rows > 0) {
// 2. 存在对应的笔记,返回JSON格式的对象
$row = mysql_fetch_array($result);
$note = array(
"id" => $row["id"],
"title" => $row["title"],
"content" => $row["content"],
"createTime" => $row["createTime"],
"notebookId" => $row["notebookId"],
"email" => $row["email"]
);
$ret = array(
"code" => "1",
"msg" => "OK",
"note" => $note
);
} else {
// 3. 报告查找失败
$ret = array(
"code" => "0",
"msg" => "查找笔记失败"
);
}
// 将用JSON返回登录结果
header('Content-type: text/json');
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
}
实现查找全部笔记
思路是根据用户提供的email账号在数据库中查询全部对应的笔记,并组成一个JSON数组返回给用户。如果没有对应的笔记数据,则返回的JSON数组长度为0。格式如下:
{
"code": "1",
"msg": "OK",
"noteList": [{
"id": "3",
"title": "t3",
"content": "t3",
"createTime": "t3",
"notebookId": "1",
"email": "[email protected]"
}, {
"id": "2",
"title": "t2",
"content": "t2",
"createTime": "t2",
"notebookId": "1",
"email": "[email protected]"
}, {
"id": "1",
"title": "t1",
"content": "t1",
"createTime": "t1",
"notebookId": "1",
"email": "[email protected]"
}]
}
编写代码如下:
elseif ($pType == "findall") {
// 获取全部笔记
// 1. 在数据库中查询与email完全匹配的记录并按时间倒序排列
$sql = "SELECT * FROM `note` WHERE `email`='$email' ORDER BY `createTime` DESC";
$result = mysql_query($sql);
$noteList = array();
// 2. 对查找到的每一条记录处理成一个JSON串并放到数组中
while ($row = mysql_fetch_array($result)) {
$note = array(
"id" => $row["id"],
"title" => $row["title"],
"content" => $row["content"],
"createTime" => $row["createTime"],
"notebookId" => $row["notebookId"],
"email" => $row["email"]
);
array_push($noteList, $note);
}
// 3. 返回包含查找结果的JSON串
$ret = array(
"code" => "1",
"msg" => "OK",
"noteList" => $noteList
);
header('Content-type: text/json');
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
}
2.2.2 实现对笔记本数据的操作
对笔记本数据的操作,也包括保存笔记本、按id查找笔记本以及获取全部笔记本三种。因此可以仿照2.2.1节中的方式来处理。
首先创建文件notebook.php并保存到simplenote目录下。然后,根据URL参数指定的操作分别实现:
0) {
// 2.1 信息写入成功
$ret = array(
"code" => 1,
"msg" => "笔记本已保存",
"id" => $id
);
} else {
// 2.2 信息写入失败
$ret = array(
"code" => -1,
"msg" => "笔记本保存失败"
);
}
// 3. 以JSON格式返回操作结果信息
header('Content-type: text/json');
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
} elseif ($pType == "find") {
// 根据id查找笔记本
$nbId = $_GET["id"];
// 1. 在数据库中查询与email和id完全匹配的记录
$sql = "SELECT * FROM `notebook` WHERE `email`='$email' AND `id`='$nbId'";
$result = mysql_query($sql);
$num_rows = mysql_num_rows($result);
if ($num_rows > 0) {
// 2. 存在对应的笔记本,返回JSON格式的对象
$row = mysql_fetch_array($result);
$nb = array(
"id" => $row["id"],
"name" => $row["name"],
"email" => $row["email"]
);
$ret = array(
"code" => "1",
"msg" => "OK",
"notebook" => $nb
);
} else {
// 3. 报告查找失败
$ret = array(
"code" => "0",
"msg" => "查找笔记本失败"
);
}
// 将用JSON返回登录结果
header('Content-type: text/json');
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
} elseif ($pType == "findall") {
// 获取全部笔记本
// 1. 在数据库中查询与email完全匹配的记录
$sql = "SELECT * FROM `notebook` WHERE `email`='$email'";
$result = mysql_query($sql);
$nbList = array();
// 2. 对查找到的每一条记录处理成一个JSON串并放到数组中
while ($row = mysql_fetch_array($result)) {
$nb = array(
"id" => $row["id"],
"name" => $row["name"],
"email" => $row["email"]
);
array_push($nbList, $nb);
}
// 3. 返回包含查找结果的JSON串
$ret = array(
"code" => "1",
"msg" => "OK",
"notebookList" => $nbList
);
header('Content-type: text/json');
echo json_encode($ret, JSON_UNESCAPED_UNICODE);
}
?>
到这里,我们基本完成了服务器端数据存储结构的创建以及服务端代码的编写。下面回到Android Studio来完成客户端的对接。