一.TP5和Laravel框架的区别
区别:
1、提交数据的方式,Laravel在提交表单时需要在表单中加入{csrf_field}来防止跨域攻击,而TP不会。
2、路由,Laravel必须先定义,再使用,路由文件为routes.php,TP在配置文件中开启路由后,路由格式是:'路由表达式' => '路由地址和参数'(使用路由的前提是URL支持phthinfo并且开启路由),路由可以使URL更符合SEO。
3、中间件,Laravel的中间件,中间件就是HTTP请求到达之前经过的层,通过中间件我们可以验证用户是否登录等一些通用操作。
4、操作数据库方式,都可以使用实例化(建立相对应的模型类)和DB:table('表名')来操作数据库,使用原生查询时不太相同,Laravel使用Db::操作('原生sql'),TP使用Db::query('原生sql');
5、Laravel升级十分简易,而TP大版本的升级要重构代码。
6.条件判断语句书写方式的差异:
Laravel框架里 if else判断语句和foreach语句 书写时必须以@if开头 以@endif结尾,如果没有则报语法错误,@foreach @endforeach同理;
而TP框架则和PHP语法规则使用方式一致直接ifesle语句判断和foreach循环遍历
二.CSRF保护
CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,
防御CSRF攻击:
目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。
(一)给模板分配变量
// 方法一
/* return view('firstclass.index',['name'=>'Alice','number'=>123]);*/
//方法二
/* return view('firstclass.index')->with('name','Jerry')->with('password','123456');*/
// 方法三
$str1='welcome';
$str2="Alice";
return view('firstclass.index',compact('str1','str2'));
(一)基本路由注册
// 路由注册的方法还可以使用any和match
Route::any('hello.html',function(){
return "hello !welcome";
});
Route::match(['get','post'],'b.html',function(){
return "hello !welcome";
});
1.可以在路由注册中直接渲染模板,使用Route::get('x.html',function(){return view('x')})
2.给单一控制器注册路由,在路由中只需要写类名就可以,不需要写方法名字,使用Route::get('unique.html','uniqueController');
注意,单一控制器的方法名字需要使用invoke()
3.给controllers下面的文件夹里面的控制器注册路由,使用Route::get('login.html','home\LoginController@login');
4.给views下面包含的文件夹里面的模板注册路由使用Route::get('adminindex.html',function(){
return view('admin.index');
});
5. 给控制器里面渲染的方法注册路由,使用Route::get('first.html','类名@方法名');
(二)数据库配置
《1》使用原生sql
(1)select 方法*/
/*返回是二维数组结果集,里面都是php对象,不管在模板还是控制器都需要使用访问对象的方式去访问*/
// $sql="select * from user";
//$res=DB::select($sql);
/*dump($res);*/
// return view('SecondClass.index',['res'=>$res]);
// 参数绑定的sql(使用占位符):可以防止sql注入
$sql="select * from user where class=:c ";
$res =DB::select($sql,['c'=>"计科一班"]);
/* return view('SecondClass.index',['res'=>$res]);*/
}
/*
运行原生的sql语句新增,
在config下面的app里面设置默认时区'timezone' => 'PRC',*/
/*(2)insert方法*/
public function add()
{
$datatime=date('Y-m-d H:i:s',time());
$sql="insert into user (name,sex,age,class,school,registertime) values ('小花','女',12,'计科一班','西安工程大学','$datatime')";
$res=DB::insert($sql);
dump($res);
}
/*(3)原生sql修改方法update*/
/*返回受影响的行数*/
public function update()
{
$sql="update user set class='软件工程1501' where name='筱筱'";
$res=DB::update($sql);
dump($res);
}
/*(4)原生sql删除方法delete*/
/*返回受影响的行数*/
public function delete()
{
$sql="delete from user where name='筱筱'";
$res=DB::delete($sql);
dump($res);
}
/*(5)数据库事务*/
/**
* transaction()自动实现事务
您可以在 DB facade 上使用 transaction 方法,在数据库事务中运行一组操作。如果在事务 Closure 中抛出一个异常,那么事务将自动回滚。如果 Closure 成功执行,事务将自动被提交。您不需要担心在使用事务方法时手动回滚或提交。
什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
*/
public function shiwu()
{
DB::transaction(function(){
DB::update("update user set class='软件工程1501' where name='罗志祥'");
DB::delete("delete from user where id='筱筱'");
});
}
// 手动实现事务
/*如果您想要手工开始一个事务,并且对回滚和提交有完全的控制,那么您可以在 DB facade 上使用 beginTransaction 方法:
DB::beginTransaction();
您可以通过 rollBack 方法回滚事务:
DB::rollBack();
最后, 您可以通过 commit 方法提交事务:
DB::commit();
*/
《2》查询构造器
/*(1)从数据表中获取所有的数据列get()*/
public function test()
{
$res= DB::table('user')->get();
dump($res) ;
}
/* return view('SecondClass.index',['res'=>$res]); */
/*(2)从数据表中获取单个列或行#*/
public function first()
{
$res= DB::table('user')->first();
dump($res) ;
return view('SecondClass.index1',['res'=>$res]);
}
/*(3)对大数据的分块处理chunk()方法,第一个参数代表每一次操作多少条数据*/
public function chunk()
{
$res=DB::table('user')->orderBy('id')->chunk(2,function($class){
foreach ($class as $k)
{
echo $k->name;
}
return false;
});
}
/*(4)聚合函数 count(),count、 max、 min、 avg 和 sum*/
/*(5)指定一个 Select 子句*/
// 当然,你并不会总是想从数据表中选出所有的字段。这时可使用 select 方法自定义一个 select 子句来查询指定的字段:
/*distinct 方法允许你强制让查询返回不重复的结果:*/
public function Select()
{
$res=DB::table('user')->select('id','name','school')->distinct()->get();
dump($res);
}
/*(6)连接查询join*/
public function join()
{
$res=DB::table('score')
->join('user','score.id','=','user.id')
->join('course','course.cid','=','score.id')
->select('user.name','score.*')
->get();
dump($res);
}
/*(7)where子句*/
public function where()
{
/*$res=DB::table('user')->where('id','6')->get();*/
/* $res=DB::table('user')->where('id','>=','6')->get();*/
/* $res=DB::table('user')->where('name','like','%苏%')->get();*/
/* $res=DB::table('user')->whereIn('id',[1,4,6])->get();*/
/*$res=DB::table('user')->whereBetween('id',[1,6])->get();*/
/*这个查询适用于该字段默认值为NULL且允许为空*/
/* $res=DB::table('user')->wherenull('registertime')->get();*/
/*whereDate 方法比较某字段的值与指定的日期是否相等:相应的还有: / whereMonth / whereDay / whereYear*/
/* $res=DB::table('user')->wheredate('registertime','2018-04-19')->get();*/
/*orderBy排序,默认正序*/
/* $res=DB::table('user')->orderBy('id','desc')->get();*/
/*groupby分组*/
$res=DB::table('user')->groupBy('class')->avg('id');
dump($res);
}
}
(三)模型层的建立以及使用
《1》模型层的建立
1》模型层的命名是(如果数据表的名字是复数形式)去掉s的名字.php
注意:如果数据表的名字并非复数,那么需要在模型层的class里面加一句:protected $table=””你的数据表的名字”;
主键#
Eloquent 也会假设每个数据表都有一个叫做 id 的主键字段。你也可以定义一个 $primaryKey 属性来重写这个约定。
此外,Eloquent 假定主键是一个递增的整数值,这意味着在默认情况下主键将自动的被强制转换为 int。 如果你想使用非递增或者非数字的主键,你必须在你的模型 public $incrementing 属性设置为false。