最近一直在学老师的tp教程,学习进度到了第五章(班级管理),其中学到很多有用的东西,并且解答了以前的一些疑惑,同时学习过程中遇到了不少的问题。
一. 学习情况
1.学习了对数据库的基本使用方法,以前一直觉得数据库是一个高大上的东西,使用之后发现数据库现阶段的使用还是很便利的基本的增删改查都有良好的图像化界面,对于新手还是比较友好的。
public function index()
{
$Teacher = new Teacher;
$teachers = $Teacher->select();
// 向V层传数据
$this->assign('teachers', $teachers);
// 取回打包后的数据
$htmls = $this->fetch();
// 将数据返回给用户
return $htmls;
}
3.了解了编程中的MCA编程思想:
M
= M
odule 它对应一个文件夹
C
= C
ontroller 它对应一个文件
A
= A
ction 它对应一个方法(它还有几个名字:触发器、函数、function、method)
每个 URL 都会对应唯一的一组 MCA,这组唯一的 MCA 会执行特定的 function。当用户访问一个 URL 时,就会执行一个对应的 function,我们把一些代码写在这个 function 中,那么相应的功能就实现了。就像我们前面输出 hello world 一样,是把一些输出 hello world 的代码放到了 index 模块下的 Index 控制器下的 function index() 中。
模块:module,控制器:controller,触发器:action。以后我们会越来越多的和它们打交道,每一个 URL 都会对应着一个触发器,我们有必要多花些精力把 MCA 弄明白。
【注意】: 我们把这个 function 又叫做触发器,而且我们仅将 Controller 中的 function 叫做触发器,原因大概是由于这个 function 如果想被执行的话,需要用户输入特定的 URL。我们说当用户输入特定的 URL 后,这个方法被触发
了,所以叫做触发器。
4.同时还学习了怎么用PHP进行数据库的增删改查,下面以更改为例:
操作分为六步:读取数据-->展示数据-->修改数据-->传递数据-->接收数据-->更新数据
老师提供了两种更新数据的方法(第一种是数组,第二种是对象),现以对象的方法为例,完整代码如下:
V层读取数据:
<td>
<a href="{:url('edit?id=' . $teacher->getData('id'))}">编辑</a>
<a href="{:url('delete?id=' . $teacher->getData('id'))}">删除</a>
</td>
C层更改数据:
public function edit()
{
// 获取传入ID
$id = Request::instance()->param('id/d');
// 在Teacher表模型中获取当前记录
if (is_null($Teacher = Teacher::get($id))) {
return '系统未找到ID为' . $id . '的记录';
}
// 将数据传给V层
$this->assign('Teacher', $Teacher);
// 获取封装好的V层内容
$htmls = $this->fetch();
// 将封装好的V层内容返回给用户
return $htmls;
}
public function updata
{
try {
// 接收数据,获取要更新的关键字信息
$id = Request::instance()->post('id/d');
$message = '更新成功';
// 获取当前对象
$Teacher = Teacher::get($id);
if (!is_null($Teacher)) {
// 写入要更新的数据
$Teacher->name = Request::instance()->post('name');
$Teacher->username = Request::instance()->post('username');
$Teacher->sex = Request::instance()->post('sex/d');
$Teacher->email = Request::instance()->post('email');
// 更新
if (false === $Teacher->validate(true)->save())
{
$message = '更新失败' . $Teacher->getError();
}
} else {
throw new \Exception("所更新的记录不存在", 1); // 调用PHP内置类时,需要在前面加上 \
}
} catch (\Exception $e) {
// 由于对异常进行了处理,如果发生了错误,我们仍然需要查看具体的异常位置及信息,那么需要将以下的代码的注释去掉
// throw $e;
$message = $e->getMessage();
}
return $message;
}
}
5. 实际编程中还要注意各个action的衔接,和对异常的处理,包括throw和try{}catch(){},使用哪一种要视情况而定比如,
获取到ThinkPHP的内置异常时,直接向上抛出,交给ThinkPHP处理
获取到正常的异常时,输出异常
之后学习了分页由于没有学习原理因此比较简单只需一个 paginate() 方法就可以实现,之后就学习了简单的查询通过where方法实现:
where('name', 'like', '%' . $name . '%');
6,以前虽然知道有cookie 与 session这种东西,但是对于他们的具体作用和实现原理却始终是一知半解的,现在知道了他们的具体作用——实现登陆,具体引用潘老师的总结:
总结如下:
1、当浏览器第一次访问服务器时,确切地说是一个域名时,那么是不会带有 cookie 信息的,然后服务器就会给它分配一个。只要服务器为浏览器分配了 cookie,那么在以后的访问中,浏览器就会自动带上这个 cookie 来访问我们了。
2、当然了,我们还会为这个 cookie 设置一个过期时间,如果超过了这个时间点,浏览器再访问服务器时,就会摈弃这个 cookie,然后再由服务器给它分配另一个 cookie。
cookie 的确是一个敏感信息,因为如果用户掌握到了我们的 cookie,就会以我们的身份去访问那个站点。所以 cookie 是不能够跨域的,就是说,A 服务器为浏览器分配的 cookie,浏览器在访问 B 站点时,是不会带上 A 服务器为其分配的 cookie 的。
7.对于编程潘老师在教程中常说的一句话是:
编程永远的三步曲:
- 写注释
- 写代码 + 测试代码(有写代码就必然有代码测试)
- 重构代码
二. 主要问题
学习中遇到了很多问题,有许多的低级而且费时的错误,比如照着例子敲代码却敲错了,然后一个个对照,花费大量的时间才找出错误,同时还有一些错误,提示控制器不存在,或者类不存在,这种错误有时候找半天都找不出错误,只能选择性放弃,先用git复制出实例代码,然后换到thinkphp5文件夹中。同时,还有一些地方难以理解,因为暂时未想起具体的地方,就不举例了。
三. 解决思路
敲代码时小心一点,还有发现不懂就要记录下问题,并找机会提问解决。
四. 总结
这段时间是忙碌并且充实的,期间有过迷茫,也有过被一个问题困住,百思不得解的烦躁,也有过解决难题后的巨大成就感,也有因为习惯不好,有时想先把某个问题放一放,事后来解决,却忘了忘了问题是什么的尴尬因此应该时刻记录问题,同时实际编程中应该牢记潘老师的编程三部曲:
- 写注释
- 写代码 + 测试代码(有写代码就必然有代码测试)
- 重构代码