yii使用checkBoxList的时候如何进行选中

原本以为官方的手册中会提供相关的方法,但是查询以后发现没有,抱着尝试的态度在修改的时候将对应的字段转换成数据,然后居然成功了;

[php]

<?php
if($model->role_id) $model->role_id = explode(‘|’ ,$model->role_id);
echo $form->checkBoxList($model,’role_id’,$roles,array(‘separator’=>’&nbsp;’));
?>

[/php]

Yii modules中设置layout的方法

在入口控制器中设置
第一种,$this->layout = ‘main';
第二种,$this->layout = ‘/layouts/main';//如果用“//”开头默认会调用protected/view/layouts/main
第三种,$this->layout = ‘xxx.views.layouts.main';//xxx为模块的id

phpcms后台分页时进行多表查询

在对phpcms进行二次开发的过程中,后台的列表都是用的是$this->db->listinfo()方法进行查询的,跟踪代码后发现$this->db中没有提供只用使用sql查询然后分页的方法,于是在model.class.php中扩展一个类似的方法,步骤:

1、打开model.class.php文件,添加如下代码,保存

[php]</p>
<p>/**<br />
* 查询多表数据并分页<br />
* @param $data 要查询的字段<br />
* @param $sql sql语句<br />
* @param $order 排序<br />
* @param $page<br />
* @param $pagesize<br />
* @return unknown_type<br />
*/<br />
final public function mylistinfo($data = ”,$sql=”,$order=”, $page = 1, $pagesize = 20, $setpages = 10,$urlrule = ”,$array = array()) {<br />
$this-&gt;number = $this-&gt;db-&gt;count_sql($sql);<br />
$page = max(intval($page), 1);<br />
$offset = $pagesize*($page-1);<br />
$this-&gt;pages = pages($this-&gt;number, $page, $pagesize, $urlrule, $array, $setpages);<br />
$array = array();<br />
if ($this-&gt;number &gt; 0) {<br />
return $this-&gt;db-&gt;select_sql($data, $sql, $order, &quot;$offset, $pagesize&quot;);<br />
} else {<br />
return array();<br />
}<br />
}</p>
<p>[/php]

2、打开mysql.class.php文件,添加如下代码,保存

[php]</p>
<p>/**<br />
* 数据库查询执行方法<br />
* @param $sql 要执行的sql语句<br />
* @return 返回查询的统计条数<br />
*/<br />
public function count_sql($sql) {<br />
if(!is_resource($this-&gt;link)) {<br />
$this-&gt;connect();<br />
}</p>
<p> return mysql_result(mysql_query(‘select count(*) from ‘.$sql),0);<br />
}<br />
/**<br />
* 执行sql语句<br />
* @param $data 需要查询的字段值[例`name`,`gender`,`birthday`]<br />
* @param $sql sql语句[不包括select和from]<br />
* @param $order 排序<br />
* @param $limit 查询限制<br />
* @return array 查询结果集数组<br />
*/<br />
public function select_sql($data,$sql,$order,$limit = ”) {<br />
$limit = $limit == ” ? ” : ‘ LIMIT ‘.$limit;<br />
$sql = ‘select ‘.$data.’ from ‘.$sql.$order.$limit;<br />
$this-&gt;execute($sql);<br />
if(!is_resource($this-&gt;lastqueryid)) {<br />
return $this-&gt;lastqueryid;<br />
}</p>
<p>$datalist = array();<br />
while(($rs = $this-&gt;fetch_next()) != false) {<br />
if($key) {<br />
$datalist[$rs[$key]] = $rs;<br />
} else {<br />
$datalist[] = $rs;<br />
}<br />
}<br />
$this-&gt;free_result();<br />
return $datalist;<br />
}</p>
<p>[/php]

3、修改查询

[php]$this-&gt;db-&gt;mylistinfo(‘要查询的字段’,’ 查询语句从from后面开始’,’排序或扩充’, $page,1,’10’);[/php]

使用sql调整字段顺序

alter table 表名
change 字段名 新字段名 字段类型 默认值 after 字段名(跳到哪个字段之后)

例如:
alter table erp_order change order_status order_status int(11) default 1 after note

php合并数组键值保持不变的方法

方法1:foreach遍历

[php]$a = array("111"=>"aaa","112"=>"bbb");

$b = array("113"=>"ccc","114"=>"ddd");
$c = array();
foreach( $a as $key => $value ) {
$c[$key] = $value;
}
foreach( $b as $key => $value ) {
$c[$key] = $value;
}[/php]

方法2:数组合并

这个数组合并并不是要直接使用数组的合并函数,如果使用array_merge()来合并数组,数组的键值要是数字的话,所有的键都会从0重新开始,这显然不是我们需要的结果,那么就只能使用上面的笨办法了么?当然不是,我们可以将两个数组直接相加,这样就可以得到需要合并的结果了,例如:

[php]$a = array("111"=>"aaa","112"=>"bbb");

$b = array("113"=>"ccc","114"=>"ddd");
$c = $a+$b;
}[/php]

Yii配置权限管理

1、导入权限数据表
找到framework/web/auth/schema.sql ,导入到你的数据库

2、配置权限组件

[php][/php]

‘components‘ => array(
   //……
   ‘authManager‘=>array(
           ‘class‘=>‘CDbAuthManager‘,//认证类名称,此处为默认的,也可以修改成你自己的
           ‘connectionID’=>’db’,//使用的数据库组件
           ‘itemTable‘ => ‘pre_auth_item‘,//认证项表名称
           ‘itemChildTable‘ => ‘pre_auth_item_child‘,//认证项父子关系
           ‘assignmentTable‘ => ‘pre_auth_assignment‘,//认证项赋权关系
       ),
  //……

[php][/php]

 

 

3、判断是否具有访问权限

[php][/php]

if(Yii::app()->user->checkAccess(‘具体权限’)){

}

[php][/php]

这个方法可以用于视图中判断相应的权限按钮是否显示,同是也可以在 控制器的方法accessRules()中过滤登录的用户是否有使用权限;在前面配置认证类的时候可以重写一个自己的类来覆盖这个方法,原来的这个方法都是基于数据库处理的,为了不影响程序的性能可以考虑加上缓存的处理机制。

为redis设置密码

越来越多的应用使用nosql,redis便是其中的一种,网上找了几个教程安装完毕后,发现直接连接可以直接使用了,突然想到,要是任何人都能链接就可以使用了,那么这个对数据的安全性就太低了啊!

于是又找了几篇文章,发现原来是可以设置密码的;设置方法如下:

编辑redis.conf,找到

# requirepass foobared去掉注释,foobared改为自己的密码

然后链接redis后需要用auth()方法设置你刚才输入的密码

yii使用ajax验证表单数据的时候,如何同时验证两个模型?

一般情况下:

[php]

if(isset($_POST[‘ajax’]) && $_POST[‘ajax’]===’account-_form-form’)
{
echo CActiveForm::validate($model);
Yii::app()->end();
}

[/php]

解决方法:

[php]

if(isset($_POST[‘ajax’]) && $_POST[‘ajax’]===’account-_form-form’)
{
echo CActiveForm::validate(array($model1,$model2));
Yii::app()->end();
}

[/php]

MySQL如何在高并发场景下更新并保持数据正确性

一张表 两个字段 一个id 一个useCount
表里存了100个id 每个id对应自己的useCount
业务场景是:当id每使用一次 useCount要加1。 当useCount大于1000时 这个id就不能在被使用了(换句话说 无法从数据库中查出)

在高并发情况下,会遇到一种问题:
假设数据表中有一条记录为 id=123456; useCount=999
a与b两个连接并发查询这个id 123456 都执行下列sql:

select * from table where id=123456 and useCount < 1000

a先执行 得到id 123456的useCount是999 之后在程序里做了一些逻辑判断或业务操作后执行sql: update useCount + 1
在a做判断且没有update之前 b也执行了查询sql 发现useCount是999 之后它也会执行sql: update useCount +1
但是 事实上b不应该取得这个id 因为a已经是第1000个使用者

所以请教一下 在高并发情况下 仅使用数据库 如何完成这一需求?

1、使用悲观锁:

select * from table where id=123456 and useCount < 1000 for update;

则 b 连接的事务 会被 a连接的事务block; 直到a的事务结束,b的select才能返回.

2、使用乐观锁:
每次update判断 useCount;
假设a,b连接都拿到 id 123456的useCount是999, update语句写为:

update table set useCount=useCount+1 where id=123456 and useCount=999;

程序中查询上述update返回值,如果为1则表明更新了一条记录, update成功;
如果为0, 则表示没有更新任何记录, 即useCount值已经被更改了, 则重新查询useCount,重新提交update.

yii加载框架自带的js或者css文件

加载核心框架自带的jquery:

[php]Yii::app()-&gt;clientScript-&gt;registerCoreScript(‘jquery’,CClientScript::POS_HEAD);[/php]

加载jquery-ui

[php]Yii::app()-&gt;clientScript-&gt;registerCoreScript(‘jquery.ui’,CClientScript::POS_HEAD);[/php]

加载jquery-ui的css文件

[php]Yii::app()-&gt;clientScript-&gt;registerCssFile(Yii::app()-&gt;clientScript-&gt;getCoreScriptUrl().’/jui/css/base/jquery-ui.css’);[/php]

yii框架中还带有其他的核心文件,可以参考/framework/web/js/packages.php