前言
作为一个客户端仔,如果想自己做一个APP上线,那该怎么办?虽然界面可以写,但后台接口呢?数据保存在哪?总得有接口提供吧。这里先给大家推荐一个好用的东西,Bmob后端云,这个东西,其实就是一个云数据库,给你提供方便的增删查改api,然后把数据保存在服务器上,这样,你就可以自己搞APP了,不用后台给你接口。这个东西,还支持微信小程序、快应用等等。
开篇
刚刚买了一个服务器,学了点PHP,我要开始装逼了,php大佬们觉得有问题,可以私信我。今天,就教大家如何打造一个云数据库,就像Bmob那样。
使用示例
1、我们希望调用是通过sdk的方式,这样比较直观。如下,我们只需这样调用就行。
js篇:
查询数据
function find() {
var x = new XData("test");
x.addParm("name", "景天");
x.find(function(result) {
for(var i = 0; i < result.length; i++) {
alert(result[i].name);
}
}, function(errorinfo) {
alert(errorinfo)
});
}
我们来一行一行看
var x = new XData("test"); //===》var x = new XData({{数据表名}});
XData 是js里面封装的一个对象,你可以用你喜欢的名字;
test 是数据表名,什么person表啊,order表啊,什么的,不过要注意关键字。
x.addParm("name", "景天");//===》查询条件,查询name为景天的数据。
addParm(key,value)方法,是查询条件的api,如果查全部数据,那就去掉这个,如果查多个条件,比如说查name为景天,sex为男的数据,那就是:
x.addParm("name", "景天");
x.addParm("sex", "男");
类似这样,添加组合就行了。
那其他的查询条件呢?例如按照某个字段排序、返回多少条数据,这些也是一样可以的,只需要添加类似的api方法就好。
x.find(function(result) {
for(var i = 0; i < result.length; i++) {
alert(result[i].name);
}
}, function(errorinfo) {
alert(errorinfo)
});
查询结果,第一个方法回调的是查询的结果数组,不用再json了,已经是一个数组了。第二个方法回调的是错误信息,可以直接弹框提示就好,或者加个code码,进行不同的判断。
增加数据
function add() {
var x = new XData("test");
x.addParm("name", "景天");
x.addParm("content", "景天是个大英雄");
x.add(function(result) {
alert("增加成功")
}, function(errorinfo) {
alert(errorinfo)
});
}
呐,类似的api,应该不用解释了。
修改数据
function update() {
var x = new XData("test");
x.addParm("content", "景天好帅");
x.setId("4");
x.update(function(result) {
alert("更新成功")
}, function(errorinfo) {
alert(errorinfo)
});
}
这里多了一个方法:x.setId("4");
设置要修改的数据id,每个数据库表,都有一个自增的id,其实不建议用这个,为啥?因为数字容易被人看出来,乱调这个更新api就GG。所以,一般会生成一个objectId的字段,这个是增加数据的时候就生成,随机的几位乱码。
删除数据
var x = new XData("test");
x.setId("4");
x.del(function(result) {
alert("删除成功")
}, function(errorinfo) {
alert(errorinfo + "fail")
});
删除数据,只需一个方法就行啦,设置要删除的id。
如何开发?
好啦,我们说完怎样调用sdk了,那下面我们说说如何来实现这个sdk。
PHP开发
上篇博客,已经说到怎样操作数据库的增删查改了,那我们留意一下增删查改的流程:
1、创建连接数据库
2、检测连接
3、连接SQL语句
4、检测结果、输出
5、关闭连接
那其实,增删查改不同的地方,只有SQL语句和结果输出。然后针对每个数据表,查询条件,去动态的修改SQL语句,那理论上就能打造出一个通用的云数据库了。
比如说:
$sql = "SELECT * FROM `my_order` ORDER BY id DESC LIMIT 100";
这条是默认的查询语句,查询 my_order 表里面的100条数据,按照id来降序返回。
$sql = "SELECT * FROM `my_order` WHERE status='1' ORDER BY id DESC LIMIT 100";
这条则是多了一个查询条件,查询status=1的数据。
那增加,删除,更新的也是一样的道理,只需修改对应的SQL语句就行了。PHP操作数据库语句
那原理知道了,我们开始写代码:
$tableName = $_GET['tableName'];
$data = $_GET['data'];
if ($tableName == "") {
die('{"code":401,"msg":"请输入表名"}');
}
首先,我们定义两个参数,一个是tableName,就是表名,一个是data,是查询条件或者是增加的参数,json格式化的字符串。
// 创建连接
$conn = mysqli_connect($servername, $username, $password, $dbname);
mysqli_query($conn, "set names 'UTF8'");
// 检测连接
if (!$conn) {
die('{"code":400,"msg":"' . mysqli_connect_error($conn) . '"}');
}
然后创建连接,然后下面是重点
if ($data == ""){
$sql = "SELECT * FROM ".$tableName ." ORDER BY id DESC LIMIT 100";
}else{
$data = json_decode($data, true);
if(count($data)==0){
$sql = "SELECT * FROM ".$tableName ." ORDER BY id DESC LIMIT 100";
}else{
$values = "";
for ($n = 0; $n < count($data); $n++) {
$values = $values . $data[$n]["key"] .'="'. $data[$n]["value"] . '" and ';
}
$values = rtrim($values, " and ");
$sql = "SELECT * FROM ".$tableName." WHERE ".$values ." ORDER BY id DESC LIMIT 100";
}
}
上面这段代码,就是把接收到的tableName参数和data参数,解析出完整的SQL语句,所以接口内容大概是这样的 check?tableName=test&data=[{"key":"name","value":"景天"}],然后经过上面代码转换后,输出就是:
$sql = "SELECT * FROM `my_order` WHERE name='景天' ORDER BY id DESC LIMIT 100";
ok,语句搞定,后面就是输出内容了:
$result = $conn->query($sql);
if ($result) {
//echo "查询成功";
while($row = $result->fetch_assoc()) {
$list[] = $row;
}
class Result{
public $code;
public $data;
}
$result = new Result();
$result -> code = 200;
if($list==null){
$result -> data = [];
}else{
$result -> data = $list;
}
$json = json_encode($result); //把数据转换为JSON数据.
echo $json;
} else {
echo '{"code":400,"msg":"查询失败"}';
}
mysqli_close($conn);
就这样,一个通用的查询接口就好了,你可以增加一些参数传递来做查询条件,比如根据什么值来排序等等,然后就是修改对应的SQL语句就行。
JS封装sdk
ok,接口有了,但我们之间调接口的话,貌似不是很直观,不方便,那我们就封装一下吧,下面以js为例,为毛以js呢?因为我也是刚学js啊,安卓的话,你们自己封装就好啊。
首先,js调接口,是下面这样:
$.ajax({
url: "http://xxxx/check.php?tableName=" + tableName + "&data=" jsonStr,
type: 'GET',
success: function(result) {
var data = JSON.parse(result)
}
});
那我们封装一下吧
function XData(tableName) {
this.tableName = tableName;
this.addParm = addParm;
this.setId = setId;
this.parms = parms;
this.find = find;
var parms = new Array();
var index;
function addParm(key, value) {
if(key != "" && value != "") {
keyData = new Object();
keyData.key = key;
keyData.value = value;
parms.push(keyData);
}
}
function setId(id) {
index = id;
}
function find(successCallback, errorCallback) {
$.ajax({
url: "http://xxxx/check.php?tableName=" + tableName + "&data=" + JSON.stringify(parms),
type: 'GET',
success: function(result) {
var data = JSON.parse(result)
if(data.code == 200) {
successCallback(data.data)
} else {
errorCallback(data.msg)
}
}
});
}
}
ok,搞掂,上面就是查询的方法,增加,删除,更新,按照上面类似的操作就好。那就可以直接调用了:
var x = new XData("test");
x.addParm("name", "景天");
x.find(function(result) {
for(var i = 0; i < result.length; i++) {
alert(result[i].name);
}
}, function(errorinfo) {
alert(errorinfo)
});
其他封装
安卓 iOS 等等,其他的封装,其实都差不多,就是把请求接口的地方处理一下,解析数据回调回去就行。
结语
好啦,这样,一个通用的云数据就搞好啦,前提是你得有服务器或者虚拟主机哈。不然的话,你就用Bmob吧,哈哈哈哈。