Yii框架
命名空间
相同类名在不同的命名空间里,会被认为是不同的类
实例化类的时候 new 命名空间 类
use关键字 use 命名空间 类 默认后面使用的就都是声明命名空间里的类
use后,若要再使用指定命名空间里的类,可 use 命名空间 as 新的名字
不在命名空间里的类,是全局类 new \类名 指的就是实例化顶层类
Yii框架 控制器
请求组件
yii框架全局类里的请求组建:Yii::$app->request; Yii::$app->request->get('id',20); //第二个参数指若id没有传值,默认用第二个值 Yii::$app->request->isGet/isPost //判断请求类型 Yii::$app->request->userIp; //获取请求的ip地址
响应组件
$res = Yii::$app->response; $res->statusCode = 404; //状态码设置 $res->headers->add('pragma','no-cache'); //消息头设置,不缓存消息 $res->headers->set('pragma','max-age=5'); //消息头设置,缓存5s $res->headers->remove('pragma'); //消息头设置,移除 //跳转 $res->headers->add('location','http://home.corp.elong.com') Yii的Controller提供专门函数: $this->redirect('http://home.corp.elong.com') //文件下载 $res->headers->add('content-disposition','attatchment',"filename='a.jpg'") ; Yii提供包装方法: $res->sendFile('./b.jpg'); //将消息存到b.jpg
session
//session组件 $session = Yii::$app->session; $session->isActive; //判断session是否被开启 $session->open(); //开启session $session->set('user','hangview'); //前面变量,后面值,保存位置在php.ini里设置 $session->get('user'); //取数据 $session->remove('user'); //删除数据 //数组形式设置 $session['user'] = 'hangview'; unset($session['user']); //删除数据 //为何session既能当对象,又能当数组使用: PHP中提供一个ArrayAccess的接口,实现这个接口的类,其对象都可以被当作数组来使用 //不同浏览器向服务器发送请求时,服务器能识别出浏览器来源 浏览器cookie里 PHPSESSIONID 作为入口去服务器对应文件找到session存储值 //response组件cookies集合 $cookies = Yii::$app->response->cookies; $cookie_data = ['name'=>'user','value'=>'hangview']; $cookies->add(new yii\web\Cookie($cookie_data)); //写cookie,值经过加密;修改的话重新插一次值即可 $cookies->remove('user'); // 删除cookie //从请求中拿到cookie数据,用到请求组件里的cookie集合 $cookies = Yii::$app->request->cookies; $cookies->getValue('user',20); //想拿哪个拿哪个,不存在的值默认用第二个参数作为返回值 //config web.php 'cookieValidationKey' => //用来给cookie加密
view
yii\helpers\Html
Html::encode(); //跨站脚本攻击
Yii框架 数据模型
数据模型
活动记录 yii\db\ActiveRecord
单表查询数据:
findBySql
//class Test extends ActiveRecord{} $sql = 'select * from test where id = 1'; $res = Test::findBySql($sql)->all(); //all()将每条sql记录包装成一个对象,然后返回一个数组 //sql注入 : 用户传入参数 $id(如'1 or 1=1',会将所有数据都抓出来 ) $sql = 'select * from test where id = ' . $id; //占位符,整体带入避免sql注入 $sql = 'select * from test where id = :id'; $res = Test::findBySql($sql,[':id'=>$id])->all();
find
//id=1 Test::find()->where(['id'=>1])->all(); //id>0 Test::find()->where(['>','id',0])->all(); //1<id<2 Test::find()->where(['between','id',1,2])->all(); //title like "%hangview%" Test::find()->where(['like','title','hangview'])->all(); //查询结果转化为数组,降低内存使用率 Test::find()->where(['like','title','hangview'])->asArray()->all(); //批量查询 foreach(Test::find->batch(1000) as $tests){ //每次拿1000条数据 pirint_r(tests); }
单表删除数据:
//删除数据 $res = Test::find()->where(['id'=>1])->all(); $res[0]->delete(); Test::deleteAll('id>:id',['id'=>0]);
添加数据:
//增加数据 $test = new Test; $test->id = 1; $test->title = 'hangview' $test->validate(); //启用rules校验 if($test->hasErrors()){ //错误处理 } $test->save(); //合法验证 //TEST public function rules(){ return [ //验证器 ['id','integer'], ['title','string',length=>[0,5]], ]; }
修改数据
$test = Test::find()->where['id'=>4]->one(); $test->title = 'hang'; $test->save();
关联查询
//获取顾客对应订单信息 $customer = Customer::find()->where(['name'=>'hangview'])->one(); $orders = $customer->hasMany('Order::className(),['customerId'=> id])->asArray()->all(); //封装 class Customer extends ActiveRecord{ //获取顾客订单信息 public function getOrders(){ $return $this->hasMany(Order::className(),['customer_id' => 'id'])->asArray(); } } $orders = $customer->getOrders(); //当访问对象不存在属性时,php调用__get()方法-》AR里调用get+属性名字:getOrders()->all() $orders = $customer->orders; //获取订单对应顾客 $order->hasOne(Customer::className(),['id'=>'customerId'])->asArray(); $order = Order::find()->where(['id'=>1])->one(); $customer = $order->customer;
查询性能问题
//关联查询结果缓存 $orders = $customer->orders; //select * frome order ... unset($customer->orders); // 不unset的话会从缓存读取 $orders = $customer->orders; //关联查询的多次查询 $customers = Customer::find()->all(); foreach($customers as $customer){ $orders = $customer->orders; //每次访问都会去赌一次数据库,效率很低 } //with(属性) selsect * from Order where customerId in(....) //只进行一次数据库查询即可 $customers = Customer::find()->with('orders')->all();