谁一开始就是大神?

PHP 第57页

PHP

关联查询字段数据类型转换问题[2.0]

Newyak阅读(44)

有三张表需要通过中间表关联查询,中间表关联字段 两个关联字段数据类型不一样,需要转换一下。怎么转换。如下图(错误代码)
AR查询 ziduanzhuanhuan34.png

正确的sql语句
如何转换成下面正确的sql
SELECT COUNT(*) FROM "report_record" LEFT JOIN "users" ON "report_record"."ident" = "users".uuid || '' LEFT JOIN "user_certs" ON
"users"."uid" = "user_certs"."uid" LEFT JOIN "room" ON "report_record"."rid" = "room"."rid"

数据类型转换?你给的语句好像也没转换吧

yii2属性、事件、行为是个什么概念。[2.0]

dmKeo阅读(40)

这个三个大类,有一个爹,叫组件。
1、属性 很好理解,就是类的一个部分,或叫成员。然后,通过php 魔术方法 __get __set 在调用或设置时触发 访问类的成员,这个在yii2中常用到的。非常方便,好用。

2、行为 behavior 这个也好说。如:在入库或修改 操作可以定义 自动填充时间,我理解成方法执行前会自动执行的定义的代码。这块我用的不是很多,还不是很深入。请大神补充。

3、事件 这个事件我看文档,到现在也明白么回事。他的应用场景,什么时候用过。求大神解惑。。

4、谢谢回主。

确实不太好理解,主要是这些概念实在是又点绕,简单的理解呢,你可以把事件理解为钩子,举个例子,比如用户一登陆就自动发邮件和短信,或者数据库一执行sql就记录sql语句以便分析性能等,这是phalcon2的事件代码,你可以稍微理解下:
yii2的事件也差不多的,首先得on绑定,类似于phalcon2的attach附加到那个组件,目前yii2支持全局函数,对象以及类,回调绑定,然后在triggers触发就可以了,至于更深层次的理解,得多测试代码了!希望能帮到您!!
纠正下楼主的
类的成员包括类属性和类方法 属性属于成员
事件可以参考js 当你触发了什么事件 然后执行什么动作
事件:就是观察者模式!!!
设计模式而已,只是把名字叫 “事件”,
你也可以设计类似的,取名叫 “大事件”,“事件大”。。。

新人请教,关于表单插件的实现[2.0]

CandyFox阅读(46)

例如:我把文章页的description单独做为一个插件。单独建一个description表和model。
文章添加或更新成功后,通过afterSave把文章id和description的值传给description的model中完成这个功能。
但是因为类似的功能比较多,想通过后台管理哪些功能是否开放。
那么,就是说我插件的model和view表单都是动态调用的。请教这种功能实现思路。

建一个功能表,字段如下
功能ID 功能名字 功能是否开启 功能文件路径
当功能开启的时候,导入功能的SQL文件建立具体功能(描述)表,当功能关闭时,导入删除具体功能表的SQL
使用功能之前先去查功能表这个功能是否开启

session的过期时间[2.0]

Aibyyak阅读(40)

我感觉要么是SESSION过期时间没设置好,或者是SESSION有缓存。

$session = Yii::$app->session;
$session->open();
$session['user'] = [
'id' => $only[0]->id,
    'permissions' => $only[0]->permissions,
    'phone' => $only[0]->phone,
    'password' => $only[0]->password,
    'mask' => $only[0]->mask,
    'name' => $only[0]->name,
    'sex' => $only[0]->sex,
    'birthday' => $only[0]->birthday,
];
$this->user = $session['user'];
$session->close();
'session' => [
	'timeout' => 2,
],

用Yii::$app->user->login($user);自动就会用session保存用户信息,如果用户已经登录,直接用Yii::$app->user->identity就可以取到$user的信息了。 可以用Yii::$app->user->isGuest()判断是否登录。Yii::$app->user->logout()退出登录。
小伙,你每次登陆的时候不更新用户的 SESSION 信息吗?
快点给我金钱,哈哈
如果是要保存登录信息,自动登录的话,应该是要用cookie保存的,你用session的话,浏览器关闭了就木有了,就得重新登录了~
如果是要做自动登录,数据库中增加auth_key字段即可,模版中的登录程序就会自动实现记住我自动登录的
你既然调用了Yii::$app->session就不用再调用open了
了解原理,你给你写下原理:
知道这个原理,你就可以封装函数了,比如封装一个设置过期的session函数了
调用setCookieParams();
session的过期时间配置有误,不是用timeout,
‘session’ => [
]

怎么知道用户是否在线的?如何设计[2.0]

Slyfans阅读(45)

怎么知道用户是否在线的?如何设计

首先,建一个MEMORY引擎的表tbl_online,字段分别为ip, time,当用户访问的时候,先判断此ip是否存在于表tbl_online,如果不存在,插入一条新记录,如果存在,更新time。在线会员,可以把ip写成用户的id。
然后,写一个计划任务,每分钟执行一次。比如,咱们网站在线的定义为半小时访问过,所以计划任务会把time在半小时之外的删除掉。
其实MEMORY引擎已经很快了,可以看做是对内存的操作。当然如果换成cache会更好。
两种方式
1.用户表里有个字段 代表 此用户是否在线
2.设计一张在线用户表 用户登录之后 写此表
‘当用户访问的时候’是指访问任何页面,那就是在任何一个页面都要进行判断么?
Good.

怎么在Yii::$app->request->post()中追加数据[2.0]

Candyfrog阅读(61)

如题,

$model = $this->findModel($id);
        
$_POST['Test']['update_time'] = time();
        
if ($model->load(Yii::$app->request->post()) && $model->save()) {
    return $this->redirect(['index']);
}

我想在保存之前加一个更新时间,但是直接修改$_POST没有用数据库update_time字段并没有数据。

废这些劲干毛。。。。这样不一样吗~
不是有behaviors自动更新时间么?
学习了,谢谢
请教个问题:
Yii2 updateAll方法,如果一条数据存在包含多个Object的数组,$set object的值,只修改第一条,怎么让所有满足条件的object对应值都修改?
{
}
上面是我的数据库格式
我要修改props满足条件的所有数据,但是只会更改第一条
按照MVC来说,更新时间属于M的,建议放在Model里,最后就是使用befereSave()方法就可以保存好了,如下
public function beforeSave($insert){
上面大神都说的很好,再教你一招,不写代码。
mysql 时间字段用 timestamp 类型,设置为 ON UPDATE
(自动更新时间)

判断表是否存在的问题[2.0]

Tinaapple阅读(47)

我是想判断表是否存在,然后添加表
但提示 Call to a member function createCommand() on a non-object
请问要怎么处理?

<?php
namespace frontend\controllers;
use yii\web\Controller;
use yii\db\Migration;
use yii\db\Schema;
class TableController extends Controller
{
    public function actionIndex()
    {
        $mir = new Migration();  
        $sch = new \yii\db\mysql\Schema;  
        $tableName='shang';

        $table=$db->createCommand("SHOW TABLES LIKE '".$tableName."'")->queryAll();
        if($table==null)        {
            echo '1';
        }else{
            echo '2';
        }

        // $mir->createTable('shang', [  
        //     'id' => 'pk',  
        //     'title' => $sch::TYPE_STRING . ' NOT NULL',  
        //     'content' => $sch::TYPE_TEXT,  
        // ]);  

    }

}

判断表是否存在有好多种方法,如:
判断表字段是否存在:
可以用migration里面的方法:

composer.phar貌似安装成功,OPENSSL的问题不知咋解决,[2.0]

HaHseagull阅读(44)

执行php composer.phar global require "fxp/composer-asset-plugin:1.0.0",也报错
4HKMXN.png

19Q.png
求大神指导。

被墙了骚年。把 composer.json 里的更新地址换成国内的吧。
如果用的是PHPstudy,在PHP扩展设置里打勾,还有执行fxp/composer-asset-plugin:~1.0.0报错有可能是打错了,·和~要区分,我之前也是同样问题

文件上传的bug[2.0]

Jadelovely阅读(53)

文档里,文件上的示例代码。
控制器里

       if (Yii::$app->request->isPost) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');

加上验证,改成

       if (Yii::$app->request->isPost  && $model->validate()) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');

于是文件就不能上传了,提示请选择一个文件,是不是bug?
为嘛gii自动生成的代码里都不带$model->validate(),谁能彻底的解释下?
为了安全是不是该把服务器端和客户端验证都做了?

load放到imageFile属性赋值uploaded对象后,另外load了就不要validate了,load默认自动验证。
imageFile还没有数据加载进模型了 如何验证?验证得放到下面赋值了再验证。

不同场景下验证规则失效[2.0]

lovepony阅读(44)

 ['password', 'required', 'on' => 'create'],
 ['password', 'string', 'min' => 6],
 ['password', 'check'],

上面是rules()里面的规则, password字段不是数据库自带的,我添加进去的. 按理来说第三行check方法会在所有场景下都验证,但为什么只在create时候执行, update时跳过了呢?

而且我在调用之前也设置了 $model->scenario = 'update';

scenarios()也设置了

    public function scenarios()
    {
        $scenarios = parent::scenarios();
        $scenarios['update'] = ['username', 'email', 'status'];
        return $scenarios;
    }

附上一段代码,是在insert/update之前调用的validate函数,如下;注意其中的
这里的activeAttributes是当前的scenario所包含的属性,即 [‘username’, ’email’, ‘status’],接下来的校验之针对这几个属性做教研,不会针对password做校验。
其中 $validator->validateAttributes($this, $attributeNames);是获取当前scneriao的所有validator,然后利用这些validator对scenario包含的属性进行校验;根据你的设置,当前的validator是包含['password','check']的,但是validator检验属性的时候是要检验validator指定的属性(password)和scnario属性(email,username…)的交集;所以实际上该validator啥也没做。
修改一下update需要检验的属性就可以了:$scenarios[‘update’] = [‘username’, ’email’, ‘status’,’password’];这样update场景下会执行pssword check和min validator
假如
scenarios 沒有設置
你的寫法會讓所有的欄位被驗證
但你
override scenarios 的方法, 也設置了情境如下
$scenarios[‘update’] = [‘username’, ’email’, ‘status’]; // 當你情境為 update 時, 指驗證後方指定的欄位
你後方尚未加入 password 所以會跳過阿~~~
按你现在的配置,只是在create时才是必须的呀,别的场景下略过也不算错误吧。

登录

找回密码

注册