laravel框架基础知识

一.TP5Laravel框架的区别

 区别:

1提交数据的方式,Laravel在提交表单时需要在表单中加入{csrf_field}来防止跨域攻击,而TP不会。

 2路由,Laravel必须先定义,再使用,路由文件为routes.phpTP在配置文件中开启路由后,路由格式是:'路由表达式' => '路由地址和参数'(使用路由的前提是URL支持phthinfo并且开启路由),路由可以使URL更符合SEO

3中间件,Laravel的中间件,中间件就是HTTP请求到达之前经过的层,通过中间件我们可以验证用户是否登录等一些通用操作。

4操作数据库方式,都可以使用实例化(建立相对应的模型类)和DB:table('表名')来操作数据库,使用原生查询时不太相同,Laravel使用Db::操作('原生sql')TP使用Db::query('原生sql')

5Laravel升级十分简易,而TP大版本的升级要重构代码

6.条件判断语句书写方式的差异:

Laravel框架里 if else判断语句和foreach语句 书写时必须以@if开头  @endif结尾,如果没有则报语法错误,@foreach @endforeach同理;

TP框架则和PHP语法规则使用方式一致直接ifesle语句判断和foreach循环遍历

二.CSRF保护

CSRF跨站点请求伪造(CrossSite 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'));

(一)基本路由注册

// 路由注册的方法还可以使用anymatch

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

     1select 方法*/

       /*返回是二维数组结果集,里面都是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',*/

/*2insert方法*/

   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(),countmaxminavg 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

 

 

猜你喜欢

转载自blog.csdn.net/I_am_lonely/article/details/80487094