如何打造一个通用的云数据库

前言

作为一个客户端仔,如果想自己做一个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吧,哈哈哈哈。

你可能感兴趣的:(如何打造一个通用的云数据库)