—#
1 安装yii2
composer create-project --prefer-dist yiisoft/yii2-app-basic yii
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
url
如果使用渲染函数转发到指定页面渲染,此时则无法在actionView()
方法内输出echo
,只能在指定页面进行输出
还可以使用render传递参数
输出包含html代码的变量,存在xss注入问题
注意:这里传参用
&id=2
而不是?id=2
读取cookie使用request,增删改cookie使用reponse
view
中的this
的字段context
,即$this->context
,指的是controller
中的$this
<?php
var_dump($this->context->id); //输出Controller
var_dump($this->context->action->id ); // 输出action
var_dump($this->context->enc); // 输出Controller的成员变量
<?php
$this->registerJsFile('@web/js/test.js');
?>
<button id="ajaxtest" onclick="submitAjax()">test</button>
public function actionAjax()
{
$id = $_GET['id'];
$uid = $_POST['uid'];
return json_encode(["id" => $id]);
}
function submitAjax(){
$.post({
url:"http://localhost/site/ajax?id=234324",
data:{
"uid":111111},
dataType: "json",
success:function(data){
console.log(data);
alert(data.id);
}
})
}
使用ajax时,只需要加上
dataType: "json"
即可使用axios时,发送json数据,需要配置
web.php
,这样才能接受到json格式的数据
axios 发送的数据都是json格式的数据,而Yii2默认的配置是不能识别这种格式的,官方文档上已经做了说明,需要在web.php
下进行配置才能识别json数据。
为了使 API 接收 JSON 格式的输入数据,配置 request 应用程序组件的 parsers 属性使用 yii\web\JsonParser
用于JSON输入
'parsers' => [
'application/json' => 'yii\web\JsonParser',
'text/json' => 'yii\web\JsonParser',
]
其他方式无法获取的参数,必须使用
request组价
接收参数,即\Yii::$app->request
axiostest() {
axios.post("http://localhost/site/ajax",{
id:23432,
uid:1111,
}
)
.then(res=>{
console.log(res.data.id);
alert(res.data.id);
})
}
public function actionAjax()
{
$req = \Yii::$app->request;
$id = $reqaxio定时器->post('id');
$uid = $req->post('uid');
return json_encode(["id" => $id,'uid'=>$uid]);
}
<?php
$this->registerJsFile('@web/js/test.js');
?>
<div id="app">
<button @click="axiostest()">test</button>
</div>
public function actionAjax()
{
$a = \Yii::$app->request;
$id = $a->post('id');
$uid = $a->post('uid');
return json_encode(["id" => $id,'uid'=>$uid]);
}
new Vue({
el:'#app',
data: {
param:{
'id':23432,
'uid':1111,
}
},
methods: {
axiostest() {
axios.post("http://localhost/site/ajax",{
'id':23432,
'uid':1111,
}
)
.then(res=>{
console.log(res.data.id);
alert(res.data.id);
})
}
}
})
Model对象放在models目录下
使用load()函数给model对象字段赋值,如果不符合字段值约束rules,也能赋值,但调用字段值校验函数validate()时会返回false
如果用表单控件
ActiveForm
给model赋值,如果不符合字段值约束规则rules
,则无法提交表单,无法提交请求给后台处理
如果没有设置safe,则字段值必须要通过校验后,才能给字段赋值,否则无法给model赋值
trim不是校验规则
default不是校验规则
表单控件给model对象赋值,会自动触发字段校验validate()
表单如果没有写提交地址action,会默认提交给当前的action处理请求
ActiveForm提交默认使用post请求
model层
<?php
namespace app\models;
use yii\base\Model;
class UserForm extends Model{
public $name;
public $email;
public function rules(){
return [
['name','compare',compareValue =>'tom',message=>'不为tom'],
[['name','email'],required,message=>'必选字段'],
[['email'],'email',message=>'不是邮箱'],
];
}
}
controller层
<?php
namespace app\controllers;
use app\models\UserForm;
use Yii;
use yii\web\Controller;
class TestController extends Controller
{
public function actionTest2()
{
$model = new UserForm;
$model->load(Yii::$app->request->post()); // 获取post请求值
if ($model->validate()) { // 成功提交表单后
Yii::$app->session->setFlash("success", '提交表单成功'); // 提示框
}
return $this->render(test2, ['model' => $model]);
}
}
视图层view:表单ActiveForm
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
$form = ActiveForm::begin();
?>
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<div>
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end() ?>
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Article extends ActiveRecord
{
public static function tableName() // 设置要连接的表table
{
return 'test_my.rbid_change_info_test';
}
public static function getDb() // 设置要连接的数据库
{
return \Yii::$app->db01;
}
}
find()
返回的是对象ActiveQuery
,ActiveQuery
继承Query
,可以使用QueryBuilder继续查询操作
findAll()
、findOne
返回的是结果集数组
dml操作的函数都有返回值(影响的记录数)
save()可以用于插入/更新记录到数据库(推荐)
推荐使用save()实现插入、更新操作
save()会触发model对象的字段值验证rules,触发validate()
等价于:
createCommand()返回的是对象
test_my
下的表(dsn中指定了数据库)'dsn' => 'mysql:host=localhost;dbname=test_my;port=2039'
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;dbname=test_my;port=2039', // 可以指定要连接的数据库,可以不指定
'username' => 'apollo-rw', // 用户名
'password' => 'QBT094bt', // 密码
'charset' => 'utf8'
];
test.tb1
'dsn' => 'mysql:host=localhost;port=2039'
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;port=2039', // 可以指定要连接的数据库,可以不指定
'username' => 'apollo-rw', // 用户名
'password' => 'QBT094bt', // 密码
'charset' => 'utf8'
];
<?php
return [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=localhost;port=2039',
'username' => 'apollo-rw',
'password' => 'QBT094bt',
'charset' => 'utf8',
'tablePrefix' => 'tb_'
];
// 返回多行. 每行都是列名和值的关联数组.
// 如果该查询没有结果则返回空数组
$posts = Yii::$app->db->createCommand('SELECT * FROM post')
->queryAll();
// 返回一行 (第一行)
// 如果该查询没有结果则返回 false
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')
->queryOne();
// 返回一列 (第一列)
// 如果该查询没有结果则返回空数组
$titles = Yii::$app->db->createCommand('SELECT title FROM post')
->queryColumn();
// 返回一个标量值,第一行第一列
// 如果该查询没有结果则返回 false
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')
->queryScalar();
写法一:
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValue(':id', $_GET['id'])
->bindValue(':status', 1)
->queryOne();
写法二:
$params = [':id' => $_GET['id'], ':status' => 1];
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status')
->bindValues($params)
->queryOne();
写法三:推荐
$params = [':id' => $_GET['id'], ':status' => 1];
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', $params)
->queryAll();
// 等价于
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=:id AND status=:status', [':id' => $_GET['id'], ':status' => 1])
->queryAll();
use Yii;
public function actionTest(){
$sql = "select * from rbid_change_info_test where from_rbid=:from_rbid";
$res = Yii::$app->db01->createCommand($sql)
->bindValue(':from_rbid', $_GET['from_rbid'])
->queryAll();
$param = [
'res'=>$res
];
return $this->render('test',$param);
}
使用Query对象只能查询数据库,但可以使用createCommand() 来实现dml操作
que
use Yii;
public function actionTest2(){
$db01 = Yii::$app->db01; // 连接数据库
$res = (new Query())
->from('rbid_change_info_test')
->Where(['like','from_name','贝纳通'])
->andWhere(['<','month','2021-01-30'])
->limit(10)
->all($db01);
$param = [
res=>$res,
];
return $this->render(test2,$param);
}
createCommand()返回的是对象,all()返回的是数组
获取createCommand后,可以执行dml操作
导入
Query对象只能进行select查询操作
存在sql注入问题,可以通过占位符处理
不会有sql注入问题
即查询
in
#
用于拼接多个查询条件
在参数上和
where
的相同,但会跳过变量为空值的情况
where在查询变量值时,需要判断变量值是否为空,否则会出现查询空值
IS NULL
的情况
filterWhere无法查询空值的情况,不需要判断变量值是否为空
和where的使用方式一致
contoller层
use Yii;
use yii\data\Pagination;
use yii\db\Qurraery;
public function actionTest()
{
$db01 = Yii::$app->db01; // 连接数据库
$query = new Query();
$res = $query
->from('test_my.rbid_change_info_test');
$totalCount = $res->count('*', $db01); //查询总记录数
$pages = new Pagination([
'totalCount' => $totalCount, //查询总记录数
'pageSize' => 10, //每页记录数
]);
// 获取分页查询的数据
$res = $res
->offset($pages->offset)
->limit($pages->limit)
->all($db01);
$param = [
res => $res, //结果集
pages => $pages, // 分页对象
totalCount => $totalCount,
];
return $this->render(test, $param);
}
视图层view
<!-- 分页处理 -->
<?php
if ($res) {
echo LinkPager::widget([
'pagination' => $pages,
'nextPageLabel' => '下一页',
'prevPageLabel' => '上一页',
'firstPageLabel' => '首页',
'lastPageLabel' => '尾页',
]);
}
?>
use Yii;
$db01 = Yii::$app->db01; // 连接数据库
$transaction = $db01->beginTransaction();
$res
->createCommand($db01)
->delete('test_my.t', 'from_rbid=:from_rbid', [':from_rbid' => 11])
->execute();
// $transaction->rollBack();
$transaction->commit();
需要绑定model对象,自动进行validate()校验字段
如果不符合rules校验规则,则无法提交表单
推荐使用ActiveForm或者原生的html表单控件,ActiveForm控件不方便设置样式
<?php $form = ActiveForm::begin(); ?>
<?= $form
->field($model, 'name', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '姓名', 'class' => 'col-form-label mr-4']])
->textInput(['autofocus' => true, 'placeholder' => '输入姓名', 'class' => 'form-control col-sm-2'])
?>
<?= $form
->field($model, 'email', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '邮箱', 'class' => 'col-form-label mr-4']])
->textInput(['class' => 'form-control col-sm-2', 'placeholder' => '输入邮箱'])
?>
<?=
$form
->field($model, 'textArea', ['options' => ['class' => 'form-group row'], 'labelOptions' => ['label' => '留言', 'class' => 'col-form-label mr-4']])
->textarea(['rows' => 8, 'class' => 'col-sm-4', 'placeholder' => '输入留言'])
?>
<div class="from-group">
<input type="submit" value="submit" class='btn btn-primary'>
</div>
<?php ActiveForm::end() ?>
和html自己的表单控件一样,不会绑定model对象
类似使用
Input()
函数创建控件,只是可以用model
对象的字段值填充控件
比如使用ActiveRecord
获取表的记录字段值来填充控件,或者给ActiveRecord
对象赋值(ActiveRecord
继承Model
)
推荐用Url::to([''])
代替Url::current()
<form action="<?=Url::to(['form'])?>" class="input-group">
</form>
$this->params['breadcrumbs'][] = [label => 'Contact', url => ['/site/about']];
$this->params['breadcrumbs'][] = helllo;
$this->params['breadcrumbs'][] = abcd;
$this->registerJsFile('@web/js/test/test.js');
$this->registerCssFile('@web/css/test/test.css');
在控制台执行的脚本,需要放在
commands
目录下,但无法使用Xdebugaction方法的返回值return无法输出内容,内部使用echo可以在console中输出内容
文章浏览阅读15次。空化气泡的大小和相应的空化能量可以通过调整完全标度的振幅水平来操纵和数字控制。通过强调超声技术中的更高通量处理和防止样品污染,Epigentek EpiSonic超声仪可以轻松集成到现有的实验室工作流程中,并且特别适合与表观遗传学和下一代应用的兼容性。Epigentek的EpiSonic已成为一种有效的剪切设备,用于在染色质免疫沉淀技术中制备染色质样品,以及用于下一代测序平台的DNA文库制备。该装置的经济性及其多重样品的能力使其成为每个实验室拥有的经济高效的工具,而不仅仅是核心设施。
文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文 本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。 我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气
文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s
文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态
文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法
文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树: 节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...
文章浏览阅读3.4k次。//config的设置是全局的layui.config({ base: '/res/js/' //假设这是你存放拓展模块的根目录}).extend({ //设定模块别名 mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名 ,mod1: 'admin/mod1' //相对于上述 base 目录的子目录}); //你也可以忽略 base 设定的根目录,直接在 extend 指定路径(主要:该功能为 layui 2.2.0 新增)layui.exten_layui extend
文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构
文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。
文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量
文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates
文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...