阿里云 OSS 图片上传iframe 实现异步上传

阿里云 OSS 图片上传iframe 实现异步上传 相关代码:
index.php:

<?php
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
if (isset($_POST) && !empty($_POST)) {
    echo "<pre>";
    var_dump($_POST);
    die;
}
?>
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://filela.b0.upaiyun.com/js/jquery-1.9.0.min.js"></script>
    </head>
    <body>
        <h1>添加操作</h1>
        <form action="" method="post" >
            <iframe src="upload.php"  frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no" allowtransparency="yes"></iframe><br/>
            名称: <input type="text" value="" name="name">
            <div id="res"> </div>
 
            <input type="submit" value="submit" />
        </form>
 
    </body>
</html>

upload.php

<?php
$access_id = '';
$access_key = '';
$policy = '{"expiration": "2120-01-01T12:00:00.000Z","conditions":[{"bucket": "ioutsider" },["content-length-range", 0, 104857600]]}';
$policy = base64_encode($policy);
$signature = base64_encode(hash_hmac('sha1', $policy, $access_key, true));
$file_name = date('Y') . '/' . date('m') . '/' . md5(microtime(true)) . '.jpg';
//print_r(get_headers('http://ioutsider.oss-cn-shenzhen.aliyuncs.com')); 
?>
 
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://filela.b0.upaiyun.com/js/jquery-1.9.0.min.js"></script>
    </head>
    <body>
        <form id="upload" action="http://ioutsider.oss-cn-shenzhen.aliyuncs.com" method="POST" enctype="multipart/form-data">
 
            <label for="file">选择文件:</label>
            <input type="hidden" name="OSSAccessKeyId" id="OSSAccessKeyId"  value="<?php echo $access_id; ?>" />
            <input type="hidden" name="policy" id="policy"  value='<?php echo $policy; ?>' />
            <input type="hidden" name="Signature" id="Signature"  value="<?php echo $signature; ?>" />
            <!--<input type="hidden" name="key" id="key"  value="upload/${filename}" />-->
            <input type="hidden" name="key" id="key"  value="<?php echo $file_name; ?>" />
            <input type="hidden" name="success_action_redirect" value="http://iphotos.me/res.php?img=<?php echo $file_name; ?>" />
            <input type="file" name="file" id="file" />
            <input type="submit" name="upload" value="上传" />
        </form>
    </body>
</html>

上传成功后跳转的页面:

<!DOCTYPE html>
<html>
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://filela.b0.upaiyun.com/js/jquery-1.9.0.min.js"></script>
    </head>
    <body>
        <?php $img = $_GET['img']; ?>
        <?php if ($img): ?>
            <img src='http://ioutsider.oss-cn-shenzhen.aliyuncs.com/<?php echo $img; ?>' width='200' height='200' />
            <script>
                $(function(){
                    alert('上传成功');
                    window.parent.$('#res').append("<input type='hidden' value='<?php echo $img ?>' name='path'>")
                })
            </script>
        <?php endif; ?>
    </body>
</html>

阿里云OSS 通过表单直接上传文件 Post Policy

<?php
$access_id = 'ACCESS_ID';
$access_key = 'OSS_ACCESS_KEY';
$url='http://ioutsider.oss-cn-shenzhen.aliyuncs.com';//更改成你自己的地址
$policy = '{"expiration": "2120-01-01T12:00:00.000Z","conditions":[{"bucket": "ioutsider" },["content-length-range", 0, 104857600]]}';
$policy = base64_encode($policy);
$signature = base64_encode(hash_hmac('sha1', $policy, $access_key, true));//生成认证签名
?>
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>文件上传</div>
        <form action="<?php echo $url;?>" method="post" enctype="multipart/form-data">
            <label for="file">选择文件:</label>
            <input type="hidden" name="OSSAccessKeyId" id="OSSAccessKeyId"  value="<?php echo $access_id; ?>" />
            <input type="hidden" name="policy" id="policy"  value='<?php echo $policy; ?>' />
            <input type="hidden" name="signature" id="signature"  value="<?php echo $signature; ?>" />
            <input type="hidden" name="key" id="key"  value="${filename}" />
            <input type="file" name="file" id="file" />
            <br />
            <input type="submit" name="submit" value="确定" />
        </form>
    </body>
</html>

Yii 数据分页及排序

在控制器:

class PostController extends Controller
{
    function actionIndex()
    {
        $criteria = new CDbCriteria();
        $count=Post::model()->count($criteria);
        $pages=new CPagination($count);
 
        // elements per page
        $pages->pageSize=5;
        $pages->applyLimit($criteria);
 
        // sorting
        $sort = new CSort('Post');
        $sort->attributes = array('id', 'title',);
        $sort->applyOrder($criteria);
 
        $models = Post::model()->findAll($criteria);
 
        $this->render('index', array(
            'models' => $models,
            'pages' => $pages,
            'sort' => $sort,
        ));
    }
}

在视图文件中:

<p><?php echo $sort->link('id')?></p>
<p><?php echo $sort->link('title')?></p>
<ol>
<?php foreach($models as $model):?>
    <li>
        <h2><?php echo $model->id?> - <?php echo $model->title?></h2>
    </li>
<?php endforeach?>
</ol>
 
<?php $this->widget('CLinkPager', array(
    'pages' => $pages,
))?>

PHP QR Code生成二维码

在线生成URL:qr.outsiderla.me
HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpqrcode.sourceforge.net/。
下 载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2。 phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本;参数$outfile表示是否输出二维码图片 文件,默认否;参数$level表示容错率,也就是有被覆盖的区域还能识别,分别是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%); 参数$size表示生成图片大小,默认是3;参数$margin表示二维码周围边框空白区域间距值;参数$saveandprint表示是否保存二维码并 显示。
. 代码如下:

public static function png($text, $outfile=false, $level=QR_ECLEVEL_L, $size=3, $margin=4, $saveandprint=false)    
{   
    $enc = QRencode::factory($level, $size, $margin);   
    return $enc-&gt;encodePNG($text, $outfile, $saveandprint=false);   
}

调用PHP QR Code非常简单,如下代码即可生成一张内容为”http://www.cnblogs.com/txw1958/”的二维码.

include 'phpqrcode.php'; 
QRcode::png('http://www.cnblogs.com/txw1958/');

那么实际应用中,我们会在二维码的中间加上自己的LOGO,已增强宣传效果。那如何生成含有logo的二维码呢?其实原理很简单,先使用PHP QR Code生成一张二维码图片,然后再利用php的image相关函数,将事先准备好的logo图片加入到刚生成的原始二维码图片中间,然后重新生成一张新 的二维码图片。
. 代码如下:

include 'phpqrcode.php';    
$value = 'http://www.cnblogs.com/txw1958/'; //二维码内容   
$errorCorrectionLevel = 'L';//容错级别   
$matrixPointSize = 6;//生成图片大小   
//生成二维码图片   
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2);   
$logo = 'logo.png';//准备好的logo图片   
$QR = 'qrcode.png';//已经生成的原始二维码图   
 
if ($logo !== FALSE) {   
    $QR = imagecreatefromstring(file_get_contents($QR));   
    $logo = imagecreatefromstring(file_get_contents($logo));   
    $QR_width = imagesx($QR);//二维码图片宽度   
    $QR_height = imagesy($QR);//二维码图片高度   
    $logo_width = imagesx($logo);//logo图片宽度   
    $logo_height = imagesy($logo);//logo图片高度   
    $logo_qr_width = $QR_width / 5;   
    $scale = $logo_width/$logo_qr_width;   
    $logo_qr_height = $logo_height/$scale;   
    $from_width = ($QR_width - $logo_qr_width) / 2;   
    //重新组合图片并调整大小   
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,   
    $logo_qr_height, $logo_width, $logo_height);   
}   
//输出图片   
imagepng($QR, 'helloweixin.png');   
echo '<img src="helloweixin.png" alt="" />';

由于二维码允许有一定的容错性,一般的二维码即使在遮住部分但仍然能够解码,经常我们扫描二维码的时候扫描到甚至不到一半时就能解码扫描结果,这是因为生成器会将部分信息重复表示来提高其容错度,这就是为什么我们在二维码中间加个LOGO图片并不影响解码结果的原因。

最后上自己的代码 :

&lt;?php
 
include "qrlib.php";
$data = "http://outsiderla.me"; // 二维码数据
$errorCorrectionLevel = "M"; // 纠错级别:L、M、Q、H
$matrixPointSize = 10; // 点的大小:1到10
$filename = "test.png"; // 生成的文件路径
QRcode::png($data, $filename, $errorCorrectionLevel, $matrixPointSize, 2); //在$filename处生成一张图片
 
 
$logo = 'log.JPG';
$QR = 'test.png';
 
if ($logo !== FALSE) {
 
    $QR = imagecreatefromstring(file_get_contents($QR));
    $logo = imagecreatefromstring(file_get_contents($logo));
    $QR_width = imagesx($QR);
    $QR_height = imagesy($QR);
    $logo_width = imagesx($logo);
    $logo_height = imagesy($logo);
    $logo_qr_width = $QR_width / 5;
    $scale = $logo_width / $logo_qr_width;
    $logo_qr_height = $logo_height / $scale;
    $from_width = ($QR_width - $logo_qr_width) / 2;
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
}
imagepng($QR, 'test.png');
$image = fread(fopen($filename, r), filesize($filename));
header("Content-type: image/JPEG", true);
 
echo $image; //此处为了显示在页面上

来自:http://www.cnblogs.com/txw1958/p/phpqrcode.html

An Easy Solution for Dependent dropDownList Using AJAX

Sometimes new Yii guys face problem to manage dependent dropDownList using AJAX. I am going to discuss an easy solution about this issue.

Example code:

Code in View

<?php                                   
  echo CHtml::dropDownList('region_id','', 
  array(2=>'New England',1=>'Middle Atlantic',3=>'East North Central'),
 
  array(
    'prompt'=>'Select Region',
    'ajax' => array(
    'type'=>'POST', 
    'url'=>Yii::app()->createUrl('YourController/loadcities'), //or $this->createUrl('loadcities') if '$this' extends CController
    'update'=>'#city_name', //or 'success' => 'function(data){...handle the data in the way you want...}',
  'data'=>array('region_id'=>'js:this.value'),
  ))); 
 
 
 
echo CHtml::dropDownList('city_name','', array(), array('prompt'=>'Select City'));
?>

Code in Controller

public function actionLoadcities()
{
   $data=RegionCity::model()->findAll('region_id=:region_id', 
   array(':region_id'=>(int) $_POST['region_id']));
 
   $data=CHtml::listData($data,'id','city_name');
 
   echo "<option value=''>Select City</option>";
   foreach($data as $value=>$city_name)
   echo CHtml::tag('option', array('value'=>$value),CHtml::encode($city_name),true);
}

I think this will help to understand actually how AJAX works in Yii for dependent dropDownList also AJAX working behavior in Yii framework.

在GridView中使用关联模型进行搜索和排序

在GridView中使用关联模型进行搜索和排序

首先我们有两个模型它们直接有关联:

class Author extends CActiveRecord {
...
}
 
class Post extends CActiveRecord {
...
    function relations() {
        return array(
            'author'=&gt;array( self::BELONGS_TO, 'Author', 'id_author' ),
        );
    }
...
}

当以网格形式显示所有 Post 时,我们希望显示作者的名字,并且可以通过作者名字中的关键字过滤 Post。提供这些功能的最好解决方式(在我看来)是:

首先需要在 Post 模型中添加一个新的属性,它用来保存搜索的字符串(即要搜索的作者名).也可以使用外键列来实现同样的效果,但是我不喜欢这么用,在搜索条件中保存搜索的字符串而不是外键 id.你还须在搜索条件中将这个新的属性的规则设置为 safe。

class Post extends CActiveRecord {
  public $author_search;
  ...
  public function rules() {
    return array(
      ...
      array( 'xxx,yyy,author_search', 'safe', 'on'=&gt;'search' ),
    );
  }

现在就可以在搜索条件(标准情况-每个模型都要一个 search 方法)中使用这个属性了。同时,我们需要使用条件的 ‘with’ 属性来指定我们的 Post 是通过哪个关系来获取作者(这种方式只需一次数据库查询而不是延迟加载中的多次查询)。

$criteria = new CDbCriteria;
$criteria-&gt;with = array( 'author' );
...
$criteria-&gt;compare( 'author.username', $this-&gt;author_search, true );
...

当我们修改搜索函数时,我们对返回的 CActiveDataProvider 添加一个新的功能

return new CActiveDataProvider( 'Post', array(
    'criteria'=&gt;$criteria,
    'sort'=&gt;array(
        'attributes'=&gt;array(
            'author_search'=&gt;array(
                'asc'=&gt;'author.username',
                'desc'=&gt;'author.username DESC',
            ),
            '*',
        ),
    ),
));

配置中排序部分的 attributes 允许我们覆盖默认值。当我们按 author_search 字段排序的时候,它将会按照指定的规则排序,最后的 * 表示其他字段按默认排序。通过这种方式我们也可以修改默认属性的排序(例如:用户指定按 last_name 列排序时,应该使用last_name和first_name结合排序).

到现在为止我们已经为我们的网格显示做好了前期准备

$this-&gt;widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=&gt;$model-&gt;search(),
    'filter'=&gt;$model,
    'columns'=&gt;array(
        'title',
        'post_time',
        array( 'name'=&gt;'author_search', 'value'=&gt;'$data-&gt;author-&gt;username' ),
        array(
            'class'=&gt;'CButtonColumn',
        ),
    ),
));

这就是所有,我们使用用户名代替用户ID外键列来排序,并且我们可以使用姓名关键字搜索.

转载自: 在GridView中使用关联模型进行搜索和排序

CActiveDataProvider, CArrayDataProvider, CSqlDataProvider做为gridview挂件的数据提供者的使用经验

首先构造测试数据 创建两个表:

--
-- 表的结构 `tbl_user`
--
 
CREATE TABLE IF NOT EXISTS `tbl_user` (
  `uid` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) NOT NULL,
  `password` VARCHAR(70) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 
--
-- 转存表中的数据 `tbl_user`
--
 
INSERT INTO `tbl_user` (`uid`, `username`, `password`) VALUES
(1, 'syang', 'syang');
 
-- --------------------------------------------------------
 
--
-- 表的结构 `tbl_userinfo`
--
 
CREATE TABLE IF NOT EXISTS `tbl_userinfo` (
  `infoid` INT(11) NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR(20) NOT NULL,
  `uid` INT(11) NOT NULL,
  PRIMARY KEY  (`infoid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 
--
-- 转存表中的数据 `tbl_userinfo`
--
 
INSERT INTO `tbl_userinfo` (`infoid`, `nickname`, `uid`) VALUES
(1, 'Song Yang', 1);

通过gii创建两个模型文件 User.php 和 Userinfo.php
修改User.php,添加关联代码

	public function relations()
	{
		return array(
		    'info'=> array(self::HAS_ONE, 'Userinfo', 'uid')
		);
	}

下面,我们建一个新的控制器,名为TestController.php,代码如下:

<?php
/**
 * Description of TestController
 *
 * @author syang
 */
class TestController extends Controller {
	public function actionIndex() {
 
		//AR数据提供
		$ar_provider = new CActiveDataProvider('User', array(
 
		));
 
		//Sql数据提供
		$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
		$count = User::model()->findBySql($sql)->count();
		$sql_provider = new CSqlDataProvider($sql, array(
		    'keyField'=>'uid',	//必须指定一个作为主键
		    'totalItemCount'=>$count,	//分页必须指定总记录数
		));
 
		//Array数据提供
		$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
		$array_data = Yii::app()->db->createCommand($sql)->queryAll();
		$array_provider = new CArrayDataProvider($array_data, array(
		    'keyField'=>'uid',	//必须指定一个作为主键
		));
 
		$this->render('index', array(
						'ar_provider'=>$ar_provider,
						'sql_provider'=>$sql_provider,
						'array_provider'=>$array_provider
 
					));
	}
}
?>

我们在view下建一个以控制器id命名的目录,如上为test,并在test目录下建立一个index.php的模块文件
代码如下:

<?php
 
echo "AR关联查询,示例:";
 
 $this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'ar',
 
	'dataProvider'=>$ar_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),       //name对应字段名
 
		array('header'=>'密码', 'value'=>'$data->password'),  //用value这样写也可以
 
		'info.infoid',
		array('header'=>'昵称', 'name'=>'info.nickname'),
		//或者这样array('header'=>'昵称', 'value'=>'$data->info->nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		),
 
	),
 
));
 
echo "Sql 查询,示例:";
 
$this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'sql',
 
	'dataProvider'=>$sql_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),
 
		array('header'=>'密码', 'value'=>'$data["password"]'),
 
		'infoid',
 
		array('header'=>'昵称', 'name'=>'nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		    	'viewButtonUrl'=>'Yii::app()->controller->createUrl("view",array("id"=>$data["uid"]))',
 
			'updateButtonUrl'=>'Yii::app()->controller->createUrl("update",array("id"=>$data["uid"]))',
 
			'deleteButtonUrl'=>'Yii::app()->controller->createUrl("delete",array("id"=>$data["uid"]))',
 
		),
 
	),
 
));
 
echo "Array 数据,示例:";
 
$this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'array',
 
	'dataProvider'=>$array_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),
 
		array('header'=>'密码', 'value'=>'$data["password"]'),
 
		'infoid',
 
		array('header'=>'昵称', 'name'=>'nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		    	'viewButtonUrl'=>'Yii::app()->controller->createUrl("view",array("id"=>$data["uid"]))',
 
			'updateButtonUrl'=>'Yii::app()->controller->createUrl("update",array("id"=>$data["uid"]))',
 
			'deleteButtonUrl'=>'Yii::app()->controller->createUrl("delete",array("id"=>$data["uid"]))',
 
		),
 
	),
 
)); ?>

总结:上面的示例演示了,使用CActiveDataProvider, CArrayDataProvider, CSqlDataProvider的例子
最简单的就是使用CActiveDataProvider,其他两个,在使用gridview挂件时,需要稍微修改一下,因为gridview原有button列上的连接使用的是$data->这种对象的方式
由于sql与array返回的数据都是数组,所以后面的地方改成数组就可以了。本例还演示了模型关联时使用CActiveDataProvider与gridview的列子。读者可以反复测试体会Yii的强大功能。

YII CArrayDataProvider 的使用

利用CArrayDataProvider,可以对一个数组里面的数据进行分页
action代码:

public function actionPage(){
            $rawData = array(
                array('id'=>1,'username'=>'aa','password'=>'aaaaaa'),
                array('id'=>2,'username'=>'bb','password'=>'aaaaaa'),
                array('id'=>3,'username'=>'cc','password'=>'aaaaaa'),
                array('id'=>4,'username'=>'dd','password'=>'aaaaaa'),
                array('id'=>5,'username'=>'ee','password'=>'aaaaaa'),
                array('id'=>6,'username'=>'ff','password'=>'aaaaaa'),
                array('id'=>7,'username'=>'gg','password'=>'aaaaaa'),
                array('id'=>8,'username'=>'hh','password'=>'aaaaaa'),
                array('id'=>9,'username'=>'jj','password'=>'aaaaaa'),
                array('id'=>10,'username'=>'qq','password'=>'aaaaaa'),
                array('id'=>11,'username'=>'www','password'=>'aaaaaa'),
                array('id'=>12,'username'=>'xx','password'=>'aaaaaa'),
                array('id'=>13,'username'=>'zz','password'=>'aaaaaa'),
            );
 
            $dataProvider=new CArrayDataProvider($rawData, array(
                'id'=>'user',
                'sort'=>array(
                    'attributes'=>array(
                         'id', 'username', 'password',
                    ),
                ),
                'pagination'=>array(
                    'pageSize'=>10,
                ),
            ));
            $this->render('page',array('dataProvider'=>$dataProvider));
        }

views代码:

 $this->widget('zii.widgets.grid.CGridView', array(
            'id'=>'effectivepolicy-grid',
            'dataProvider'=>$dataProvider,
            'emptyText'=>'没有找到数据.',
            'nullDisplay'=>'-',
            'columns'=>array(
 
                array(
                    'name'=>'用户名',
                    'value'=>'$data["username"]',
                    'htmlOptions'=>array('style'=>'width:55px;')
                ),
                                array(
                    'name'=>'密码',
                    'value'=>'$data["password"]',
                    'htmlOptions'=>array('style'=>'width:55px;')
                ),
            ),
        ));

Yii CDbCriteria 常用方法

Yii CDbCriteria 常用方法

    $criteria = new CDbCriteria;      
//函数方式
    $criteria->addCondition("id=1"); //查询条件,即where id = 1  
    $criteria->addInCondition('id', array(1,2,3,4,5)); //代表where id IN (1,23,,4,5,);  
    $criteria->addNotInCondition('id', array(1,2,3,4,5));//与上面正好相法,是NOT IN  
    $criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND  
    $criteria->addSearchCondition('name', '分类');//搜索条件,其实代表了。。where name like '%分类%'  
    $criteria->addBetweenCondition('id', 1, 4);//between 1 and 4   
 
    $criteria->compare('id', 1);    //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,  
                                    //即如果第二个参数是数组就会调用addInCondition  
 
    $criteria->addCondition("id = :id");  
    $criteria->params[':id']=1;  
 
//属性方式  
    $criteria->select = 'id,parentid,name'; //代表了要查询的字段,默认select='*';  
    $criteria->join = 'xxx'; //连接表  
    $criteria->with = 'xxx'; //调用relations   
    $criteria->limit = 10;    //取1条数据,如果小于0,则不作处理  
    $criteria->offset = 1;   //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10  
    $criteria->order = 'xxx DESC,XXX ASC' ;//排序条件  
    $criteria->group = 'group 条件';  
    $criteria->having = 'having 条件 ';  
    $criteria->distinct = FALSE; //是否唯一查询

相关实例代码:

$criteria = new CDbCriteria();
$criteria->select = 'table_name,model_id,sum(amount) total';
$criteria->group = 'table_name,model_id';
$criteria->addCondition("$nIdcId=4");//也可以$criteria->condition = "$nIdcId=4";
$aResult = accessory_info::model()->findAll($criteria);
 
 
$c = new CDbCriteria();
$c->select = 't.id, t.created_at, t.outsource_id, t.user_id, t.operate, t.content';
$c->join = 'LEFT JOIN outsource ON outsource.id=t.outsource_id';
$c->condition = 'outsource.idc_id IN(' . implode(',', $idc_ids)  . ')';
 
if($last_log_id) {
	$c->condition .= " AND t.id > $last_log_id";
}
 
$c->limit = 20;
$c->order = 't.id DESC';
 
$logs = OutsourceProcessLog::model()->findAll($c);

YII 有用的代码

使用updateCounters()来更新计数器字段:

Book::model()->updateCounters(array('download_count'=>1),':id=id',array(':id'=>$id));

使用sendFile()来下载文件:

$type = LFilter::checkString($_GET['t']);
$dataProvider = Book::model()->findByPk($id);
$content = $this->renderPartial('book',array(
                                     'dataProvider' => $dataProvider,
                                     'type' => $type,
                                ),true,false);
Yii::app()->request->sendFile($dataProvider->name.'.'.$type,$content);

设计数据库时候如果create_time,update_time字段为int(10).在模型中使用行为插件:

public function behaviors()
{
return array(
    'CTimestampBehavior' => array(
    'class' => 'zii.behaviors.CTimestampBehavior',
    'createAttribute' => 'create_time',
    'updateAttribute' => 'update_time',
     )
); }

YII 操作数据库的三种方式

Getting data from a database

Most applications today use databases. Be it a small website or a social network, at least some parts are powered by databases. Yii introduces three ways which allow you to work with databases:

Active Record
Query builder
SQL via DAO

<?php
class DbController extends Controller
{
    protected function afterAction($action)
    {
        $time = sprintf('%0.5f', Yii::getLogger()->getExecutionTime());
        $memory = round(memory_get_peak_usage()/(1024*1024),2)."MB";
        echo "Time: $time, memory: $memory";
        parent::afterAction($action);
    }
 
    public function actionAr()
    {
        $actors = Actor::model()->findAll(array('with' => 'films',
                'order' => 't.first_name, t.last_name, films.title'));
        echo '<ol>';
        foreach($actors as $actor)
        {
            echo '<li>';
            echo $actor->first_name.' '.$actor->last_name;
            echo '<ol>';
            foreach($actor->films as $film)
            {
                echo '<li>';
                echo $film->title;
                echo '</li>';
            }
            echo '</ol>';
            echo '</li>';
        }
        echo '</ol>';
    }
 
    public function actionQueryBuilder()
    {
        $rows = Yii::app()->db->createCommand()
                ->from('actor')
                ->join('film_actor', 'actor.actor_id=film_actor.actor_id')
                ->leftJoin('film', 'film.film_id=film_actor.film_id')
                ->order('actor.first_name, actor.last_name, film.title')
                ->queryAll();
        $this->renderRows($rows);
    }
 
    public function actionSql()
    {
        $sql = "SELECT * FROM actor a
             JOIN film_actor fa ON fa.actor_id = a.actor_id
             JOIN film f ON fa.film_id = f.film_id
             ORDER BY a.first_name, a.last_name, f.title";
        $rows = Yii::app()->db->createCommand($sql)->queryAll();
        $this->renderRows($rows);
    }
 
    public function renderRows($rows)
    {
        $lastActorName = null;
        echo '<ol>';
        foreach($rows as $row)
        {
            $actorName = $row['first_name'].' '.$row['last_name'];
            if($actorName!=$lastActorName){
                if($lastActorName!==null){
                    echo '</ol>';
                    echo '</li>';
                }
                $lastActorName = $actorName;
                echo '<li>';
                echo $actorName;
                echo '<ol>';
            }
            echo '<li>';
            echo $row['title'];
            echo '</li>';
        }
        echo '</ol>';
    }
}