谁一开始就是大神?

PHP 第100页

PHP

yii路径出现错误,我是新手,求大神教一下!!!![1.1]

Bellaapple阅读(84)

我原本用yiic webapp ../demos 建立一个在E:wamp/www/yii下的demos,用<?php echo Yii::getFrameworkPath(); ?>显示E:\wamp\www\yii\framework,但是现在我想把demos移动到wamp/www目录下面,不想用绝对路径,可是不知道怎么入手,下面是移动了demos位置,然后在http://localhost/demos查看,下面出现这样的错误,求解决方法和讲解一下!!!!!!各位大神们!!!!!

( ! ) Warning: require_once(E:\wamp\www\0512test/../framework/yii.php) [function.require-once]: failed to open stream: No such file or directory in E:\wamp\www\0512test\index.php on line 12

( ! ) Fatal error: require_once() [function.require]: Failed opening required 'E:\wamp\www\0512test/../framework/yii.php' (include_path='.;C:\php\pear') in E:\wamp\www\0512test\index.php on line 12

这是E:\wamp\www\0512test\index.php

<?php

// change the following paths if necessary
$yii=dirname(__FILE__).'/../framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';

// remove the following lines when in production mode
defined('YII_DEBUG') or define('YII_DEBUG',true);
// specify how many levels of call stack should be shown in each log message
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
require_once(dirname(__FILE__).'/protected/config/constants.php');
require_once($yii);
Yii::createWebApplication($config)->run();

问题出在这一句:
按照你提供的信息,应该是:

basic如何把user登陆数据更换为从数据库查询出来的数据[2.0]

littleslim阅读(85)

app\models\user.php有如下静态的信息

private static $users = [
        '100' => [
            'id' => '100',
            'username' => 'admin',
            'password' => 'admin',
            'authKey' => 'test100key',
            'accessToken' => '100-token',
        ],
];

如何换成自己从数据库获取的信息
或者和数据库信息关联

借用小黑豆同学的代码,希望可以帮到你。
下面是一个User model,继承了IdentityInterface接口, 里面有login验证方法
然后再action里类似的代码如下(举例):
这些代码当时我都看了,没有问题,model里的基本可以直接用,action是举例。
看LoginForm里有一个 User::find() 什么的玩意

yii2restful测试时,地址问题?[2.0]

liondolphin阅读(84)

为什么地址必须是v1/countries才能成功访问,
但是控制器明明是

<?php

namespace api\modules\v1\controllers;

use yii\rest\ActiveController;

/**
 * Country Controller API
 *
 * @author Budi Irawan <deerawan@gmail.com>
 */
class CountryController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\Country';    
}

也没有其他地方配置这个countries

配置url的时候把pluralize设为false,就不会自动把url转换成复数形式了,默认值是true,比如:
你的目录结构加了一个v1 目录呀
楼主 你好 不知道你用nginx怎么配置restful api的虚拟域名访问的? 我配置如下,但是一直报404错误,困扰我很久了

}

访问地址,都试过

http://api.denghp.com/v1/countries
http://api.denghp.com/v1/country

Yii框架1使用过滤器后为什么验证码不显示了?[1.1]

dmLion阅读(79)

我在控制器中添加:

public function filters(){
    return array(
        'accessControl',		
    );
}
public function accessRules(){
    return array(
        array(
            'allow',									
            'actions' 	=> array('setmessage','actions'),		
            'users'	=> array('@')						
        ),
        array('deny','users'=> array('*')						
        )
    );
}

访问控制好使,但是验证码不显示了

你的accessRule把验证码给阻止了,你在那里把验证码的action加上去,然后给予它全部人可视的权限
用markdown编辑下
显示验证码的action禁止访问了,就不显示了。你把captchaAction的名称加到allow里试试
感谢大家的回复。。。(凑数字)
码子来了

对分页型的数据缓存

Lvyyak阅读(80)

想问一下大家在对列表缓存数据的时候是怎么做的缓存

首先明确一点:
是不是必须显示全部数据?
如果是必须的,即使分出几万页也可以接受,那么你要想办法去实现这个效果。
场景分析:
如果你有30万信息,并且使用Mysql,那么你可以考虑一下以下几种方式:
1.通过页面缓存或者干脆生成HTML静态页的方式来实现,但是这样会产生很多的缓存文件,同时访问量很大的情况下磁盘的IO会进入瓶颈然后宕机。
2.通过SQLite数据库作缓存数据库,并且用SQL语句的MD5值作为表名,这样你可以实现复杂的分页操作,同时你运算的数据源是你缓存的结果集。
3.通过第三方K-V模块来实现对结果集的缓存
如果显示全部数据不是必须的,那你考虑的范围只是如何显示的更精准,而非更多,用户在更多和更精准之间往往选择后者。
一般使用yii\filters\PageCache来做分页缓存控制。

Modelruels()方法问题[2.0]

SwiftStone阅读(86)

我知道rule方法返回表单验证规则数组,但是如果我对表单提交的数据没有验证要求的话,那该怎么定义呢?我试过不重写rules()方法,结果模型就无法载入表单的数据,请大神说说。

把对应的属性设置为safe就不会验证了,另外加rules还额可以加on设置对应规则的场景。
这种问题,官方文档肯定有的。不验证的话你关闭rule就行啦
或者针对某字段可以用safe
[[‘price’], ‘safe’],

多个模型同时提交,如何收集表单数据?[2.0]

NeoEagle阅读(90)

先说我想问什么,现在有一个表格,比如商家登记要卖的商品:
商品名称 商品种类 数量
手机 电子产品 2
电脑 电子产品 1
书籍 书籍 10
这个表单如上已经填写好,现在提交后如何同时写入三条记录到数据库?
并且不一定仅仅是三条,要实现用户点击“添加”按钮就会多一行表单。
我的代码问题在哪里?
控制器:

public function actionRelease() 
    {
        $model = new Seller();
        $goods=[new Goods()];
        $count = count(Yii::$app->request->post('Goods', []));
        for($i = 1; $i < $count; $i++) {
            $goods[] = new Goods();
        }
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            $model->save(); 
            if (Model::loadMultiple($goods, Yii::$app->request->post()) && Model::validateMultiple($goods)) {
                foreach ($goods as $good) {
                    $good->release_date=  date('y-m-d',time());
                    $good->seller_id=$model->id;
                    $good->save(false);
                }
            return $this->render('release-confirm');
            }
            return $this->render('release-wrong');
        } else {
            // 无论是初始化显示还是数据验证错误
            return $this->render('release', ['model' => $model,'goods'=>$goods]);
        }
    }

视图:

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
//use kartik\select2\Select2;
?>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name'); ?>
<?= $form->field($model, 'gender')->dropDownList(['男'=>'男','女'=>'女']) ?>
<?= $form->field($model, 'student_number') ?>
<?= $form->field($model, 'mobile') ?>
<?= $form->field($model, 'if_big')->dropDownList(['有'=>'有','没有'=>'没有']) ?>
<?= $form->field($model, 'if_alipay')->dropDownList(['是'=>'是','否'=>'否']) ?>
<?= $form->field($model, 'if_present')->dropDownList(['是'=>'是','否'=>'否']) ?>
<?= $form->field($model, 'sell_time')->dropDownList(['全天'=>'全天','上午'=>'上午','下午'=>'下午']) ?>

<?php
foreach ($goods as $index => $v) {
    echo $form->field($v, "name[]")->label($v->name);
    echo $form->field($v, "cate[]")->dropDownList(['书籍'=>'书籍','生活用品'=>'生活用品','电子产品'=>'电子产品','其他'=>'其他'])->label($v->name);
    echo $form->field($v, "number[]")->label($v->name);
}
?>


<div class="form-group">
    <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>

模型数据如下:

<?php

namespace app\models;

use yii\db\ActiveRecord;
/**
 * LoginForm is the model behind the login form.
 */
class Goods extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;  
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['name', 'cate','number'], 'required'],
            // rememberMe must be a boolean value
            ['name', 'string','length'=>[1,10]],
            ['number', 'number'],
        ];
    }
    public function getSeller()
    {
        return $this->hasOne(Seller::className(), ['id' => 'seller_id']);
        //'id'是表seller里面的,'seller_id'是本表里面的
    }
    public function attributeLabels() {
        parent::attributeLabels();
        return [
            'name'=>'名称',
            'cate'=>'种类',
            'number'=>'数量',
            'sell_time'=>'登记时间',
            
        ];
    }
}

和:

<?php
namespace app\models;
use yii\db\ActiveRecord;

class Seller extends ActiveRecord
{
    public static function getDb()
    {
        return \Yii::$app->db2;
    }
    /**
     * @return array the validation rules.
     */
    public function rules()
    {
        return [
            [['name', 'gender','student_number','mobile','if_alipay','if_present','if_big','sell_time'], 'required'],
            ['name', 'string','length'=>[1,5]],
            ['student_number', 'number','min'=>0,'max'=>9999999999],
            ['mobile', 'number','min'=>0,'max'=>99999999999],
        ];
    }
    
    public function attributeLabels() {
        parent::attributeLabels();
        return 
        ['name'=>'姓名',
        'gender'=>'性别',
        'qq'=>'qq(选填)',
        'wechat'=>"微信(选填)",
            'student_number'=>'学生号',
            'major'=>'专业(选填)',
            'grade'=>'年级(选填)',
            'mobile'=>'手机号码',
            'if_big'=>'是否有大件商品',
            'if_present'=>'6.3号当天是否能亲自到场摆摊',
            'if_agent'=>'是否同意将书籍放入书籍专区,由工作人员售出',
            'if_together'=>'是否同意与他人合摊',
            'if_alipay'=>'是否同意用支付宝付款',
            'if_donate'=>'是否同意将未售出物品捐赠',
            'sell_time'=>'摆摊时间',
        ];
    }
    public function getGoods()
    {
        //建立一对多关系
        return $this->hasMany(Goods::className(), ['seller_id' => 'id']);
    }
    
}

官方文档我在看,这部分在开发中。求大牛解,我们比比速度。


这里有个Yii1的教程,你先参考一下:
http://www.yiichina.com/tutorial/9
视图:
感谢分享代码,在你的代码的基础上,我可以实现新增的时候一次插入多条数据。在网上找了js代码实现了点击‘新增一行’和‘删除’一行的功能。但是在更新数据的时候遇到了麻烦,如何在更新的时候,对新增加的行数据进行保存,而对删除了的行数据进行删除呢?
不知道你有没有已经解决了我遇到的问题?
但是rule验证是个问题,比如动态新增的文本框的值,如果为空值时,在多模型下validateMultiple()会返回全部错误,不知道题主怎么解的,目前研究出来的也只是通过开启表单ajax验证来解决这个rule的问题。
参考:
https://github.com/yiisoft/yii2/issues/9811
https://github.com/yiisoft/yii2/issues/1399
不错,学习了
field($v, “[{$index}]name”)

field($v, “{$index}name”),请问这两种写法谁是正确的?新手表示看不懂,这里的{}、[]应该怎么理解?
用来标识下表的,用field($v, ‘[‘.$index.’]name’)才可以。

Yii2模块init方法读取配置[2.0]

Bellacrab阅读(85)

学到模块这,按照文档上的,在模块init()方法中添加如下代码:

public function init()
{
    parent::init();
    //加载配置文件
    Yii::configure($this,__DIR__.'/config.php');
}

然后在当前目录下创建一个config.php文件:

return [
    //配置模块默认路由
    'defaultRoute'=>'default'
];

然后通过路由访问模块的时候,报错:

PHP Warning – yii\base\ErrorException

Invalid argument supplied for foreach()

    /**
     * Configures an object with the initial property values.
     * @param object $object the object to be configured
     * @param array $properties the property initial values given in terms of name-value pairs.
     * @return object the object itself
     */
    public static function configure($object, $properties)
    {
        foreach ($properties as $name => $value) {
            $object->$name = $value;
        }
 
        return $object;
    }

是说在configure方法中的,我就是按照文档上的写的,这样怎么修改呢?

虽然php是弱类型语言,但是也要注意形参和实参数据格式的一致性。你调用configure时第二个参数是个文件路径,而人家需要你提供数组。教科书上的例子也写的很清楚了:

created_at,updated_at更新时间和创建时间[2.0]

JackStag阅读(77)

问题这样的
created_at 创建时间
updated_at 更新时间

动作:
1、新增 created_at = updated_at = time()
2、更新 created_at 不变 updated_at = time()

在models里创建时间和更新时间都可以指定默认值为time()
为题来了,更新的时候创建时间也跟着变了,怎么办?

如果分不够群里CALL我哈

最终解决代码:

use yii\behaviors\TimestampBehavior;

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'update_at',
                //'value' => new Expression('NOW()'),
                //'value'=>$this->timeTemp(),
            ],
        ];
    }

使用它TimestampBehavior能帮助到你
创建时间为什么要变?
默认就是created_at和updated_at
我要分
使用 TimestampBehavior 准确无疑, yii 的创建用户就是这么玩的
我创建的时候 这两个时间一起插入数据库没有问题 但是当我修改的时候 两个时间没有变化
如果我同时给这两个时间加上值 update_at=time()和created_at=time() 数据库同时两个时间都更新了 我只想让update_at一个时间更新 怎么做
model
controller

Mac下xampp环境中yii2的migrate命令报错[2.0]

Aniyak阅读(82)

MacBook-Pro:yii_advanced$ php yii migrate
Yii Migration Tool (based on Yii v2.0.4)

Exception 'yii\db\Exception' with message 'SQLSTATE[HY000] [2002] No such file or directory'

in /Applications/XAMPP/xamppfiles/htdocs/yii_advanced/vendor/yiisoft/yii2/db/Connection.php:534

请问出现这种异常是因为啥呢?

看了这么多答案,发现就没有一个靠谱的,告诉你们两个靠谱的方式吧。
修改方法: 找到Yii根目录下的/yii文件打开,
第一行#!/usr/bin/env php 改成 #!/usr/bin/env /Applications/XAMPP/xamppfiles/bin/php
然后重启服务器再试试:)
可能是没有安装php-mysql扩展,也可能是MySQL的服务没有开启。
没有权限?怎么样才能十个字
骚年你装PDO了没?
我看到你用的macbook,那么请你尝试一下,右击你的项目文件夹,然后点显示简介,然后点最下面的锁,打开锁后,点击齿轮,点击应用到子文件夹及子…之类的文字,然后再试一下。
错误原因应该是:php找的对应的mysql.sock路径错了,mysql启动时候会创建一个mysql.sock,这个文件会有一个路径,建议检查下php对应的路径是否正确。
算了,都别猜了,把phpinfo关于mysql configure pdo等主要模块的图截上来,再讨论吧,这么猜,谁能猜得到,又不是华佗
basic/config/db.php
localhost改为127.0.0.1就可以了
我在解决时,用了一整天的时间,一开始以为是mysql,后来以为是php的问题
编译重装几次,最后发现是这个问题,但是解决方法还需要其他步骤。
感谢以下这位的博客:
http://www.iamlintao.com/5026.html
其实就是mac自带php,我们自己安装的PHP反而无法被系统env找出来。
修改方法: 找到Yii根目录下的/yii文件打开,
第一行#!/usr/bin/env php 改成 #!/usr/bin/env /(…你自己安装的php目录…)/bin
同时,解决时,要注意:还不是更改一句这么简单。
需要在终端输入:env
立马可以看到目前的PATH默认值
你可以看见,你自己安装的目录,肯定不在优先,而mac系统自带的php所在的目录反而在优先。
所以,你应当更改path的设置文件。
可以参考: http://www.th7.cn/system/mac/201409/70274.shtml
在我的机器中,是 /etc/bashrc 里边设置的,需要把PATH的第一个遍历目录改成你自己的目录。
还有:
(1)OSX10.11系统增强了权限,sudo也无法修改
先执行 sudo chmod 755 /etc/bashrc
然后 sudo vi /etc/bashrc
(2)修改后:source /etc/bashrc
(3)把终端exit退出,然后重新进去,输入env,你会发现PATH常量已经将你的PHP安装目录变为第一优先。
然后进入yii的主目录,输入./yii migrate
一切OK!!!!

登录

找回密码

注册