yii 小知识点总结
2016-09-25 16:01
471 查看
安装:http://www.coreseek.cn/products-install/install_on_windows/
手册:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html
常用命令
测试配置是否可用:bin\indexer -c etc\csft.conf
测试索引全部数据:bin\indexer -c etc\csft.conf --all
测试索引指定数据:bin\indexer -c etc\csft.conf 索引名称(如:xml、mysql)
测试 命令行 搜索: bin\search -c etc\csft.conf
测试 中文 搜索:bin\search -c etc\csft.conf -a 网络搜索
测试 搜索服 务端: bin\searchd -c etc\csft.conf
配置数据源
在etc下的csft_mysql.conf 中,修改mysql配置。
需要注意的是sql_query的sql语句第一个字段一定要是主键,下面的sql_attr_uint和sql_attr_timestamp是一些其他的属性。
sql_query_info_pre和sql_query_info这是在测试的时候用的。sql_query_info的where条件id=$id,id是表中的主键,$id永远都是$id,是个变量,不用修改。
接下来将文件中要求修改的绝对路径改掉就可以了。
生成索引
生成全部索引:在coreseek目录下: bin\indexer.exe -c etc\csft_mysql.conf --all
生成指定索引:在coreseek目录下: bin\indexer.exe -c etc\csft_mysql.conf mysql
开启searchd服务
在coreseek目录下: bin\searchd.exe -c etc\csft_mysql.conf
php操作sphinx
先包含类文件:include('F:\sphinx\coreseek-3.2.14-win32\api\sphinxapi.php')
实例化类:$sphinx = new SphinxClient();
创建对象:$sphinx->SetServer('127.0.0.1',9312);
建立查询:$result=$sphinx->query('这是要查询的关键字','*'); *代表查询全部源,可以指定要查询的数据源
数据参数
关键词高亮:buildExcerpts函数
public array SphinxClient::buildExcerpts(array $docs,string $index,string $words [,array $opts])$sphinx->buildExcerpts($docs, $index, $words, $opts);//第一个参数是从数据库中查询的结果集//第二个参数是索引的名字。//第三个参数是要高亮显示的关键字。//第四个参数是显示的字 格式化。$opts=array("before_match"=>"<span style='font-weight:bold;color:red'>","after_match"=>"</span>","chunk_separator"=>"...","around"=>3,"limit"=>10);
form 组件
文本框:textInput();密码框:passwordInput();单选框:radio(),radioList();复选框:checkbox(),checkboxList();下拉框:dropDownList();隐藏域:hiddenInput();文本域:textarea(['rows'=>3]);文件上传:fileInput();提交按钮:submitButton();重置按钮:resetButtun(); <?phpuse yii\widgets\ActiveForm;use yii\helpers\Html;?><?php
$form = ActiveForm::begin(['action' => ['test/getpost'],'method'=>'post',]); ?> <? echo $form->field($model, 'username')->textInput(['maxlength' => 20]) ?><? echo $form->field($model, 'password')->passwordInput(['maxlength' => 20]) ?><? echo $form->field($model,
'sex')->radioList(['1'=>'男','0'=>'女']) ?><? echo $form->field($model, 'edu')->dropDownList(['1'=>'大学','2'=>'高中','3'=>'初中'], ['prompt'=>'请选择','style'=>'width:120px']) ?><? echo $form->field($model, 'file')->fileInput() ?><? echo $form->field($model, 'hobby')->checkboxList(['0'=>'篮球','1'=>'足球','2'=>'羽毛球','3'=>'乒乓球'])
?><? echo $form->field($model, 'info')->textarea(['rows'=>3]) ?><? echo $form->field($model, 'userid')->hiddenInput(['value'=>3]) ?><? echo Html::submitButton('提交', ['class'=>'btn btn-primary','name' =>'submit-button']) ?> <? echo Html::resetButton('重置', ['class'=>'btn
btn-primary','name' =>'submit-button']) ?><?php ActiveForm::end(); ?>
发送邮件
修改配置文件(config/web.php)
'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'useFileTransport' => false, 'transport' => [ 'class' => 'Swift_SmtpTransport', 'host' => 'smtp.163.com', //每种邮箱的host配置不一样 'username' => '18903181076@163.com', //发件人邮箱 'password' => 'xgslagfpomsxuseq', //授权码
'port' => '25', 'encryption' => 'tls', ], 'messageConfig'=>[ 'charset'=>'UTF-8', 'from'=>['18903181076@163.com'=>'nickname'] //发件人昵称 ],],
控制器发送邮件
$mail = Yii::$app->mailer->compose();$mail->setTo('****@qq.com'); //接收人邮箱$mail->setSubject("test"); //邮件标题$mail->setHtmlBody("发送内容发送内容发送内容"); //发送内容(可写HTML代码)if ($mail->send()){echo "成功";}else{echo "失败";}
如果发送页面
$mail = Yii::$app->mailer->compose("email"); //在mail文件夹下创建页面文件,在文件内编辑内容$mail->setTo('****@qq.com'); //接收人邮箱$mail->setSubject("test"); //邮件标题if ($mail->send()){echo "成功";}else{echo "失败";}
微博登陆
= WB_CALLBACK_URL; try { $token = $o->getAccessToken( 'code', $keys ) ; } catch (OAuthException $e) { }}if ($token) { $_SESSION['token'] = $token; setcookie( 'weibojs_'.$o->client_id, http_build_query($token) ); $this->redirect(["index/index"]); //授权成功} else
{ $this->redirect(["index/login"]); //授权失败}
= $c->show_user_by_id( $uid);//根据ID获取用户等基本信息
aa增删改查
<input name='_csrf' type='hidden' id='_csrf' value='".Yii::$app->request->csrfToken."'>
eg:$users=new UserForm();
as $results){ }//每次只查询2条
4000
记录,降低内存占用删:先取出对象再调用对象的delete方法 $result=modelname::find()->where(['id'=>1)->one();$result->delete();//删除一条数据modelname::deleteAll('id>:id',array(':id'=>0));//删除id大于0的数据增:创建一个cactiverecord对象,调用他的save方法
$test=new modename();$test->username='summer';$test->password='123456';$test->validate(); //调用rule函数验证数据if($test->hasErrors()){echo '数据不合法';die();}$test->save();//往modelname表中插入了了summer,123456的数据,为了安全和数据的合理性,我们通常会在model文件中定义一个rule函数去验证数据改:
$result=modelname::find()->where(['id'=>1)->all()->one();$result->username='lily';$result->save();数据表的关联查询:假设有顾客表(id,name)和订单表(id,price,customer_id)两张表;1.根据顾客查询订单$customer=customer::find()->where['name'=>'zhangsan']->one();$order=$customer->hasMany('Order::className',['customer_id'=>'id'])->asArray()->all();在model中封装:public
function getOrder(){ $order=$this->hasMany('Order::className',['customer_id'=>'id'])->asArray()->all(); return $order;}在controller中调用:$customer=customer::find()->where['name'=>'zhangsan']->one();$order=$customer->getOrder();
aa分页
= $arr->offset($pages->offset)->limit($pages->limit)->all();return $this->render('list', ['models' => $models,'pages' => $pages]);}?>
aa日历插件
下载插件
composer require "2amigos/yii2-date-picker-widget" "*"
视图层使用类
use dosamigos\datepicker\DatePicker;
1> 使用widget方式
<?phpecho DatePicker::widget(['model' => $model,'attribute' => 'date','template' => '{addon}{input}','clientOptions' => ['autoclose' => true,'format' => 'yyyy-mm-dd']]);?>
2> ActiveForm方式
<?phpecho $form->field($model, 'date')->widget( DatePicker::className(), [ 'inline' => true, 'template' => '<div class="well well-sm" style="background-color: #fff; width:250px">{input}</div>', 'clientOptions' => [ 'autoclose' => true, 'format' => 'yyyy-mm-dd'
]]);?>
aa对称加密
1.打开main-local.php文件添加:
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.sina.com', //每种邮箱的host配置不一样
'username' => 'gg24155@sina.com', //发件人邮箱
'password' => 'gghw4089225', //授权码
'port' => '25',
'encryption' => 'tls',
],
'messageConfig'=>[
'charset'=>'UTF-8',
'from'=>['gg24155@sina.com'=>'nickname'] //发件人昵称
],
],
2.控制器demo:
//对称加密+发送邮箱
public function actionEncrypt(){
header("Content-type:text/html;charset=utf-8");
$msg = "张三";
//$pwd = "123";
$re = Yii::$app->security->encryptByKey($msg,'');
$arr = urlencode($re);
$mail = Yii::$app->mailer->compose();
$mail->setTo('871346747@qq.com'); //接收人邮箱
$mail->setSubject("test"); //邮件标题
$mail->setHtmlBody("http://www.hanwei.com/day_exercise/frontend/web/index.php?r=test/get_email&name=".$arr);
//发送内容(可写HTML代码)
if ($mail->send()){
echo "成功";
}else{
echo "失败";
}
}
//接受邮箱信息
public function actionGet_email(){
header("Content-type:text/html;charset=utf-8");
$re3 = urldecode($_GET['name']);
$re1 = Yii::$app->security->decryptByKey($re3,'');
echo $re1;
}
表单绑定
.视图层demo:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<meta charset="utf-8"/>
<?=Html::cssFile('@web/css/jquery-ui.css')?>
<?=Html::jsFile('@web/js/jquery-2.1.4.min.js')?>
<?=Html::jsFile('@web/js/jquery-ui.js')?>
<center>
<form action="index.php?r=works/add" method="post" id="add_form">
<h2>工作经历</h2>
公司名称:<input type="text" name="w_name[]"/><br/>
你的职位:<input type="text" name="w_zhi[]"/><br/>
开始日期:<input type="text" class="start" name="time1[]"><br/>
结束日期:<input type="text" class="end" name="time2[]"><br/>
<input type="button" value="+添加更多工作经历" id="m_desc"/><br/>
<div id="show"></div>
<input type="submit" value="提交"/>
</form>
</center>
<script type="text/javascript">
$(document).ready(function(){
$(".start").datepicker();
$(".end").datepicker();
});
$(".start").datepicker({
onSelect:function(dateText,inst){
$(".end").datepicker("option","minDate",dateText);
}
});
$(".end").datepicker({
onSelect:function(dateText,inst){
$(".start").datepicker("option","maxDate",dateText);
}
});
$('#m_desc').click(function(){
var data="公司名称:<input type='text' name='w_name[]'/><br/>你的职位:<input type='text' name='w_zhi[]'/><br/>开始日期:<input type='text' class='start' name='time1[]'><br/>结束日期:<input type='text' class='end' name='time2[]'><br/>";
$("#show").append(data);
$(".start").datepicker({
onSelect:function(dateText,inst){
$(".end").datepicker("option","minDate",dateText);
}
});
$(".end").datepicker({
onSelect:function(dateText,inst){
$(".start").datepicker("option","maxDate",dateText);
}
});
})
$('#add_form').submit(function(){
var arr = $(this).serialize();
$.get($(this).attr('action'),arr,function(data){
if(data==1){
alert('Yes');
}else{
alert('No');
}
})
return false;
})
</script>
2.控制器demo:
<?php
namespace frontend\controllers;
use Yii;
use frontend\models\Works;
class WorksController extends \yii\web\Controller
{
public $layout = false;
public $enableCsrfValidation = false;
public function actionIndex(){
return $this->render('index');
}
public function actionAdd(){
$arr=$_GET;
for($i=0;$i<count($arr['w_name']);$i++){
$connection = \Yii::$app->db;
$res = $connection->createCommand()->batchInsert('works', ['w_name','w_zhi','time1','time2'], [
[$arr['w_name'][$i],$arr['w_zhi'][$i],$arr['time1'][$i],$arr['time2'][$i]],
])->execute();
}
if($res){
echo "1";
}else{
echo "2";
}
}
}
aa文件上传
1.单文件上传
1)调用模型层完成:
M层调用:
use yii\web\UploadedFile;
[['a_pic'],'string','max'=>255],
//图片上传
public $a_pic;
public function upload(){
$this->a_pic->saveAs('uploads/' . $this->a_pic->baseName . '.' . $this->a_pic->extension);
return true;
}
C层调用:
use yii\web\UploadedFile;
$arr = $model->a_pic = UploadedFile::getInstance($model, 'a_pic');
if ($model->upload()) {
$photo = $arr->name;
$connection = \Yii::$app->db;
$connection->createCommand()->insert('work1', [
'a_title' => $title,
'a_desc' => $desc,
'a_pic' => $photo,
])->execute();
}
2)不适用模型层进行文件上传
public $enableCsrfValidation = false; //禁止表单提交
$upload=new UploadedFile(); //实例化上传类
$name=$upload->getInstanceByName('myfile'); //获取文件原名称
$img=$_FILES['myfile']; //获取上传文件参数
$upload->tempName=$img['tmp_name']; //设置上传的文件的临时名称
$img_path='uploads/'.$name; //设置上传文件的路径名称(这里的数据进行入库)
$arr=$upload->saveAs($img_path); //保存文件
var_dump($arr);
<form action="index.php?r=exercise/upload" method="post" enctype="multipart/form-data">
标题:<input type="text" name="e_title"><br/>
头像:<input type="file" name="e_img"><br/>
<input type="submit" value="提交"></form>
2.多文件上传
1)调用模型层完成:
//模型层
public $e_img;
public function upload(){
foreach ($this->e_img as $file){
$file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
}
return true;
}
//控制器层
use yii\web\UploadedFile;
$model = new Exercise();
$arr = $model->e_img = UploadedFile::getInstances($model, 'e_img');
if ($model->upload()){
for($i=0;$i<count($arr);$i++){
$photo[] = $arr[$i]->name;
}
$str = implode(',',$photo);
$connection = \Yii::$app->db;
$connection->createCommand()->insert('exercise', [
'e_title' => "$e_title",
'e_img' => $str,
])->execute();
return $this->redirect(['exercise/list']);
$connection = \Yii::$app->db;
$command = $connection->createCommand('SELECT * FROM exercise');
$posts = $command->queryAll();
foreach($posts as $key => $val){
$img = explode(',',$val['e_img']);
$val['e_img'] = $img;
$photos[] = $val;
}
return $this->render('list',['list'=>$photos]);
//视图层
<?php foreach($list as $key=>$val){?>
<tr>
<td><?php echo $val['e_title']?></td>
<td>
<?php foreach($val['e_img'] as $k=>$v){?>
<img src="../web/uploads/<?php echo $v?>" style="width:100px;height:100px;"/>
<?php }?>
</td>
</tr>
<?php }?>
2)在调用模型层的基础上序列化
//控制器demo:
<?php
namespace frontend\controllers;
use app\models\Photo;
use Yii;
use yii\web\UploadedFile;
use yii\data\Pagination;
class PhotoController extends \yii\web\Controller{
public function actionIndex(){
$model = new Photo();
return $this->render('index', ['model' => $model]);
}
public function actionUpload(){
$model = new Photo();
if (Yii::$app->request->isPost) {
$arr = $model->photo = UploadedFile::getInstances($model, 'photo');
if ($model->upload()){
for ($i=0; $i <count($arr) ; $i++) {
$img[]= $arr[$i]->name;
}else{
$str = serialize($img);
$model->photo = "$str";
$model->save();
}
}
return $this->render('index', ['model' => $model]);
}
public function actionList(){
$query = Photo::find();
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count(),'pageSize'=>2]);
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('list', [
'models' => $models,
'pages' => $pages,
]);
}
}
//视图层demo:
<table>
<tr>
<td>id</td>
<td>ͼƬ</td>
</tr>
<?php foreach ($models as $key => $v) {?>
<tr>
<td><?php echo $v['p_id']?></td>
<?php
$photos = unserialize($v['photo']);
foreach ($photos as $key => $va) {?>
<td><img src="../web/uploads/<?php echo $va?>" alt="" height="50" width="50"/></td>
<?php }?>
</tr>
<?php }?>
</table>
<?php
use yii\widgets\LinkPager;
echo LinkPager::widget([
'pagination' => $pages,
]);?>
aa sphinx
1、搜索中文时,出现 iconv 不是内部或外部命令。解决办法:运行一下 "set PATH=%CD%\bin;%PATH%",即可解决;
2、bin\indexer -c etc\csft_mysql.conf --all
创建索引
3、echo 搜索的词 | iconv -f gbk -t utf-8 | search -c etc\csft_mysql.conf --stdin | iconv -f utf-8 -t gbk
4.在Yii框架中使用Sphinx
1)
use SphinxClient;
Yii::$classMap['SphinxClient']="@vendor/yiisoft/yii2/sphinx/sphinxapi.php";
$cl=new SphinxClient();
$cl -> SetServer('127.0.0.1',9312);
$cl->SetLimits(($page - 1) * $pagesize , $pagesize );
$cl->SetMaxQueryTime(3000);
$cl->SetConnectTimeout ( 3 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_ANY);
$res = $cl -> Query("$name","*");
2)
在common/config/main-local.php中新添加:
'coreseek' => [
'class' => 'SphinxClient',
]
控制器层直接调用:$cl = Yii::$app->coreseek;
//控制器层:
1.加载部件
use yii\web\Session;
$session = Yii::$app->session;
//方法1:
$session['name']=$customer['a_user'];
//方法2:
//$session->set('name',$customer['a_user']);
//视图层:
<?php
$session = Yii::$app->session;
//方法1:
echo $session['name'];
//方法2:
//echo $session->get('name');
?>
cookie
use app\models\Login;
存cookie
$cookie = \YII::$app->response->cookies;
$searchs = array("name"=>"search" ,"value"=>$search);
$cookie->add(new Cookie($searchs));
取cookie
$cookie = \YII::$app->request->cookies;
$search = $cookie->getValue("search");
移除cookie
$cookie->remove('search');
aa sphinx 搜索
1.控制器demo:
<?php
namespace frontend\controllers;
use Yii;
use frontend\models\Goods;
use SphinxClient;
use yii\data\Pagination;
class GoodsphinxController extends \yii\web\Controller
{
public function actionIndex()
{
$goods = new Goods();
$request = Yii::$app->request;
$g_name = $request->get('g_name')?$request->get('g_name'):'';
$min_price = $request->get('min_price')?$request->get('min_price'):'';
$max_price = $request->get('max_price')?$request->get('max_price'):'';
$cl = new SphinxClient();
$db = new \yii\db\Query;
$cl->SetServer ('127.0.0.1',9312);
$cl->SetConnectTimeout (3);
if($min_price != "" && $max_price != ""){
//SetFilterFloatRange:浮动范围过滤器
$cl->SetFilterFloatRange("g_price",floatval($min_price),floatval($max_price));
}
//控制搜索结果集的返回格式
$cl->SetArrayResult (true);
$pages = new Pagination([
'totalCount' => 1200,
'defaultPageSize' => 2
]);
$cl -> SetLimits($pages->offset,$pages->limit);
if($g_name==null){
$cl->SetMatchMode (SPH_MATCH_FULLSCAN);
$res = $cl->Query ($g_name, "goods");
$pages->totalCount=$res['total'];
foreach($res['matches'] as $k=>$v){
$ids[]=$v['id'];
}
$data=$db->select('g_id,g_name,g_price')->from('goods')->where(['in','g_id',$ids])->all();
}else{
$cl->SetMatchMode (SPH_MATCH_ANY);
$res = $cl->Query ($g_name, "goods");
$pages->totalCount=$res['total'];
if($res['matches']!=null){
foreach($res['matches'] as $k=>$v){
$ids[]=$v['id'];
}
$data=$db->select('g_id,g_name,g_price')->from('goods')->where(['in','g_id',$ids])->all();
foreach($data as $k=>$v){
$data[$k]['g_name']=$cl->BuildExcerpts([$v['g_name']],'goods',$g_name,array('before_match'=>"<font style='font-weight:bold;color:#f00;'>",'after_match'=>"</font>"))[0];
}
}else{
$data="没有包含<font style='font-weight:bold;color:#f00;'>'{$g_name}'</font>的数据";
}
}
if(Yii::$app->request->isAjax){
return $this->renderPartial('index',['goods'=>$goods,'pages'=>$pages,'data'=>$data]);
}else{
return $this->render('index',['goods'=>$goods,'pages'=>$pages,'data'=>$data]);
}
}
}
2.视图层demo:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\LinkPager;
use yii\web\View;
/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */
$this->title = '搜索';
?>
<div id="lists">
<center>
<h1><?= Html::encode($this->title) ?></h1>
<?php $form = ActiveForm::begin(['action'=>['goodsphinx/index'],'method'=>'get',]); ?>
商品名称:<input type="text" name="g_name">
价格区间:<input type="text" name="min_price">
------<input type="text" name="max_price">
<? echo Html::submitButton('搜索', ['class'=>'btn btn-primary','name' =>'submit-button']) ?>
<?php ActiveForm::end(); ?>
<?php if(is_array($data)){ ?>
<table border=1>
<tr>
<td>ID</td>
<td>商品名称</td>
<td>商品价格</td>
</tr>
<?php foreach($data as $k=>$v){ ?>
<tr>
<td><?= $v['g_id']?></td>
<td><?= $v['g_name']?></td>
<td><?= $v['g_price']?></td>
</tr>
<?php }?>
</table>
<?php }else{ echo $data; } ?>
<?php echo LinkPager::widget([
'pagination'=> $pages,
]); ?>
</center>
</div>
<?php $this->beginBlock('abc'); ?>
$(document).on('click','.pagination a',function(e){
e.preventDefault();
var url=$(this).attr('href');
$.get(url,function(msg){
$('#lists').html(msg);
});
});
<?php $this->endBlock(); $this->registerJs($this->blocks['abc'], View::POS_END); ?>
验证码
1.模型层demo:
引用小部件:
use yii\captcha\Captcha;
定义变量:
public $verifyCode;
验证规则:
['verifyCode', 'captcha','message'=>'验证码错误'],
2.视图层demo:
引用小部件:
use yii\captcha\Captcha;
添加验证码:
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [ 'template' =>'<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>
缓存使用
1.打开common\config\main.php:
'memcache' => [
'class' => 'yii\caching\Memcache',
'servers' => [
[
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 100,
],
],
],
2.控制器demo:
<?php
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
class CacheController extends Controller
{
//页面缓存
public function behaviors(){
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index2'],
'duration' => 3,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM goods',
],
],
];
}
//缓存存入
public function actionIndex(){
Yii::$app->cache->set('name','dada');
Yii::$app->memcache->set('name','xiao');
}
//缓存取出
public function actionIndex2(){
echo "Yii自带系统缓存:".Yii::$app->cache->get('name');
echo "<br/>";
echo "Yii自带Memcache缓存:".Yii::$app->memcache->get('name');
}
//片段缓存
public function actionFragment(){
return $this->render('fragment');
}
}
3.视图层(真静态缓存)demo:
<?php
$id = "123";
echo time();
echo "<br/>";
if ($this->beginCache($id,['duration' => 5])){
echo time();
$this->endCache();
}
第三方登陆
1.index.php文件:
<meta property="qc:admins" content="0353610511410761004162163757164506000" />
<meta charset='utf-8'>
<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>qq登陆</a>
2.info.php文件:
<?php
header("content-type:text/html;charset=utf-8");
//获得code
$code=$_GET['code'];
//获取access_token
$arr=file_get_contents("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101307013&client_secret=838471f08a0470d2a9ba425f68167c1e&code=$code&redirect_uri=http://1.alihw.applinzi.com/info.php");
//print_r($arr);die;
$arr=explode('=',$arr);
$arr=explode('&',$arr[1]);
$access_token=$arr[0];
//print_r($access_token);die;
//获取openid
$url="https://graph.qq.com/oauth2.0/me?access_token=$access_token";
$openid=file_get_contents($url);
//print_r($openid);die;
$str=substr($openid,45,32);
//print_r($str);
//获取用户信息
$url1="https://graph.qq.com/user/get_user_info?access_token=$access_token&oauth_consumer_key=101307013&openid=$str";
$info=file_get_contents($url1);
$user=json_decode($info,true);
$name = $user['nickname'];
$img = $user['figureurl'];
echo "<img src='$img'>".$name."<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>退出</a>";
//print_r($user);
微信开发
1.index.php文件:
<meta property="qc:admins" content="0353610511410761004162163757164506000" />
<meta charset='utf-8'>
<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>qq登陆</a>
2.info.php文件:
<?php
header("content-type:text/html;charset=utf-8");
//获得code
$code=$_GET['code'];
//获取access_token
$arr=file_get_contents("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101307013&client_secret=838471f08a0470d2a9ba425f68167c1e&code=$code&redirect_uri=http://1.alihw.applinzi.com/info.php");
//print_r($arr);die;
$arr=explode('=',$arr);
$arr=explode('&',$arr[1]);
$access_token=$arr[0];
//print_r($access_token);die;
//获取openid
$url="https://graph.qq.com/oauth2.0/me?access_token=$access_token";
$openid=file_get_contents($url);
//print_r($openid);die;
$str=substr($openid,45,32);
//print_r($str);
//获取用户信息
$url1="https://graph.qq.com/user/get_user_info?access_token=$access_token&oauth_consumer_key=101307013&openid=$str";
$info=file_get_contents($url1);
$user=json_decode($info,true);
$name = $user['nickname'];
$img = $user['figureurl'];
echo "<img src='$img'>".$name."<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>退出</a>";
//print_r($user);
自动载入类文件
1.自己建一个php测试页面
<?php
header("Content-type:text/html;charset=utf-8");
function myLoader($classname){
//实例化文件名
$class_file = strtolower($classname).".php";
if(file_exists($class_file)){
require_once($class_file);
}else{
echo "加载文件失败";
}
}
//注册自定义方法
spl_autoload_register("myLoader");
$test = new Test();
$test->index();
2.建一个类文件test.php
<?php
header("Content-type:text/html;charset=utf-8");
class Test{
function index(){
echo "123";
}
}
coreseek配置文件
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
#源定义
source mysql
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = rbac
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = replace into counter (id,max_id)values(1,(select max(g_id) from goods))
sql_query = SELECT g_id, g_name, g_desc FROM goods
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
#sql_attr_uint = g_id #从SQL读取到的值必须为整数
#sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM goods WHERE g_id=$id #命令行查询时,从数据库读取原始数据信息
}
# 增量索引数据源定义
source kk_increase : mysql
{
sql_query_pre = SET NAMES utf8
sql_query = SELECT g_id, g_name, g_desc FROM goods where g_id > (select max_id from counter where id=1)
#sql_query_pre = replace into counter (id,max_id)values(1,(select max(g_id) from goods))
#sql_attr_uint = g_id #从SQL读取到的值必须为整数
#sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM goods WHERE g_id=$id #命令行查询时,从数据库读取原始数据信息
}
#index定义
index mysql
{
source = mysql #对应的source名称
path = E:/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = E:/coreseek/usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/coreseek/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#增量索引定义
index kk_increase
{
source = kk_increase #对应的source名称
path = E:/coreseek/var/kk_increase
charset_dictpath = E:/coreseek/etc/
charset_type = zh_cn.utf-8
}
#新定义
source goods
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = kaoshi
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT g_id,g_name,g_price FROM goods
sql_attr_float = g_price
#从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM goods WHERE g_id=$id #命令行查询时,从数据库读取原始数据信息
}
#index定义
index goods
{
source = goods #对应的source名称
path = E:/coreseek/var/data/goods #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = E:/coreseek/usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/coreseek/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = E:/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = E:/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = E:/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
binlog_path = #关闭binlog日志
}
手册:http://www.coreseek.cn/docs/coreseek_4.1-sphinx_2.0.1-beta.html
常用命令
测试配置是否可用:bin\indexer -c etc\csft.conf
测试索引全部数据:bin\indexer -c etc\csft.conf --all
测试索引指定数据:bin\indexer -c etc\csft.conf 索引名称(如:xml、mysql)
测试 命令行 搜索: bin\search -c etc\csft.conf
测试 中文 搜索:bin\search -c etc\csft.conf -a 网络搜索
测试 搜索服 务端: bin\searchd -c etc\csft.conf
配置数据源
在etc下的csft_mysql.conf 中,修改mysql配置。
需要注意的是sql_query的sql语句第一个字段一定要是主键,下面的sql_attr_uint和sql_attr_timestamp是一些其他的属性。
sql_query_info_pre和sql_query_info这是在测试的时候用的。sql_query_info的where条件id=$id,id是表中的主键,$id永远都是$id,是个变量,不用修改。
接下来将文件中要求修改的绝对路径改掉就可以了。
生成索引
生成全部索引:在coreseek目录下: bin\indexer.exe -c etc\csft_mysql.conf --all
生成指定索引:在coreseek目录下: bin\indexer.exe -c etc\csft_mysql.conf mysql
开启searchd服务
在coreseek目录下: bin\searchd.exe -c etc\csft_mysql.conf
php操作sphinx
先包含类文件:include('F:\sphinx\coreseek-3.2.14-win32\api\sphinxapi.php')
实例化类:$sphinx = new SphinxClient();
创建对象:$sphinx->SetServer('127.0.0.1',9312);
建立查询:$result=$sphinx->query('这是要查询的关键字','*'); *代表查询全部源,可以指定要查询的数据源
数据参数
关键词高亮:buildExcerpts函数
public array SphinxClient::buildExcerpts(array $docs,string $index,string $words [,array $opts])$sphinx->buildExcerpts($docs, $index, $words, $opts);//第一个参数是从数据库中查询的结果集//第二个参数是索引的名字。//第三个参数是要高亮显示的关键字。//第四个参数是显示的字 格式化。$opts=array("before_match"=>"<span style='font-weight:bold;color:red'>","after_match"=>"</span>","chunk_separator"=>"...","around"=>3,"limit"=>10);
form 组件
文本框:textInput();密码框:passwordInput();单选框:radio(),radioList();复选框:checkbox(),checkboxList();下拉框:dropDownList();隐藏域:hiddenInput();文本域:textarea(['rows'=>3]);文件上传:fileInput();提交按钮:submitButton();重置按钮:resetButtun(); <?phpuse yii\widgets\ActiveForm;use yii\helpers\Html;?><?php
$form = ActiveForm::begin(['action' => ['test/getpost'],'method'=>'post',]); ?> <? echo $form->field($model, 'username')->textInput(['maxlength' => 20]) ?><? echo $form->field($model, 'password')->passwordInput(['maxlength' => 20]) ?><? echo $form->field($model,
'sex')->radioList(['1'=>'男','0'=>'女']) ?><? echo $form->field($model, 'edu')->dropDownList(['1'=>'大学','2'=>'高中','3'=>'初中'], ['prompt'=>'请选择','style'=>'width:120px']) ?><? echo $form->field($model, 'file')->fileInput() ?><? echo $form->field($model, 'hobby')->checkboxList(['0'=>'篮球','1'=>'足球','2'=>'羽毛球','3'=>'乒乓球'])
?><? echo $form->field($model, 'info')->textarea(['rows'=>3]) ?><? echo $form->field($model, 'userid')->hiddenInput(['value'=>3]) ?><? echo Html::submitButton('提交', ['class'=>'btn btn-primary','name' =>'submit-button']) ?> <? echo Html::resetButton('重置', ['class'=>'btn
btn-primary','name' =>'submit-button']) ?><?php ActiveForm::end(); ?>
发送邮件
修改配置文件(config/web.php)
'mailer' => [ 'class' => 'yii\swiftmailer\Mailer', 'useFileTransport' => false, 'transport' => [ 'class' => 'Swift_SmtpTransport', 'host' => 'smtp.163.com', //每种邮箱的host配置不一样 'username' => '18903181076@163.com', //发件人邮箱 'password' => 'xgslagfpomsxuseq', //授权码
'port' => '25', 'encryption' => 'tls', ], 'messageConfig'=>[ 'charset'=>'UTF-8', 'from'=>['18903181076@163.com'=>'nickname'] //发件人昵称 ],],
控制器发送邮件
$mail = Yii::$app->mailer->compose();$mail->setTo('****@qq.com'); //接收人邮箱$mail->setSubject("test"); //邮件标题$mail->setHtmlBody("发送内容发送内容发送内容"); //发送内容(可写HTML代码)if ($mail->send()){echo "成功";}else{echo "失败";}
如果发送页面
$mail = Yii::$app->mailer->compose("email"); //在mail文件夹下创建页面文件,在文件内编辑内容$mail->setTo('****@qq.com'); //接收人邮箱$mail->setSubject("test"); //邮件标题if ($mail->send()){echo "成功";}else{echo "失败";}
微博登陆
配置文件:
config.phpheader('Content-Type: text/html; charset=UTF-8');define( "WB_AKEY" , '1023495131' ); //申请应用apkeydefine( "WB_SKEY" , '30f12ebfe03e62026735d84bb50887f1' ); //申请应用密钥define( "WB_CALLBACK_URL" , 'http://www.meit.com?r=index/callback' ); //回调页面登录页面:
php$session=Yii::$app->session;$session->open(); //开启sessioninclude_once( '/weibosdk/config.php' ); //包含控制文件$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY ); //实例化类文件$code_url = $o->getAuthorizeURL( WB_CALLBACK_URL ); //此为微博登录链接地址view<a href="<?php echo $code_url?>">微博登录</a>回调页面:
callback.php$session=Yii::$app->session;$session->open(); //开启sessioninclude_once( '/weibosdk/config.php' ); //包含配置文件$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY ); //实例化类文件if (isset($_REQUEST['code'])) { $keys = array(); $keys['code'] = $_REQUEST['code']; $keys['redirect_uri']= WB_CALLBACK_URL; try { $token = $o->getAccessToken( 'code', $keys ) ; } catch (OAuthException $e) { }}if ($token) { $_SESSION['token'] = $token; setcookie( 'weibojs_'.$o->client_id, http_build_query($token) ); $this->redirect(["index/index"]); //授权成功} else
{ $this->redirect(["index/login"]); //授权失败}
显示用户信息页面:
需要显示用户信息(如用户名)的页面$session=Yii::$app->session;$session->open();include_once( '/weibosdk/config.php' );$c = new SaeTClientV2( WB_AKEY , WB_SKEY , $_SESSION['token']['access_token'] );$ms = $c->home_timeline(); // done$uid_get = $c->get_uid();$uid = $uid_get['uid'];$user_message= $c->show_user_by_id( $uid);//根据ID获取用户等基本信息
aa增删改查
表单中防止400错误的方法
在表达中加入以下代码<input name='_csrf' type='hidden' id='_csrf' value='".Yii::$app->request->csrfToken."'>
执行sql语句
$db=Yii::$app->db;$sql="select * from user where u_name='$u_name' and u_pwd='".md5($u_pwd)."'";$re=$db->createCommand($sql)->execute();模型操作
modelname为实例化的model模型名eg:$users=new UserForm();
查:
1.findBySql $sql="select * from tablename where condition"Modelname::findBySql($sql,array(':id'=>1 or 1=1))->all(); //返回一个对象。第二个参数是为了防止sql注入//findBySql是cactiverecord的方法2.find $results=modelname::find()->where(['id'=>1])->all();查询出id=1的记录$results=modelname::find()->where(['>','id',0])->all();查询出id大于0的记录$results=modelname::find()->where(['between','id',0,3])->all();查询出id在0,3之间的记录$results=modelname::find()->where(['like','title','keyword'])->all();查询出标题中和关键字相符的记录内存使用量优化方法:1.查询结果转化成数组$results=modelname::find()->where(['between','id',0,3])->asArray()->all();2.减少每次取出数据的数量foreach(modelname::find->batch(2)as $results){ }//每次只查询2条
4000
记录,降低内存占用删:先取出对象再调用对象的delete方法 $result=modelname::find()->where(['id'=>1)->one();$result->delete();//删除一条数据modelname::deleteAll('id>:id',array(':id'=>0));//删除id大于0的数据增:创建一个cactiverecord对象,调用他的save方法
$test=new modename();$test->username='summer';$test->password='123456';$test->validate(); //调用rule函数验证数据if($test->hasErrors()){echo '数据不合法';die();}$test->save();//往modelname表中插入了了summer,123456的数据,为了安全和数据的合理性,我们通常会在model文件中定义一个rule函数去验证数据改:
$result=modelname::find()->where(['id'=>1)->all()->one();$result->username='lily';$result->save();数据表的关联查询:假设有顾客表(id,name)和订单表(id,price,customer_id)两张表;1.根据顾客查询订单$customer=customer::find()->where['name'=>'zhangsan']->one();$order=$customer->hasMany('Order::className',['customer_id'=>'id'])->asArray()->all();在model中封装:public
function getOrder(){ $order=$this->hasMany('Order::className',['customer_id'=>'id'])->asArray()->all(); return $order;}在controller中调用:$customer=customer::find()->where['name'=>'zhangsan']->one();$order=$customer->getOrder();
aa分页
控制器部分
<?phpuse yii\data\Pagination;public function actionList(){$test=new TestForm(); //实例化model模型$arr=$test->find();//$countQuery = clone $arr;$pages = new Pagination([//'totalCount' => $countQuery->count(),'totalCount' => $arr->count(),'pageSize' => 2 //每页显示条数]);$models= $arr->offset($pages->offset)->limit($pages->limit)->all();return $this->render('list', ['models' => $models,'pages' => $pages]);}?>
view视图部分
<?phpuse yii\widgets\LinkPager;foreach($models as $k=>$v){echo "<tr>";echo "<td>".$v['u_id']."</td>";echo "<td>".$v['u_name']."</td>";echo "<td>".$v['u_state']."</td>";echo "</tr>";}echo LinkPager::widget(['pagination' => $pages,]);?>aa日历插件
下载插件
composer require "2amigos/yii2-date-picker-widget" "*"
视图层使用类
use dosamigos\datepicker\DatePicker;
1> 使用widget方式
<?phpecho DatePicker::widget(['model' => $model,'attribute' => 'date','template' => '{addon}{input}','clientOptions' => ['autoclose' => true,'format' => 'yyyy-mm-dd']]);?>
2> ActiveForm方式
<?phpecho $form->field($model, 'date')->widget( DatePicker::className(), [ 'inline' => true, 'template' => '<div class="well well-sm" style="background-color: #fff; width:250px">{input}</div>', 'clientOptions' => [ 'autoclose' => true, 'format' => 'yyyy-mm-dd'
]]);?>
aa对称加密
1.打开main-local.php文件添加:
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'useFileTransport' => false,
'transport' => [
'class' => 'Swift_SmtpTransport',
'host' => 'smtp.sina.com', //每种邮箱的host配置不一样
'username' => 'gg24155@sina.com', //发件人邮箱
'password' => 'gghw4089225', //授权码
'port' => '25',
'encryption' => 'tls',
],
'messageConfig'=>[
'charset'=>'UTF-8',
'from'=>['gg24155@sina.com'=>'nickname'] //发件人昵称
],
],
2.控制器demo:
//对称加密+发送邮箱
public function actionEncrypt(){
header("Content-type:text/html;charset=utf-8");
$msg = "张三";
//$pwd = "123";
$re = Yii::$app->security->encryptByKey($msg,'');
$arr = urlencode($re);
$mail = Yii::$app->mailer->compose();
$mail->setTo('871346747@qq.com'); //接收人邮箱
$mail->setSubject("test"); //邮件标题
$mail->setHtmlBody("http://www.hanwei.com/day_exercise/frontend/web/index.php?r=test/get_email&name=".$arr);
//发送内容(可写HTML代码)
if ($mail->send()){
echo "成功";
}else{
echo "失败";
}
}
//接受邮箱信息
public function actionGet_email(){
header("Content-type:text/html;charset=utf-8");
$re3 = urldecode($_GET['name']);
$re1 = Yii::$app->security->decryptByKey($re3,'');
echo $re1;
}
表单绑定
.视图层demo:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<meta charset="utf-8"/>
<?=Html::cssFile('@web/css/jquery-ui.css')?>
<?=Html::jsFile('@web/js/jquery-2.1.4.min.js')?>
<?=Html::jsFile('@web/js/jquery-ui.js')?>
<center>
<form action="index.php?r=works/add" method="post" id="add_form">
<h2>工作经历</h2>
公司名称:<input type="text" name="w_name[]"/><br/>
你的职位:<input type="text" name="w_zhi[]"/><br/>
开始日期:<input type="text" class="start" name="time1[]"><br/>
结束日期:<input type="text" class="end" name="time2[]"><br/>
<input type="button" value="+添加更多工作经历" id="m_desc"/><br/>
<div id="show"></div>
<input type="submit" value="提交"/>
</form>
</center>
<script type="text/javascript">
$(document).ready(function(){
$(".start").datepicker();
$(".end").datepicker();
});
$(".start").datepicker({
onSelect:function(dateText,inst){
$(".end").datepicker("option","minDate",dateText);
}
});
$(".end").datepicker({
onSelect:function(dateText,inst){
$(".start").datepicker("option","maxDate",dateText);
}
});
$('#m_desc').click(function(){
var data="公司名称:<input type='text' name='w_name[]'/><br/>你的职位:<input type='text' name='w_zhi[]'/><br/>开始日期:<input type='text' class='start' name='time1[]'><br/>结束日期:<input type='text' class='end' name='time2[]'><br/>";
$("#show").append(data);
$(".start").datepicker({
onSelect:function(dateText,inst){
$(".end").datepicker("option","minDate",dateText);
}
});
$(".end").datepicker({
onSelect:function(dateText,inst){
$(".start").datepicker("option","maxDate",dateText);
}
});
})
$('#add_form').submit(function(){
var arr = $(this).serialize();
$.get($(this).attr('action'),arr,function(data){
if(data==1){
alert('Yes');
}else{
alert('No');
}
})
return false;
})
</script>
2.控制器demo:
<?php
namespace frontend\controllers;
use Yii;
use frontend\models\Works;
class WorksController extends \yii\web\Controller
{
public $layout = false;
public $enableCsrfValidation = false;
public function actionIndex(){
return $this->render('index');
}
public function actionAdd(){
$arr=$_GET;
for($i=0;$i<count($arr['w_name']);$i++){
$connection = \Yii::$app->db;
$res = $connection->createCommand()->batchInsert('works', ['w_name','w_zhi','time1','time2'], [
[$arr['w_name'][$i],$arr['w_zhi'][$i],$arr['time1'][$i],$arr['time2'][$i]],
])->execute();
}
if($res){
echo "1";
}else{
echo "2";
}
}
}
aa文件上传
1.单文件上传
1)调用模型层完成:
M层调用:
use yii\web\UploadedFile;
[['a_pic'],'string','max'=>255],
//图片上传
public $a_pic;
public function upload(){
$this->a_pic->saveAs('uploads/' . $this->a_pic->baseName . '.' . $this->a_pic->extension);
return true;
}
C层调用:
use yii\web\UploadedFile;
$arr = $model->a_pic = UploadedFile::getInstance($model, 'a_pic');
if ($model->upload()) {
$photo = $arr->name;
$connection = \Yii::$app->db;
$connection->createCommand()->insert('work1', [
'a_title' => $title,
'a_desc' => $desc,
'a_pic' => $photo,
])->execute();
}
2)不适用模型层进行文件上传
public $enableCsrfValidation = false; //禁止表单提交
$upload=new UploadedFile(); //实例化上传类
$name=$upload->getInstanceByName('myfile'); //获取文件原名称
$img=$_FILES['myfile']; //获取上传文件参数
$upload->tempName=$img['tmp_name']; //设置上传的文件的临时名称
$img_path='uploads/'.$name; //设置上传文件的路径名称(这里的数据进行入库)
$arr=$upload->saveAs($img_path); //保存文件
var_dump($arr);
<form action="index.php?r=exercise/upload" method="post" enctype="multipart/form-data">
标题:<input type="text" name="e_title"><br/>
头像:<input type="file" name="e_img"><br/>
<input type="submit" value="提交"></form>
2.多文件上传
1)调用模型层完成:
//模型层
public $e_img;
public function upload(){
foreach ($this->e_img as $file){
$file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
}
return true;
}
//控制器层
use yii\web\UploadedFile;
$model = new Exercise();
$arr = $model->e_img = UploadedFile::getInstances($model, 'e_img');
if ($model->upload()){
for($i=0;$i<count($arr);$i++){
$photo[] = $arr[$i]->name;
}
$str = implode(',',$photo);
$connection = \Yii::$app->db;
$connection->createCommand()->insert('exercise', [
'e_title' => "$e_title",
'e_img' => $str,
])->execute();
return $this->redirect(['exercise/list']);
$connection = \Yii::$app->db;
$command = $connection->createCommand('SELECT * FROM exercise');
$posts = $command->queryAll();
foreach($posts as $key => $val){
$img = explode(',',$val['e_img']);
$val['e_img'] = $img;
$photos[] = $val;
}
return $this->render('list',['list'=>$photos]);
//视图层
<?php foreach($list as $key=>$val){?>
<tr>
<td><?php echo $val['e_title']?></td>
<td>
<?php foreach($val['e_img'] as $k=>$v){?>
<img src="../web/uploads/<?php echo $v?>" style="width:100px;height:100px;"/>
<?php }?>
</td>
</tr>
<?php }?>
2)在调用模型层的基础上序列化
//控制器demo:
<?php
namespace frontend\controllers;
use app\models\Photo;
use Yii;
use yii\web\UploadedFile;
use yii\data\Pagination;
class PhotoController extends \yii\web\Controller{
public function actionIndex(){
$model = new Photo();
return $this->render('index', ['model' => $model]);
}
public function actionUpload(){
$model = new Photo();
if (Yii::$app->request->isPost) {
$arr = $model->photo = UploadedFile::getInstances($model, 'photo');
if ($model->upload()){
for ($i=0; $i <count($arr) ; $i++) {
$img[]= $arr[$i]->name;
}else{
$str = serialize($img);
$model->photo = "$str";
$model->save();
}
}
return $this->render('index', ['model' => $model]);
}
public function actionList(){
$query = Photo::find();
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count(),'pageSize'=>2]);
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('list', [
'models' => $models,
'pages' => $pages,
]);
}
}
//视图层demo:
<table>
<tr>
<td>id</td>
<td>ͼƬ</td>
</tr>
<?php foreach ($models as $key => $v) {?>
<tr>
<td><?php echo $v['p_id']?></td>
<?php
$photos = unserialize($v['photo']);
foreach ($photos as $key => $va) {?>
<td><img src="../web/uploads/<?php echo $va?>" alt="" height="50" width="50"/></td>
<?php }?>
</tr>
<?php }?>
</table>
<?php
use yii\widgets\LinkPager;
echo LinkPager::widget([
'pagination' => $pages,
]);?>
aa sphinx
1、搜索中文时,出现 iconv 不是内部或外部命令。解决办法:运行一下 "set PATH=%CD%\bin;%PATH%",即可解决;
2、bin\indexer -c etc\csft_mysql.conf --all
创建索引
3、echo 搜索的词 | iconv -f gbk -t utf-8 | search -c etc\csft_mysql.conf --stdin | iconv -f utf-8 -t gbk
4.在Yii框架中使用Sphinx
1)
use SphinxClient;
Yii::$classMap['SphinxClient']="@vendor/yiisoft/yii2/sphinx/sphinxapi.php";
$cl=new SphinxClient();
$cl -> SetServer('127.0.0.1',9312);
$cl->SetLimits(($page - 1) * $pagesize , $pagesize );
$cl->SetMaxQueryTime(3000);
$cl->SetConnectTimeout ( 3 );
$cl->SetArrayResult ( true );
$cl->SetMatchMode ( SPH_MATCH_ANY);
$res = $cl -> Query("$name","*");
2)
在common/config/main-local.php中新添加:
'coreseek' => [
'class' => 'SphinxClient',
]
控制器层直接调用:$cl = Yii::$app->coreseek;
aa session cookie
session//控制器层:
1.加载部件
use yii\web\Session;
$session = Yii::$app->session;
//方法1:
$session['name']=$customer['a_user'];
//方法2:
//$session->set('name',$customer['a_user']);
//视图层:
<?php
$session = Yii::$app->session;
//方法1:
echo $session['name'];
//方法2:
//echo $session->get('name');
?>
cookie
use app\models\Login;
存cookie
$cookie = \YII::$app->response->cookies;
$searchs = array("name"=>"search" ,"value"=>$search);
$cookie->add(new Cookie($searchs));
取cookie
$cookie = \YII::$app->request->cookies;
$search = $cookie->getValue("search");
移除cookie
$cookie->remove('search');
aa sphinx 搜索
1.控制器demo:
<?php
namespace frontend\controllers;
use Yii;
use frontend\models\Goods;
use SphinxClient;
use yii\data\Pagination;
class GoodsphinxController extends \yii\web\Controller
{
public function actionIndex()
{
$goods = new Goods();
$request = Yii::$app->request;
$g_name = $request->get('g_name')?$request->get('g_name'):'';
$min_price = $request->get('min_price')?$request->get('min_price'):'';
$max_price = $request->get('max_price')?$request->get('max_price'):'';
$cl = new SphinxClient();
$db = new \yii\db\Query;
$cl->SetServer ('127.0.0.1',9312);
$cl->SetConnectTimeout (3);
if($min_price != "" && $max_price != ""){
//SetFilterFloatRange:浮动范围过滤器
$cl->SetFilterFloatRange("g_price",floatval($min_price),floatval($max_price));
}
//控制搜索结果集的返回格式
$cl->SetArrayResult (true);
$pages = new Pagination([
'totalCount' => 1200,
'defaultPageSize' => 2
]);
$cl -> SetLimits($pages->offset,$pages->limit);
if($g_name==null){
$cl->SetMatchMode (SPH_MATCH_FULLSCAN);
$res = $cl->Query ($g_name, "goods");
$pages->totalCount=$res['total'];
foreach($res['matches'] as $k=>$v){
$ids[]=$v['id'];
}
$data=$db->select('g_id,g_name,g_price')->from('goods')->where(['in','g_id',$ids])->all();
}else{
$cl->SetMatchMode (SPH_MATCH_ANY);
$res = $cl->Query ($g_name, "goods");
$pages->totalCount=$res['total'];
if($res['matches']!=null){
foreach($res['matches'] as $k=>$v){
$ids[]=$v['id'];
}
$data=$db->select('g_id,g_name,g_price')->from('goods')->where(['in','g_id',$ids])->all();
foreach($data as $k=>$v){
$data[$k]['g_name']=$cl->BuildExcerpts([$v['g_name']],'goods',$g_name,array('before_match'=>"<font style='font-weight:bold;color:#f00;'>",'after_match'=>"</font>"))[0];
}
}else{
$data="没有包含<font style='font-weight:bold;color:#f00;'>'{$g_name}'</font>的数据";
}
}
if(Yii::$app->request->isAjax){
return $this->renderPartial('index',['goods'=>$goods,'pages'=>$pages,'data'=>$data]);
}else{
return $this->render('index',['goods'=>$goods,'pages'=>$pages,'data'=>$data]);
}
}
}
2.视图层demo:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\LinkPager;
use yii\web\View;
/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */
$this->title = '搜索';
?>
<div id="lists">
<center>
<h1><?= Html::encode($this->title) ?></h1>
<?php $form = ActiveForm::begin(['action'=>['goodsphinx/index'],'method'=>'get',]); ?>
商品名称:<input type="text" name="g_name">
价格区间:<input type="text" name="min_price">
------<input type="text" name="max_price">
<? echo Html::submitButton('搜索', ['class'=>'btn btn-primary','name' =>'submit-button']) ?>
<?php ActiveForm::end(); ?>
<?php if(is_array($data)){ ?>
<table border=1>
<tr>
<td>ID</td>
<td>商品名称</td>
<td>商品价格</td>
</tr>
<?php foreach($data as $k=>$v){ ?>
<tr>
<td><?= $v['g_id']?></td>
<td><?= $v['g_name']?></td>
<td><?= $v['g_price']?></td>
</tr>
<?php }?>
</table>
<?php }else{ echo $data; } ?>
<?php echo LinkPager::widget([
'pagination'=> $pages,
]); ?>
</center>
</div>
<?php $this->beginBlock('abc'); ?>
$(document).on('click','.pagination a',function(e){
e.preventDefault();
var url=$(this).attr('href');
$.get(url,function(msg){
$('#lists').html(msg);
});
});
<?php $this->endBlock(); $this->registerJs($this->blocks['abc'], View::POS_END); ?>
验证码
1.模型层demo:
引用小部件:
use yii\captcha\Captcha;
定义变量:
public $verifyCode;
验证规则:
['verifyCode', 'captcha','message'=>'验证码错误'],
2.视图层demo:
引用小部件:
use yii\captcha\Captcha;
添加验证码:
<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), [ 'template' =>'<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-6">{input}</div></div>',
]) ?>
缓存使用
1.打开common\config\main.php:
'memcache' => [
'class' => 'yii\caching\Memcache',
'servers' => [
[
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 100,
],
],
],
2.控制器demo:
<?php
namespace frontend\controllers;
use Yii;
use yii\web\Controller;
class CacheController extends Controller
{
//页面缓存
public function behaviors(){
return [
[
'class' => 'yii\filters\PageCache',
'only' => ['index2'],
'duration' => 3,
'variations' => [
\Yii::$app->language,
],
'dependency' => [
'class' => 'yii\caching\DbDependency',
'sql' => 'SELECT COUNT(*) FROM goods',
],
],
];
}
//缓存存入
public function actionIndex(){
Yii::$app->cache->set('name','dada');
Yii::$app->memcache->set('name','xiao');
}
//缓存取出
public function actionIndex2(){
echo "Yii自带系统缓存:".Yii::$app->cache->get('name');
echo "<br/>";
echo "Yii自带Memcache缓存:".Yii::$app->memcache->get('name');
}
//片段缓存
public function actionFragment(){
return $this->render('fragment');
}
}
3.视图层(真静态缓存)demo:
<?php
$id = "123";
echo time();
echo "<br/>";
if ($this->beginCache($id,['duration' => 5])){
echo time();
$this->endCache();
}
第三方登陆
1.index.php文件:
<meta property="qc:admins" content="0353610511410761004162163757164506000" />
<meta charset='utf-8'>
<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>qq登陆</a>
2.info.php文件:
<?php
header("content-type:text/html;charset=utf-8");
//获得code
$code=$_GET['code'];
//获取access_token
$arr=file_get_contents("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101307013&client_secret=838471f08a0470d2a9ba425f68167c1e&code=$code&redirect_uri=http://1.alihw.applinzi.com/info.php");
//print_r($arr);die;
$arr=explode('=',$arr);
$arr=explode('&',$arr[1]);
$access_token=$arr[0];
//print_r($access_token);die;
//获取openid
$url="https://graph.qq.com/oauth2.0/me?access_token=$access_token";
$openid=file_get_contents($url);
//print_r($openid);die;
$str=substr($openid,45,32);
//print_r($str);
//获取用户信息
$url1="https://graph.qq.com/user/get_user_info?access_token=$access_token&oauth_consumer_key=101307013&openid=$str";
$info=file_get_contents($url1);
$user=json_decode($info,true);
$name = $user['nickname'];
$img = $user['figureurl'];
echo "<img src='$img'>".$name."<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>退出</a>";
//print_r($user);
微信开发
1.index.php文件:
<meta property="qc:admins" content="0353610511410761004162163757164506000" />
<meta charset='utf-8'>
<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>qq登陆</a>
2.info.php文件:
<?php
header("content-type:text/html;charset=utf-8");
//获得code
$code=$_GET['code'];
//获取access_token
$arr=file_get_contents("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101307013&client_secret=838471f08a0470d2a9ba425f68167c1e&code=$code&redirect_uri=http://1.alihw.applinzi.com/info.php");
//print_r($arr);die;
$arr=explode('=',$arr);
$arr=explode('&',$arr[1]);
$access_token=$arr[0];
//print_r($access_token);die;
//获取openid
$url="https://graph.qq.com/oauth2.0/me?access_token=$access_token";
$openid=file_get_contents($url);
//print_r($openid);die;
$str=substr($openid,45,32);
//print_r($str);
//获取用户信息
$url1="https://graph.qq.com/user/get_user_info?access_token=$access_token&oauth_consumer_key=101307013&openid=$str";
$info=file_get_contents($url1);
$user=json_decode($info,true);
$name = $user['nickname'];
$img = $user['figureurl'];
echo "<img src='$img'>".$name."<a href='https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101307013&redirect_uri=http://1.alihw.applinzi.com/info.php'>退出</a>";
//print_r($user);
自动载入类文件
1.自己建一个php测试页面
<?php
header("Content-type:text/html;charset=utf-8");
function myLoader($classname){
//实例化文件名
$class_file = strtolower($classname).".php";
if(file_exists($class_file)){
require_once($class_file);
}else{
echo "加载文件失败";
}
}
//注册自定义方法
spl_autoload_register("myLoader");
$test = new Test();
$test->index();
2.建一个类文件test.php
<?php
header("Content-type:text/html;charset=utf-8");
class Test{
function index(){
echo "123";
}
}
coreseek配置文件
#MySQL数据源配置,详情请查看:http://www.coreseek.cn/products-install/mysql/
#请先将var/test/documents.sql导入数据库,并配置好以下的MySQL用户密码数据库
#源定义
source mysql
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = rbac
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = replace into counter (id,max_id)values(1,(select max(g_id) from goods))
sql_query = SELECT g_id, g_name, g_desc FROM goods
#sql_query第一列id需为整数
#title、content作为字符串/文本字段,被全文索引
#sql_attr_uint = g_id #从SQL读取到的值必须为整数
#sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM goods WHERE g_id=$id #命令行查询时,从数据库读取原始数据信息
}
# 增量索引数据源定义
source kk_increase : mysql
{
sql_query_pre = SET NAMES utf8
sql_query = SELECT g_id, g_name, g_desc FROM goods where g_id > (select max_id from counter where id=1)
#sql_query_pre = replace into counter (id,max_id)values(1,(select max(g_id) from goods))
#sql_attr_uint = g_id #从SQL读取到的值必须为整数
#sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM goods WHERE g_id=$id #命令行查询时,从数据库读取原始数据信息
}
#index定义
index mysql
{
source = mysql #对应的source名称
path = E:/coreseek/var/data/mysql #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = E:/coreseek/usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/coreseek/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#增量索引定义
index kk_increase
{
source = kk_increase #对应的source名称
path = E:/coreseek/var/kk_increase
charset_dictpath = E:/coreseek/etc/
charset_type = zh_cn.utf-8
}
#新定义
source goods
{
type = mysql
sql_host = localhost
sql_user = root
sql_pass = root
sql_db = kaoshi
sql_port = 3306
sql_query_pre = SET NAMES utf8
sql_query = SELECT g_id,g_name,g_price FROM goods
sql_attr_float = g_price
#从SQL读取到的值必须为整数,作为时间属性
sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的字符集
sql_query_info = SELECT * FROM goods WHERE g_id=$id #命令行查询时,从数据库读取原始数据信息
}
#index定义
index goods
{
source = goods #对应的source名称
path = E:/coreseek/var/data/goods #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
docinfo = extern
mlock = 0
morphology = none
min_word_len = 1
html_strip = 0
#中文分词配置,详情请查看:http://www.coreseek.cn/products-install/coreseek_mmseg/
#charset_dictpath = E:/coreseek/usr/local/mmseg3/etc/ #BSD、Linux环境下设置,/符号结尾
charset_dictpath = E:/coreseek/etc/ #Windows环境下设置,/符号结尾,最好给出绝对路径,例如:C:/usr/local/coreseek/etc/...
charset_type = zh_cn.utf-8
}
#全局index定义
indexer
{
mem_limit = 128M
}
#searchd服务定义
searchd
{
listen = 9312
read_timeout = 5
max_children = 30
max_matches = 1000
seamless_rotate = 0
preopen_indexes = 0
unlink_old = 1
pid_file = E:/coreseek/var/log/searchd_mysql.pid #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
log = E:/coreseek/var/log/searchd_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
query_log = E:/coreseek/var/log/query_mysql.log #请修改为实际使用的绝对路径,例如:/usr/local/coreseek/var/...
binlog_path = #关闭binlog日志
}
相关文章推荐
- javascript 正则表达式知识点总结:(转并整理)
- SCJP知识点总结
- javascript常用知识点总结
- 知识点 - 基础概念总结
- 项目中遇到的几个知识点总结
- javascript常用知识点总结
- E1线路知识点总结
- 软件评测知识点总结 很经典的哦~
- 自己总结的小知识点
- SCWD知识点总结
- E1知识点总结[ZT]
- Oracle基本知识点总结一
- Oracle基本知识点总结三
- E1知识点总结
- 北京自考北大上机汇编语言知识点总结
- .net小知识点总结
- E1知识点总结
- pl/sql语言的中几个知识点的总结(一)
- (转)javascript javascript常用知识点总结
- ASP.NET知识点总结---技术性知识(2)