# 用E4A操作数据库
# •本节要点
首先是准备工作,同时这部分可以复习前面内容:
1.建立一个mysql数据库,写几个字段。
2.建立一个中间件连接数据库。
3.编写E4A程序连接该数据库。
然后就是几个操作过程:
4.用E4A实现数据库写入记录
5.用E4A实现数据库修改记录
6.用E4A实现数据库删除记录
下面分点写
**•建立一个mysql数据库**
我这里有宝塔软件,直接用吧,因为我们要用到中间件,所以我这里直接创建一个网站空间,让它附带数据库。这个操作我们可以在浏览器用宝塔web面板完成。
![](https://img.kancloud.cn/5c/d6/5cd64208257462a30127f4f59c5a6e4d_1280x731.png)
上图为宝塔web面板首页,我们可以在我们本地机上通过浏览器完成这些操作,就不需要远程连接服务器,很是方便。
![](https://img.kancloud.cn/88/b4/88b4d5ca369186ec4084d9e20c6bef19_1280x640.png)
如上图,一步步设置好,域名我泛解析过就不用A记录了。
接着我们去设置一下数据库的字段,既然是写个程序那就写个简单的卡密验证系统吧。。
我们设置几个字段,分别叫做ID(这个设置整数自增吧,做主键)、卡密(这个设置文本型)、到期时间(文本型)。如下图:
![](https://img.kancloud.cn/8c/e9/8ce9717c63b849199406afcadf1d92e3_1280x638.png)
先来建一个表,空库是没有表的
![](https://img.kancloud.cn/ce/06/ce066a1cb5103911610c44d17c24bfb0_1273x357.png)
然后创建字段
![](https://img.kancloud.cn/51/48/51480d9c178c38603a84ce4eb64d11fd_1280x622.png)
发现出错,ID最长255个字符,这个就是INT型数字的最大长度,没想起来尴尬了~
然而折腾一阵子发现报错#1007,没有给出错误原因,错误代码查不到原因,算了,懒得搞,到服务器上用Navicat,这是宝塔面板给我们准备的另一利器,相比于phpmyadmin,它更稳定,很少出错,如图:
![](https://img.kancloud.cn/40/99/4099dc30196ae99e180352e9c5f037a5_1177x735.png)
好了,下面就试试
![](https://img.kancloud.cn/1a/e1/1ae1e90a31cf2e0ef8347903e1f77369_1177x735.png)
连接上了看看里面
![](https://img.kancloud.cn/80/16/8016f7769e0f4e9d89b07e9f746442f2_1177x735.png)
空空如也表都没建。。算了重建吧。
![](https://img.kancloud.cn/63/0f/630f1326255e12ceb4f14e76c3c75b63_985x600.png)
OK,别忘了设置ID自增:
![](https://img.kancloud.cn/00/95/0095ab571bd8f92af5d3b47e229891ca_985x600.png)
![](https://img.kancloud.cn/2c/44/2c44c7a1bcd2171cf531692f826abed1_985x600.png)
好了,保存一下,写第一条数据测试看看
![](https://img.kancloud.cn/98/ff/98ffdece2a0104b00d4a3db128b3faba_985x600.png)
写了两条数据,正常,OK先就这样,接下来写中间件。
# **•建立一个中间件连接数据库**
我们先去弄一下MySQL中间件,它就在E4A安装目录下,如图:
![](https://img.kancloud.cn/53/05/5305dec92687625602b3bf9b0f350d39_435x658.png)
这样我们就快速到达了E4A根目录,我们去看看:
![](https://img.kancloud.cn/ce/cc/ceccbe77ac2264f18e26f6601fd9697a_800x600.png)
就在这里了,我们把它复制一份到桌面,免得弄错了就没得搞了:
它这里自带说明。写得很详细了
![](https://img.kancloud.cn/52/36/523647baa210dea0b17ab79d8242f892_1269x603.png)
这里要填数据库密码,如上图
照着下图填:
![](https://img.kancloud.cn/fb/3e/fb3e299865301db2eb347e5f07dca5c3_1280x634.png)
写好是这个样子:
![](https://img.kancloud.cn/77/8b/778b3685aff63b6a33db6199df9b57d4_1280x736.png)
接着保存上传,宝塔面板就方便了:
点一下这个路径
![](https://img.kancloud.cn/de/e8/dee8b02d6d4c5672bc2ef8a04e3a033e_1280x635.png)
可以看到一个文件管理器,上面就有上传按钮,直接上传吧,我表示什么ftp啥的都不需要。。。
![](https://img.kancloud.cn/8b/97/8b97b41109fc732a89394ca82ce0f87d_1280x631.png)
访问一下中间件地址看看能不能用
输入中间件地址:mysql.ray-o.cn/openapi\_unsafe.php,跳到了百度那就没错了,这是一个障眼法。。。
**最后,经测中间件必须使用PHP5.3**,不然会出错,这一点目前E4A官方未在说明文档提到,已反馈。
# •编写E4A程序客户端APP源码
这次我就做个例子,随便搞一下子,如下图:
![](https://img.kancloud.cn/58/68/58687daf1a56ac4fccabfd30f66a8800_1032x544.png)
为了达到目的,我需要在上面覆盖一层标签来遮蔽下面的这些东西,就像这样:
![](https://img.kancloud.cn/4e/08/4e0806fd4840dc59851fd3292b7260fc_1106x542.png)
然后我们做几个控件让用户可以输入卡密并且验证,如图:
![](https://img.kancloud.cn/8a/dc/8adc7680845743fc8a4bc152bd0c1dcb_1083x568.png)
这样就可以了,接下来写代码,我有个习惯,那就是写一点测试一点,不是全部写完再测试,首先我们要做的是测试数据库是否能连上,看如下代码:
做这个前需要先摆上一个mysql数据库的类库,如下图:
![](https://img.kancloud.cn/ac/d6/acd60daca6966f5a8706bc689c75a7f5_1280x736.png)
接着我们再来写代码:
![](https://img.kancloud.cn/98/eb/98eb26a676e0c420c4d9ce0a5b399847_967x441.png)
运行一下子:
![](https://img.kancloud.cn/9c/1a/9c1a02ea152d5d28ee87671c68f5ea16_1080x1920.png)
OK,接着写输入卡密验证哪一块吧
我在构思代码的时候发现卡密还需要一个使用者字段,不然不知道卡密有没有使用过,所以加一个字段吧
![](https://img.kancloud.cn/14/1b/141b370f0fa0ecd64a4c585d5440092a_851x311.png)
然后写相关代码,做这个中间出了些岔子,看上面终极教程的E4A排除运行闪退故障,下面看代码:
~~~
事件 主窗口.创建完毕()
MySQL数据库1.连接数据库("http://mysql.ray-o.cn/openapi_unsafe.php","localhost:3306","","","mysql_ray_o_cn")
结束 事件
事件 MySQL数据库1.连接数据库完毕(连接结果 为 逻辑型)
判断 连接结果
分支 真
信息框("连接结果","已连接上","知道了")
分支 假
信息框("连接结果","连接失败","知道了")
结束 判断
结束 事件
事件 按钮1.被单击()
MySQL数据库1.查询记录("卡密表","卡密,使用者","卡密=" & "'" & 编辑框1.内容 & "'")
结束 事件
变量 集合内项目数 为 整数型
事件 MySQL数据库1.查询记录完毕(查询结果 为 集合)
集合内项目数 = 查询结果.取项目总数()
如果 集合内项目数 = 0 则
弹出提示("卡密错误")
否则如果 集合内项目数 <> 0 则
如果 查询结果.取项目(0)(1) = "" 则
MySQL数据库1.修改记录("卡密表","使用者=" & "'" & 手机1.取IMEI码() & "'","卡密=" & "'" & 编辑框1.内容 & "'")
否则如果 查询结果.取项目(0)(1) <> "" 则
弹出提示("卡密已被使用过")
结束 如果
结束 如果
结束 事件
事件 MySQL数据库1.修改记录完毕(添加结果 为 逻辑型)
判断 添加结果
分支 真
弹出提示("卡密激活成功")
结束 判断
结束 事件
~~~
这里我还用了一个手机组件,看吧:
![](https://img.kancloud.cn/ba/02/ba029bf43a2ad69bd4644ec962761ff8_1280x736.png)
用它取IMEI码,用来验证用户身份。
下面解释一下代码:
![](https://img.kancloud.cn/da/23/da23e030103a58010aa8d7224304959b_732x265.png)
这一块写给我们看的,让我们知道数据库是不是正常连接,发布的时候需要改写或者删除,用户不需要知道数据库正常与否,顶多当服务器坏了的时候提示他们服务器故障,请联系开发者。
现在来整理一下思路:当用户输入了卡密,接下来会干啥?点击验证按钮对吧?验证按钮的组件对象名是按钮1吧?写吧:
![](https://img.kancloud.cn/9f/56/9f560d40ad7d6d473b587180ed34ac7a_562x29.png)
我们这句话说的就是把卡密输入框的卡密拿去查数据库,看看有没有这个卡密,同时看看这个卡密的使用者是谁,注意:在MYSQL数据库里面中文字符必须用单引号引出,但是在E4A里面做为查库的条件,单引号是做为文本使用的,它旁边就需要上双引号,为了稳,我们也加上单引号,为了方便你们看我就一步步写清楚了。
然后就是查完库返回一个结果了我们根据结果来判断这个卡密是否有效,如果有效则注册卡密使用者为本机,如果无效给出理由:
![](https://img.kancloud.cn/41/05/4105ad684231139eaf069b499277660c_765x250.png)
这是一个判断结构的语句块,分为以下几个情况:
查不到这个卡密,反馈用户:卡密错误
查到了这个卡密,发现已经被注册,反馈用户这个卡密已被使用
查到了这个卡密,并且无人注册,反馈验证成功给客户
上面我们就完成了卡密验证,接着我们写程序启动或者卡密验证成功后程序测试卡密是否过期,如果没有过期的话就把遮住内容的标签清除的操作,因为有两个点要调用这个代码,所以我们图个方便写个过程吧。
最后写出来大概就是这些代码:
~~~
变量 查库命令头 为 文本型
事件 主窗口.创建完毕()
MySQL数据库1.连接数据库("http://mysql.ray-o.cn/openapi_unsafe.php","localhost:3306","","","mysql_ray_o_cn")
结束 事件
事件 MySQL数据库1.连接数据库完毕(连接结果 为 逻辑型)
判断 连接结果
分支 真
验证()
分支 假
信息框("连接结果","连接失败","知道了")
结束 判断
结束 事件
事件 按钮1.被单击()
查库命令头 = "查卡密信息"
MySQL数据库1.查询记录("卡密表","卡密,使用者","卡密=" & "'" & 编辑框1.内容 & "'")
结束 事件
变量 集合内项目数 为 整数型
变量 卡密到期时间 为 整数型
变量 设备时间 为 整数型
变量 月份 为 文本型
变量 日 为 文本型
事件 MySQL数据库1.查询记录完毕(查询结果 为 集合)
集合内项目数 = 查询结果.取项目总数()
判断 查库命令头
分支 "查卡密信息"
如果 集合内项目数 = 0 则
弹出提示("卡密错误")
否则如果 集合内项目数 <> 0 则
如果 查询结果.取项目(0)(1) = "" 则
MySQL数据库1.修改记录("卡密表","使用者=" & "'" & 手机1.取IMEI码() & "'","卡密=" & "'" & 编辑框1.内容 & "'")
验证()
否则如果 查询结果.取项目(0)(1) <> "" 则
弹出提示("卡密已被使用过")
结束 如果
结束 如果
分支 "查设备在卡密系统注册的信息"
如果 集合内项目数 = 0 则
弹出提示("请输入卡密完成验证")
否则如果 集合内项目数 <> 0 则
'开始处理时间文本
卡密到期时间 = 子文本替换(查询结果.取项目(0)(1),".","")
如果 取文本长度(取月份(取现行时间())) = 1 则
月份 = 0 & 取月份(取现行时间())
否则
月份 = 取月份(取现行时间())
结束 如果
如果 取文本长度(取日(取现行时间())) = 1 则
日 = 0 & 取日(取现行时间())
否则
日 = 取日(取现行时间())
结束 如果
设备时间 = 取年份(取现行时间()) & 月份 & 日
' 信息框("时间信息",卡密到期时间 & "|" & 设备时间,"确定")
'结束处理时间文本
如果 卡密到期时间 >= 设备时间 则
标签2.可视 = 假
编辑框1.可视 = 假
按钮1.可视 = 假
弹出提示("通过验证,祝您使用愉快")
否则如果 卡密到期时间 <= 设备时间 则
弹出提示("卡密已到期")
结束 如果
结束 如果
结束 判断
结束 事件
事件 MySQL数据库1.修改记录完毕(添加结果 为 逻辑型)
判断 添加结果
分支 真
弹出提示("卡密激活成功")
结束 判断
结束 事件
过程 验证()
查库命令头 = "查设备在卡密系统注册的信息"
MySQL数据库1.查询记录("卡密表","使用者,过期时间","使用者=" & "'" & 手机1.取IMEI码() & "'")
结束 过程
~~~
说两个地方吧,剩下的自行体会:
首先是命令头,就是这个东西:
![](https://img.kancloud.cn/e7/ac/e7acb3eb2f41ca90d70ef9a3af241194_1031x556.png)
![](https://img.kancloud.cn/ad/62/ad62c09b9dc914a89073694766164a4d_1033x555.png)
这个东西的作用就是我们如果需要两次调用到同一个事件,为了区分事件下应该响应那个代码块而设定的规则。
另一个点就是一定要注意不要数据库连接命令写完了立即调查询命令,因为连接命令执行了此时正在连接还没有连上,你去查询肯定什么都查不到,要等连接数据库完毕后抛出的事件里面写一个判断连接成功下面再写这个查询,如下图:
![](https://img.kancloud.cn/8b/66/8b66356708d3f0cde82c1dfecf1473ff_854x281.png)
这里的验证过程会立即调查库指令
![](https://img.kancloud.cn/17/57/175723f9198e9bc0329de8ed5814dc8b_628x97.png)