理一理老师的代码,以及功能如何实现?
本文所说的功能是基于老师给代码所能实现的
因此所谓的功能,不外乎增改查,以积分兑换为例
- 根据postman传入member_id和goods_id,查询对应的会员与积分商品信息
- 比较积分,判断是否足够兑换
- 满足时,分别修改会员积分及积分商品的库存,并生成订单
可以看出,功能的思考方向应该是在数据库的表操作上,该功能最后会影响哪些表,会对表进行哪些操作,围绕这些操作,我们可以扩展一些逻辑,下面以积分为例。
一、查询
查询信息这步就没有什么好说的了,不管什么功能,我们都不能直接使用用户传递过来的数据(无关紧要的除外),都需要通过数据库查询出来,一般通过id查询,可以查询单个用户信息或者全部信息。
这一步在原代码中已经有了较好的包装实现,具体在DB.php
public function select($conn, $table, $field, $where){
$sql = "SELECT " . $field . " FROM `" . $table . "` WHERE " . $where;
try {
$result = mysqli_query($conn, $sql);
if (!$result) {
return null;
}
return mysqli_fetch_all($result, MYSQLI_ASSOC);
} catch (\Exception $e) {
return null;
}
}
从代码中可以看出,mysqli_query(sql)是其核心调用API,
$conn 是数据库连接
$table 是要查询的表名
$field 是要查询的字段
$where 是要查询的条件
由这些条件,共同组装一条sql语句。(英文的句号“.”相当于Java中的字符串连接符“+”)。
For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries, mysqli_query() will return a mysqli_result object.
For other successful queries mysqli_query() will return TRUE.
Returns FALSE on failure.
这是mysqli_query源码关于返回值的注释,从这里可以看出,对于成功执行SELECT语句的返回值,是将查询结果返回。
使用:
$conn = (new DB())->connect();
$db = new DB();
$member = $db->select($conn, 'member', '*', 'member_id=' . $member_id);
//或者
$member = (new DB())->select($conn, 'member', '*', 'member_id=' . $member_id);
使用var_dump($member)可以看到
返回的信息是以数组存储的,这里有个小细节,从结构我们可以看出这是一个二维数组,因此取积分时应该用
$score = member[0]['score'];
查询单个信息也是同样道理
二、修改
修改update方法也是同理,区别只是返回值只会返回true或false,这点可以在源码注释中看到
以修改库存为例,$stock为查询出来的库存
$res = (new DB())->update($conn, 'score_goods', 'stock=' . ($stock - 1), 'sg_id=' . $sg_id);
var_dump($res);//检查操作是否成功,用于调试
三、插入
关于生成订单,也就是插入,老师的ImportOrder.php是存在问题的,经过测试发现,显示订单申报成功,实际上并不会在order_info表中插入一条数据,发现问题出现在sql上
原表的字段有
而在代码中,只有5个字段
$insert = [
'"' . $data['order_no'] . '"',
'"' . $data['person_name'] . '"',
'"' . $data['person_tel'] . '"',
'"' . $data['person_idcard'] . '"',
'"' . $data['order_fee'] . '"',
];
$sql = 'INSERT INTO `order_info` (order_no,person_name,person_tel,person_idcard,order_fee) VALUES ('. implode(',', $insert) . ')';
因此是需要补足的
$insert = [
'"' . $data['order_no'] . '"',
'"' . $data['person_name'] . '"',
'"' . $data['person_tel'] . '"',
'"' . $data['person_idcard'] . '"',
'"' . $data['order_fee'] . '"',
'"' . $data['sg_id'] . '"',
'"' . $data['order_time'] . '"',
'"' . $data['discount_fee'] . '"',
'"' . $data['fee'] . '"',
'"' . $data['num'] . '"',
'"' . $data['member_id'] . '"',
'"' . $data['saler_id'] . '"',
];
$sql = 'INSERT INTO `order_info` (order_no,person_name,person_tel,person_idcard,order_fee,sg_id,order_time,discount_fee,fee,num,member_id,saler_id) VALUES ('. implode(',', $insert) . ')';
接下来就可以使用postman测试一下了
可以看到,插入成功了
四、闲聊
最近有同学找我想要借鉴一下我的作业,其实吧我写的也是十分的简陋,而且里面调试所用信息皆为我的学号,没有太多的参考的意义,我也尝试过单独写,发现虽然功能简单,但是也十分耗时,写一份基本就一天没了,考虑到时间成本,我个人水平有限,对于同学们的请求,我也很为难。
有想过出简单的版本,但是怕同学们不会修改,导致重复,被老师发现,目前暂时没有较好的解决办法,如果有同学有好的想法,可以跟我聊聊。
写作不易,觉得还不错的点赞,支持一下,谢谢
如果还没调通,请仔细看这篇文章如何调通老师给的代码?
很多人会出现这个情况
这说明,漏了文章说的要去www/0929/DB.php中修改密码为自己改的密码