PHP框架学习

PHP框架学习

Yii2中如何对ActiveRecoder进行大小范围的操作?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2553 次浏览 • 2018-03-12 14:18 • 来自相关话题

如何解决ThinkPHP5在Nginx服务器上的路由不生效的问题?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3047 次浏览 • 2017-11-19 00:39 • 来自相关话题

Yii2 使用数据库总结(一)

回复

Yii框架zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 2107 次浏览 • 2017-08-24 12:13 • 来自相关话题

Yii框架中rules的一些常见写法总结

Yii框架zkbhj 发表了文章 • 0 个评论 • 1191 次浏览 • 2017-07-21 09:32 • 来自相关话题

/**
* 规则
*/
public function rules()
{
return [
[['real_name','cert_type','cert_num','gender','phone','user_cert1','user_cert2','user_cert3','is_newsign','house_type'],'safe'],
[['cert_type','cert_num','real_name'], 'required','on' => self::SCENARIO_INSERT],
[['cert_type','cert_num','real_name','gender','phone'], 'required','on' => self::SCENARIO_FORSIGN],
['cert_type', 'default', 'value' => 0],
['cert_type','in', 'range'=>Yii::$app->params['allowCertTypeList'],'on' => [self::SCENARIO_UPDATE,self::SCENARIO_INSERT]],
['cert_type','in', 'range'=>[1,2,6,13],'on' => self::SCENARIO_FORSIGN],
['gender','in', 'range'=>Yii::$app->params['allowGenderList']],
['cert_num', function($attribute) {
if (isset($this->$attribute) && !isset($this->cert_type)) {
$this->addError($attribute, '证件类型和证件号码不匹配');
}
$is_cert = \apis\modules\account\models\logics\CertLogic::validateCertNum($this->cert_type,$this->$attribute);
if(!$is_cert){
$this->addError($attribute, '证件类型和证件号码不匹配');
}
}],
['cert_type', function($attribute) {
if($this->$attribute != 1 && (empty($this->user_cert1) || empty($this->user_cert2) || empty($this->user_cert3))){
$this->addError($attribute, '非身份证用户请上传证件照!');
}
},'on' => self::SCENARIO_FORSIGN],
[['user_cert1','user_cert2','user_cert3',],'filter', 'skipOnEmpty'=>true, 'filter'=>function($data){
return \common\models\FnModel::handleUUidToUrl($data);
}],
['real_name', function($attribute) {
$is_name = \apis\modules\account\models\logics\CertLogic::validateRealName($this->real_name);
if(!$is_name){
$this->addError($attribute, '真实姓名不符合规范');
}
},'on' => self::SCENARIO_FORSIGN],
];
}用到了Yii场景的应用,详见:https://ask.zkbhj.com/?/question/4 查看全部
/**
* 规则
*/
public function rules()
{
return [
[['real_name','cert_type','cert_num','gender','phone','user_cert1','user_cert2','user_cert3','is_newsign','house_type'],'safe'],
[['cert_type','cert_num','real_name'], 'required','on' => self::SCENARIO_INSERT],
[['cert_type','cert_num','real_name','gender','phone'], 'required','on' => self::SCENARIO_FORSIGN],
['cert_type', 'default', 'value' => 0],
['cert_type','in', 'range'=>Yii::$app->params['allowCertTypeList'],'on' => [self::SCENARIO_UPDATE,self::SCENARIO_INSERT]],
['cert_type','in', 'range'=>[1,2,6,13],'on' => self::SCENARIO_FORSIGN],
['gender','in', 'range'=>Yii::$app->params['allowGenderList']],
['cert_num', function($attribute) {
if (isset($this->$attribute) && !isset($this->cert_type)) {
$this->addError($attribute, '证件类型和证件号码不匹配');
}
$is_cert = \apis\modules\account\models\logics\CertLogic::validateCertNum($this->cert_type,$this->$attribute);
if(!$is_cert){
$this->addError($attribute, '证件类型和证件号码不匹配');
}
}],
['cert_type', function($attribute) {
if($this->$attribute != 1 && (empty($this->user_cert1) || empty($this->user_cert2) || empty($this->user_cert3))){
$this->addError($attribute, '非身份证用户请上传证件照!');
}
},'on' => self::SCENARIO_FORSIGN],
[['user_cert1','user_cert2','user_cert3',],'filter', 'skipOnEmpty'=>true, 'filter'=>function($data){
return \common\models\FnModel::handleUUidToUrl($data);
}],
['real_name', function($attribute) {
$is_name = \apis\modules\account\models\logics\CertLogic::validateRealName($this->real_name);
if(!$is_name){
$this->addError($attribute, '真实姓名不符合规范');
}
},'on' => self::SCENARIO_FORSIGN],
];
}
用到了Yii场景的应用,详见:https://ask.zkbhj.com/?/question/4

ThinkPHP模板里怎么输出变量?

回复

thinkPHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1778 次浏览 • 2017-06-03 13:39 • 来自相关话题

Yii2地址美化prettyURL并隐藏index.php

Yii框架zkbhj 发表了文章 • 0 个评论 • 1461 次浏览 • 2017-05-03 16:36 • 来自相关话题

目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components‘=>[] 中添加如下代码:
urlManager‘ => [
‘enablePrettyUrl‘ => true,
‘showScriptName‘ => false,//隐藏index.php
//‘enableStrictParsing‘ => false,
‘suffix‘ => ‘.html‘,//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
‘rules‘ => [
//‘<controller:\w+>/<action:\w+>‘=>‘<controller>/<action>‘,
],
],如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了! 查看全部
目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components‘=>[] 中添加如下代码:
urlManager‘ => [
‘enablePrettyUrl‘ => true,
‘showScriptName‘ => false,//隐藏index.php
//‘enableStrictParsing‘ => false,
‘suffix‘ => ‘.html‘,//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
‘rules‘ => [
//‘<controller:\w+>/<action:\w+>‘=>‘<controller>/<action>‘,
],
],
如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了!

yii2中js文件加载的位置怎么设定?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2520 次浏览 • 2017-04-26 16:23 • 来自相关话题

Yii2框架如何返回JSON?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2471 次浏览 • 2017-03-30 09:47 • 来自相关话题

Yii2数据操作Query Builder

Yii框架zkbhj 发表了文章 • 0 个评论 • 1150 次浏览 • 2017-01-04 11:32 • 来自相关话题

Query Builder$rows = (new \yii\db\Query())
->select(['dyn_id', 'dyn_name'])
->from('zs_dynasty')
->where(['between','dyn_id', 1,30])
->limit(10)
->all();
print_r($rows);use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');SELECT$query->select('*')->
select('dyn_id as id, dynasty.dyn_name')->
$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->
$query->select('user_id')->distinct()->

FORM​$query->from('user');
$query->from(['public.user u', 'public.post p']);
$query->from('public.user u, public.post p');
$query->from(['u' => 'public.user', 'p' => 'public.post']);
----------
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);WHEREwhere('status=1')->
where('status=:status', [':status' => $status])->
where([
'status' => 10,
'type' => null,
'id' => [4, 8, 15],
])->
-------
$userQuery = (new Query())->select('id')->from('user');
// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->...->where(['id' => $userQuery])->...
--------
['and', 'id=1', 'id=2'] //id=1 AND id=2
['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
['between', 'id', 1, 10] //id BETWEEN 1 AND 10
['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
['like', 'name', 'tester'] //name LIKE '%tester%'
['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
['exists','id', $userQuery] //EXISTS (sub-query) | not exists
['>', 'age', 10] //age>10ADD WHERE​$status = 10;
$search = 'yii';
$query->where(['status' => $status]);
if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//WHERE (`status` = 10) AND (`title` LIKE '%yii%')
//andWhere() or orWhere()FILTER WHERE​$query->filterWhere([
'username' => $username,
'email' => $email,
]);
//如果email为空,则 WHERE username=:usernameORDER BY$query->orderBy([
'id' => SORT_ASC,
'name' => SORT_DESC,
]);
//orderBy , addOrderByGROUP BY​$query->groupBy('id, status');
$query->addGroupBy(['created_at', 'updated_at']);
HAVING $query->having(['status' => $status]);
//having,andHaving,orHavingLIMIT OR OFFSET$query->limit(10);
$query->offset(10);
JOIN
innerJoin()leftJoin()rightJoin()
$query->select(['user.name AS author', 'post.title as title'])
->from('user')
->leftJoin('post', 'post.user_id = user.id');
$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION$query = new Query();
$query->select("id, category_id as type, name")->from('post')->limit(10);
$anotherQuery = new Query();
$anotherQuery->select('id, type, name')->from('user')->limit(10);
$query->union($anotherQuery);
QUERY METHODS
all() //所有行列one() //第一行column() //第一列scalar() //第一行第一列exists() //是否有结果存在count() //记录数量sum($q), average($q), max($q), min($q) //$q 为字段或表达式
$count = (new \yii\db\Query())
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->count();
//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name


$command = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->createCommand();
    
// show the SQL statement
echo $command->sql;
// show the parameters to be bound
print_r($command->params);


// returns all rows of the query result
$rows = $command->queryAll();

QUERY RESULTSuse yii\db\Query;
$query = (new Query())
->from('user')
->indexBy('username');
foreach ($query->batch() as $users) {
// $users is indexed by the "username" column
}
foreach ($query->each() as $username => $user) {
}INDEXINGuse yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
foreach ($query->batch() as $users) {
// batch( $batchSize = 100, $db = null )
// 一个批次取100行
}
foreach ($query->each() as $user) {
// 一行一行取
}


 
 
  查看全部
Query Builder
$rows = (new \yii\db\Query())
->select(['dyn_id', 'dyn_name'])
->from('zs_dynasty')
->where(['between','dyn_id', 1,30])
->limit(10)
->all();
print_r($rows);
use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
SELECT
$query->select('*')->
select('dyn_id as id, dynasty.dyn_name')->
$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->
$query->select('user_id')->distinct()->

FORM​
$query->from('user');
$query->from(['public.user u', 'public.post p']);
$query->from('public.user u, public.post p');
$query->from(['u' => 'public.user', 'p' => 'public.post']);
----------
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);
WHERE
where('status=1')->
where('status=:status', [':status' => $status])->
where([
'status' => 10,
'type' => null,
'id' => [4, 8, 15],
])->
-------
$userQuery = (new Query())->select('id')->from('user');
// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->...->where(['id' => $userQuery])->...
--------
['and', 'id=1', 'id=2'] //id=1 AND id=2
['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
['between', 'id', 1, 10] //id BETWEEN 1 AND 10
['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
['like', 'name', 'tester'] //name LIKE '%tester%'
['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
['exists','id', $userQuery] //EXISTS (sub-query) | not exists
['>', 'age', 10] //age>10
ADD WHERE​
$status = 10;
$search = 'yii';
$query->where(['status' => $status]);
if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//WHERE (`status` = 10) AND (`title` LIKE '%yii%')
//andWhere() or orWhere()
FILTER WHERE​
$query->filterWhere([
'username' => $username,
'email' => $email,
]);
//如果email为空,则 WHERE username=:username
ORDER BY
$query->orderBy([
'id' => SORT_ASC,
'name' => SORT_DESC,
]);
//orderBy , addOrderBy
GROUP BY​
$query->groupBy('id, status');
$query->addGroupBy(['created_at', 'updated_at']);

HAVING 
$query->having(['status' => $status]);
//having,andHaving,orHaving
LIMIT OR OFFSET
$query->limit(10);
$query->offset(10);

JOIN
  • innerJoin()
  • leftJoin()
  • rightJoin()

$query->select(['user.name AS author', 'post.title as title'])
->from('user')
->leftJoin('post', 'post.user_id = user.id');
$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION
$query = new Query();
$query->select("id, category_id as type, name")->from('post')->limit(10);
$anotherQuery = new Query();
$anotherQuery->select('id, type, name')->from('user')->limit(10);
$query->union($anotherQuery);

QUERY METHODS
  • all() //所有行列
  • one() //第一行
  • column() //第一列
  • scalar() //第一行第一列
  • exists() //是否有结果存在
  • count() //记录数量
  • sum($q), average($q), max($q), min($q) //$q 为字段或表达式

$count = (new \yii\db\Query())
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->count();
//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name


$command = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->createCommand();
    
// show the SQL statement
echo $command->sql;
// show the parameters to be bound
print_r($command->params);


// returns all rows of the query result
$rows = $command->queryAll();

QUERY RESULTS
use yii\db\Query;
$query = (new Query())
->from('user')
->indexBy('username');
foreach ($query->batch() as $users) {
// $users is indexed by the "username" column
}
foreach ($query->each() as $username => $user) {
}
INDEXING
use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
foreach ($query->batch() as $users) {
// batch( $batchSize = 100, $db = null )
// 一个批次取100行
}
foreach ($query->each() as $user) {
// 一行一行取
}


 
 
 

Yii2中如何开发自己的或者是封装别人的组件给系统使用?

回复

Yii框架zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 2645 次浏览 • 2016-11-18 16:15 • 来自相关话题

条新动态, 点击查看
zkbhj

zkbhj 回答了问题 • 2016-10-14 17:18 • 2 个回复 不感兴趣

Yii2如何进行多库配置和操作?

赞同来自:

1、配置文件中配置多个数据库信息:
[code]'components' => [
'db' => [
'class' => 'yiidbConnection',
'dsn' => 'mysql:... 显示全部 »
1、配置文件中配置多个数据库信息:
[code]'components' => [
'db' => [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=ip;dbname=dbname',
'username' => 'username',
'password' => 'pwd',
'charset' => 'utf8',
],
'db2' => ,
],
2、建立模型Model,在model中加入下面的static方法:
public static function getDb() {
return Yii::$app->db2;
}
3、在要使用的位置:
[code]use common\models\modelName;

$model = new modelName();

//验证
$model->setAttributes($data);
$model->validate()

//查询
$list = $model->findOne(['id'=>$data["id"]]);

//更新
$updateModel = $model->findOne( ]);
$updateModel->key = $value;
$updateModel->save();

//插入
$model->setAttributes($data);
$result = $model->save();

Yii2中如何对ActiveRecoder进行大小范围的操作?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2553 次浏览 • 2018-03-12 14:18 • 来自相关话题

如何解决ThinkPHP5在Nginx服务器上的路由不生效的问题?

回复

服务器zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 3047 次浏览 • 2017-11-19 00:39 • 来自相关话题

Yii2 使用数据库总结(一)

回复

Yii框架zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 2107 次浏览 • 2017-08-24 12:13 • 来自相关话题

ThinkPHP模板里怎么输出变量?

回复

thinkPHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1778 次浏览 • 2017-06-03 13:39 • 来自相关话题

yii2中js文件加载的位置怎么设定?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2520 次浏览 • 2017-04-26 16:23 • 来自相关话题

Yii2框架如何返回JSON?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2471 次浏览 • 2017-03-30 09:47 • 来自相关话题

Yii2中如何开发自己的或者是封装别人的组件给系统使用?

回复

Yii框架zkbhj 发起了问题 • 1 人关注 • 0 个回复 • 2645 次浏览 • 2016-11-18 16:15 • 来自相关话题

怎么获取Yii中模块、控制器、动作名?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 1 个回复 • 1644 次浏览 • 2016-11-10 12:22 • 来自相关话题

Yii2如何进行多库配置和操作?

回复

Yii框架zkbhj 回复了问题 • 1 人关注 • 2 个回复 • 2732 次浏览 • 2016-10-14 17:20 • 来自相关话题

怎么自定义ThinkPHP的错误页面?

回复

thinkPHPzkbhj 回复了问题 • 1 人关注 • 1 个回复 • 2694 次浏览 • 2016-09-08 20:42 • 来自相关话题

Yii框架中rules的一些常见写法总结

Yii框架zkbhj 发表了文章 • 0 个评论 • 1191 次浏览 • 2017-07-21 09:32 • 来自相关话题

/**
* 规则
*/
public function rules()
{
return [
[['real_name','cert_type','cert_num','gender','phone','user_cert1','user_cert2','user_cert3','is_newsign','house_type'],'safe'],
[['cert_type','cert_num','real_name'], 'required','on' => self::SCENARIO_INSERT],
[['cert_type','cert_num','real_name','gender','phone'], 'required','on' => self::SCENARIO_FORSIGN],
['cert_type', 'default', 'value' => 0],
['cert_type','in', 'range'=>Yii::$app->params['allowCertTypeList'],'on' => [self::SCENARIO_UPDATE,self::SCENARIO_INSERT]],
['cert_type','in', 'range'=>[1,2,6,13],'on' => self::SCENARIO_FORSIGN],
['gender','in', 'range'=>Yii::$app->params['allowGenderList']],
['cert_num', function($attribute) {
if (isset($this->$attribute) && !isset($this->cert_type)) {
$this->addError($attribute, '证件类型和证件号码不匹配');
}
$is_cert = \apis\modules\account\models\logics\CertLogic::validateCertNum($this->cert_type,$this->$attribute);
if(!$is_cert){
$this->addError($attribute, '证件类型和证件号码不匹配');
}
}],
['cert_type', function($attribute) {
if($this->$attribute != 1 && (empty($this->user_cert1) || empty($this->user_cert2) || empty($this->user_cert3))){
$this->addError($attribute, '非身份证用户请上传证件照!');
}
},'on' => self::SCENARIO_FORSIGN],
[['user_cert1','user_cert2','user_cert3',],'filter', 'skipOnEmpty'=>true, 'filter'=>function($data){
return \common\models\FnModel::handleUUidToUrl($data);
}],
['real_name', function($attribute) {
$is_name = \apis\modules\account\models\logics\CertLogic::validateRealName($this->real_name);
if(!$is_name){
$this->addError($attribute, '真实姓名不符合规范');
}
},'on' => self::SCENARIO_FORSIGN],
];
}用到了Yii场景的应用,详见:https://ask.zkbhj.com/?/question/4 查看全部
/**
* 规则
*/
public function rules()
{
return [
[['real_name','cert_type','cert_num','gender','phone','user_cert1','user_cert2','user_cert3','is_newsign','house_type'],'safe'],
[['cert_type','cert_num','real_name'], 'required','on' => self::SCENARIO_INSERT],
[['cert_type','cert_num','real_name','gender','phone'], 'required','on' => self::SCENARIO_FORSIGN],
['cert_type', 'default', 'value' => 0],
['cert_type','in', 'range'=>Yii::$app->params['allowCertTypeList'],'on' => [self::SCENARIO_UPDATE,self::SCENARIO_INSERT]],
['cert_type','in', 'range'=>[1,2,6,13],'on' => self::SCENARIO_FORSIGN],
['gender','in', 'range'=>Yii::$app->params['allowGenderList']],
['cert_num', function($attribute) {
if (isset($this->$attribute) && !isset($this->cert_type)) {
$this->addError($attribute, '证件类型和证件号码不匹配');
}
$is_cert = \apis\modules\account\models\logics\CertLogic::validateCertNum($this->cert_type,$this->$attribute);
if(!$is_cert){
$this->addError($attribute, '证件类型和证件号码不匹配');
}
}],
['cert_type', function($attribute) {
if($this->$attribute != 1 && (empty($this->user_cert1) || empty($this->user_cert2) || empty($this->user_cert3))){
$this->addError($attribute, '非身份证用户请上传证件照!');
}
},'on' => self::SCENARIO_FORSIGN],
[['user_cert1','user_cert2','user_cert3',],'filter', 'skipOnEmpty'=>true, 'filter'=>function($data){
return \common\models\FnModel::handleUUidToUrl($data);
}],
['real_name', function($attribute) {
$is_name = \apis\modules\account\models\logics\CertLogic::validateRealName($this->real_name);
if(!$is_name){
$this->addError($attribute, '真实姓名不符合规范');
}
},'on' => self::SCENARIO_FORSIGN],
];
}
用到了Yii场景的应用,详见:https://ask.zkbhj.com/?/question/4

Yii2地址美化prettyURL并隐藏index.php

Yii框架zkbhj 发表了文章 • 0 个评论 • 1461 次浏览 • 2017-05-03 16:36 • 来自相关话题

目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components‘=>[] 中添加如下代码:
urlManager‘ => [
‘enablePrettyUrl‘ => true,
‘showScriptName‘ => false,//隐藏index.php
//‘enableStrictParsing‘ => false,
‘suffix‘ => ‘.html‘,//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
‘rules‘ => [
//‘<controller:\w+>/<action:\w+>‘=>‘<controller>/<action>‘,
],
],如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了! 查看全部
目的:我只想去掉浏览器地址栏中的index.php?r=这一块。

在/config/web.php中 ’components‘=>[] 中添加如下代码:
urlManager‘ => [
‘enablePrettyUrl‘ => true,
‘showScriptName‘ => false,//隐藏index.php
//‘enableStrictParsing‘ => false,
‘suffix‘ => ‘.html‘,//后缀,如果设置了此项,那么浏览器地址栏就必须带上.html后缀,否则会报404错误
‘rules‘ => [
//‘<controller:\w+>/<action:\w+>‘=>‘<controller>/<action>‘,
],
],
如果带了改了后缀这一下,请记得一定要给浏览器地址栏的路径最后面加上.html。

改了以上这些,我发现?r=这块可以用/代替访问了,但是想隐藏掉index.php还是不行。

我们还需在index.php同级的目录下添加.htaccess文件:

打开记事本,输入以下代码:
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
然后保存在与入口文件index.php同级的目录下,也就是/web目录下,文件名自己填.htaccess,文件类型选择 所有文件 (*.*) ,然后保存即可。

最后测试OK了!

Yii2数据操作Query Builder

Yii框架zkbhj 发表了文章 • 0 个评论 • 1150 次浏览 • 2017-01-04 11:32 • 来自相关话题

Query Builder$rows = (new \yii\db\Query())
->select(['dyn_id', 'dyn_name'])
->from('zs_dynasty')
->where(['between','dyn_id', 1,30])
->limit(10)
->all();
print_r($rows);use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');SELECT$query->select('*')->
select('dyn_id as id, dynasty.dyn_name')->
$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->
$query->select('user_id')->distinct()->

FORM​$query->from('user');
$query->from(['public.user u', 'public.post p']);
$query->from('public.user u, public.post p');
$query->from(['u' => 'public.user', 'p' => 'public.post']);
----------
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);WHEREwhere('status=1')->
where('status=:status', [':status' => $status])->
where([
'status' => 10,
'type' => null,
'id' => [4, 8, 15],
])->
-------
$userQuery = (new Query())->select('id')->from('user');
// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->...->where(['id' => $userQuery])->...
--------
['and', 'id=1', 'id=2'] //id=1 AND id=2
['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
['between', 'id', 1, 10] //id BETWEEN 1 AND 10
['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
['like', 'name', 'tester'] //name LIKE '%tester%'
['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
['exists','id', $userQuery] //EXISTS (sub-query) | not exists
['>', 'age', 10] //age>10ADD WHERE​$status = 10;
$search = 'yii';
$query->where(['status' => $status]);
if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//WHERE (`status` = 10) AND (`title` LIKE '%yii%')
//andWhere() or orWhere()FILTER WHERE​$query->filterWhere([
'username' => $username,
'email' => $email,
]);
//如果email为空,则 WHERE username=:usernameORDER BY$query->orderBy([
'id' => SORT_ASC,
'name' => SORT_DESC,
]);
//orderBy , addOrderByGROUP BY​$query->groupBy('id, status');
$query->addGroupBy(['created_at', 'updated_at']);
HAVING $query->having(['status' => $status]);
//having,andHaving,orHavingLIMIT OR OFFSET$query->limit(10);
$query->offset(10);
JOIN
innerJoin()leftJoin()rightJoin()
$query->select(['user.name AS author', 'post.title as title'])
->from('user')
->leftJoin('post', 'post.user_id = user.id');
$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION$query = new Query();
$query->select("id, category_id as type, name")->from('post')->limit(10);
$anotherQuery = new Query();
$anotherQuery->select('id, type, name')->from('user')->limit(10);
$query->union($anotherQuery);
QUERY METHODS
all() //所有行列one() //第一行column() //第一列scalar() //第一行第一列exists() //是否有结果存在count() //记录数量sum($q), average($q), max($q), min($q) //$q 为字段或表达式
$count = (new \yii\db\Query())
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->count();
//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name


$command = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->createCommand();
    
// show the SQL statement
echo $command->sql;
// show the parameters to be bound
print_r($command->params);


// returns all rows of the query result
$rows = $command->queryAll();

QUERY RESULTSuse yii\db\Query;
$query = (new Query())
->from('user')
->indexBy('username');
foreach ($query->batch() as $users) {
// $users is indexed by the "username" column
}
foreach ($query->each() as $username => $user) {
}INDEXINGuse yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
foreach ($query->batch() as $users) {
// batch( $batchSize = 100, $db = null )
// 一个批次取100行
}
foreach ($query->each() as $user) {
// 一行一行取
}


 
 
  查看全部
Query Builder
$rows = (new \yii\db\Query())
->select(['dyn_id', 'dyn_name'])
->from('zs_dynasty')
->where(['between','dyn_id', 1,30])
->limit(10)
->all();
print_r($rows);
use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
SELECT
$query->select('*')->
select('dyn_id as id, dynasty.dyn_name')->
$query->select(['dyn_id as id', "CONCAT(dyn_name,'a')"])->
$query->select('user_id')->distinct()->

FORM​
$query->from('user');
$query->from(['public.user u', 'public.post p']);
$query->from('public.user u, public.post p');
$query->from(['u' => 'public.user', 'p' => 'public.post']);
----------
$subQuery = (new Query())->select('id')->from('user')->where('status=1');
// SELECT * FROM (SELECT `id` FROM `user` WHERE status=1) u
$query->from(['u' => $subQuery]);
WHERE
where('status=1')->
where('status=:status', [':status' => $status])->
where([
'status' => 10,
'type' => null,
'id' => [4, 8, 15],
])->
-------
$userQuery = (new Query())->select('id')->from('user');
// ...WHERE `id` IN (SELECT `id` FROM `user`)
$query->...->where(['id' => $userQuery])->...
--------
['and', 'id=1', 'id=2'] //id=1 AND id=2
['and', 'type=1', ['or', 'id=1', 'id=2']] //type=1 AND (id=1 OR id=2)
['between', 'id', 1, 10] //id BETWEEN 1 AND 10
['not between', 'id', 1, 10] //not id BETWEEN 1 AND 10
['in', 'id', [1, 2, 3]] //id IN (1, 2, 3)
['not in', 'id', [1, 2, 3]] //not id IN (1, 2, 3)
['like', 'name', 'tester'] //name LIKE '%tester%'
['like', 'name', ['test', 'sample']] //name LIKE '%test%' AND name LIKE '%sample%'
['not like', 'name', ['or', 'test', 'sample']] //not name LIKE '%test%' OR not name LIKE '%sample%'
['exists','id', $userQuery] //EXISTS (sub-query) | not exists
['>', 'age', 10] //age>10
ADD WHERE​
$status = 10;
$search = 'yii';
$query->where(['status' => $status]);
if (!empty($search)) {
$query->andWhere(['like', 'title', $search]);
}
//WHERE (`status` = 10) AND (`title` LIKE '%yii%')
//andWhere() or orWhere()
FILTER WHERE​
$query->filterWhere([
'username' => $username,
'email' => $email,
]);
//如果email为空,则 WHERE username=:username
ORDER BY
$query->orderBy([
'id' => SORT_ASC,
'name' => SORT_DESC,
]);
//orderBy , addOrderBy
GROUP BY​
$query->groupBy('id, status');
$query->addGroupBy(['created_at', 'updated_at']);

HAVING 
$query->having(['status' => $status]);
//having,andHaving,orHaving
LIMIT OR OFFSET
$query->limit(10);
$query->offset(10);

JOIN
  • innerJoin()
  • leftJoin()
  • rightJoin()

$query->select(['user.name AS author', 'post.title as title'])
->from('user')
->leftJoin('post', 'post.user_id = user.id');
$query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
$query->leftJoin(['u' => $subQuery], 'u.id=author_id');

UNION
$query = new Query();
$query->select("id, category_id as type, name")->from('post')->limit(10);
$anotherQuery = new Query();
$anotherQuery->select('id, type, name')->from('user')->limit(10);
$query->union($anotherQuery);

QUERY METHODS
  • all() //所有行列
  • one() //第一行
  • column() //第一列
  • scalar() //第一行第一列
  • exists() //是否有结果存在
  • count() //记录数量
  • sum($q), average($q), max($q), min($q) //$q 为字段或表达式

$count = (new \yii\db\Query())
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->count();
//SELECT COUNT(*) FROM `user` WHERE `last_name`=:last_name


$command = (new \yii\db\Query())
    ->select(['id', 'email'])
    ->from('user')
    ->where(['last_name' => 'Smith'])
    ->limit(10)
    ->createCommand();
    
// show the SQL statement
echo $command->sql;
// show the parameters to be bound
print_r($command->params);


// returns all rows of the query result
$rows = $command->queryAll();

QUERY RESULTS
use yii\db\Query;
$query = (new Query())
->from('user')
->indexBy('username');
foreach ($query->batch() as $users) {
// $users is indexed by the "username" column
}
foreach ($query->each() as $username => $user) {
}
INDEXING
use yii\db\Query;
$query = (new Query())
->from('user')
->orderBy('id');
foreach ($query->batch() as $users) {
// batch( $batchSize = 100, $db = null )
// 一个批次取100行
}
foreach ($query->each() as $user) {
// 一行一行取
}


 
 
 

MVVM架构的简单解析

专业名词zkbhj 发表了文章 • 0 个评论 • 886 次浏览 • 2016-09-20 16:50 • 来自相关话题

在SilverLight或者WPF开发中,为什么要用MVVM架构

使用MVVM架构最大的好处是:开发人员在写程序的时候不需要做UI,而设计人员可以使用Microsoft Expression Blend 4+设计全部的UI并且不需要写任何代码。
 







主要的好处如下:

1、设计人员可以用设计工具很容易的设计UI,而且不需要写任何代码

2、你可以更好的设计UI,而且可以让即使不是开发人员使用。

3、可以先设计UI或者与开发同时设计。

4、当UI全部改变时,代码可以不改变。

为了达到以上要求。当你设计UI时,后台不能有任何代码。并且UI与应用程序通过Bindings和Commands相互交互,其中Bindings和Commands在ViewModel中设计。 
The Model





 
Model层主要为应用程序提供数据。其主要包含

1、Web Services:SilverLight应用程序的特点就是必须通过Web service取得数据,你可以调用Web Service中的方法。

2、Rest Services:和Web Services一样

3、Generic Collections:任何类型的数据集合
 
The View Model
 





 
View Model一般有以下三个部分组成

1、属性:一个事物,它的类型可以是一个字符型,也可以是一个对象。实现接口INotifyPropertyChanged,那么任何UI元素绑定到这个属性,不管这个属性什么时候改变都能自动和UI层交互。

2、集合:事物的集合,它的类型一般是ObservableCollection,因此,任何UI元素绑定到它,不管这个集合什么时候改变,都可以自动的与UI交互。

3、Commands:一个可以被触发的事件,并且可以传递一个类型为Object的参数。但是前提是要实现接口ICommand。
 
The View
 





 
这一层可以用Expression Blend设计,不用写任何代码。

主要有以下三个部分组成

1、把View Model层的属性绑定到 text box, radio button, toggle button, MediaElement, trigger an animation or ViewState change

2、把View Model层的集合绑定到ListBox,TreeView,DataGrid

3、Commands

使用InvokeCommandAction实现以下behavior

A、绑定View Model层的ICommand

B、指出你需要实现的ICommand(比如Click事件,Selected事件。。。)

C、传递参数 查看全部
在SilverLight或者WPF开发中,为什么要用MVVM架构

使用MVVM架构最大的好处是:开发人员在写程序的时候不需要做UI,而设计人员可以使用Microsoft Expression Blend 4+设计全部的UI并且不需要写任何代码。
 

img16.jpg



主要的好处如下:

1、设计人员可以用设计工具很容易的设计UI,而且不需要写任何代码

2、你可以更好的设计UI,而且可以让即使不是开发人员使用。

3、可以先设计UI或者与开发同时设计。

4、当UI全部改变时,代码可以不改变。

为了达到以上要求。当你设计UI时,后台不能有任何代码。并且UI与应用程序通过Bindings和Commands相互交互,其中Bindings和Commands在ViewModel中设计。 
The Model

1.png

 
Model层主要为应用程序提供数据。其主要包含

1、Web Services:SilverLight应用程序的特点就是必须通过Web service取得数据,你可以调用Web Service中的方法。

2、Rest Services:和Web Services一样

3、Generic Collections:任何类型的数据集合
 
The View Model
 

2.png

 
View Model一般有以下三个部分组成

1、属性:一个事物,它的类型可以是一个字符型,也可以是一个对象。实现接口INotifyPropertyChanged,那么任何UI元素绑定到这个属性,不管这个属性什么时候改变都能自动和UI层交互。

2、集合:事物的集合,它的类型一般是ObservableCollection,因此,任何UI元素绑定到它,不管这个集合什么时候改变,都可以自动的与UI交互。

3、Commands:一个可以被触发的事件,并且可以传递一个类型为Object的参数。但是前提是要实现接口ICommand。
 
The View
 

3.png

 
这一层可以用Expression Blend设计,不用写任何代码。

主要有以下三个部分组成

1、把View Model层的属性绑定到 text box, radio button, toggle button, MediaElement, trigger an animation or ViewState change

2、把View Model层的集合绑定到ListBox,TreeView,DataGrid

3、Commands

使用InvokeCommandAction实现以下behavior

A、绑定View Model层的ICommand

B、指出你需要实现的ICommand(比如Click事件,Selected事件。。。)

C、传递参数

MVC,MVP 和 MVVM 的差异对比

架构思想zkbhj 发表了文章 • 0 个评论 • 997 次浏览 • 2016-09-20 16:36 • 来自相关话题

复杂的软件必须有清晰合理的架构,否则无法开发和维护。

MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。
 
一、MVC
 
MVC模式的意思是,软件可以分成三个部分。






视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存

各部分之间的通信方式如下。






View 传送指令到 Controller
Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。
 
 
二、互动模式
 
接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。






另一种是直接通过controller接受指令。
 






三、实例:Backbone​
 
实际项目往往采用更灵活的方式,以 Backbone.js 为例。
 






1. 用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。

2. 用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。

3. Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。

 四、MVP
 
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。






1. 各部分之间的通信,都是双向的。

2. View 与 Model 不发生联系,都通过 Presenter 传递。

3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

 五、MVVM
 
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
 





 
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。 查看全部
复杂的软件必须有清晰合理的架构,否则无法开发和维护。

MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。
 
一、MVC
 
MVC模式的意思是,软件可以分成三个部分。

bg2015020104.png


视图(View):用户界面。
控制器(Controller):业务逻辑
模型(Model):数据保存


各部分之间的通信方式如下。

bg2015020105.png


View 传送指令到 Controller
Controller 完成业务逻辑后,要求 Model 改变状态
Model 将新的数据发送到 View,用户得到反馈


所有通信都是单向的。
 
 
二、互动模式
 
接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。

bg2015020106.png


另一种是直接通过controller接受指令。
 

bg2015020107.png


三、实例:Backbone​
 
实际项目往往采用更灵活的方式,以 Backbone.js 为例。
 

bg2015020108.png


1. 用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。

2. 用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。

3. Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。


 四、MVP
 
MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

bg2015020109.png


1. 各部分之间的通信,都是双向的。

2. View 与 Model 不发生联系,都通过 Presenter 传递。

3. View 非常薄,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。


 五、MVVM
 
MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。
 

bg2015020110.png

 
唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。

PHP用CURL模拟POST和GET请求方法

PHPzkbhj 发表了文章 • 0 个评论 • 952 次浏览 • 2016-08-16 15:25 • 来自相关话题

在php中要模拟post请求数据提交我们会使用到curl函数,下面我来给大家举几个curl模拟post请求提交数据例子有需要的朋友可参考参考。注意:curl函数在php中默认是不被支持的,如果需要使用curl函数我们需在改一改你的php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了。
 
【例1】
<?php
$uri = "http://tanteng.duapp.com/test.php";
// 参数数组
$data = array (
'name' => 'tanteng'
// 'password' => 'password'
);

$ch = curl_init ();
// print_r($ch);
curl_setopt ( $ch, CURLOPT_URL, $uri );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
$return = curl_exec ( $ch );
curl_close ( $ch );

print_r($return);

接受php页面远程服务器:

<?php
if(isset($_POST['name'])){
if(!empty($_POST['name'])){
echo '您好,',$_POST['name'].'!';
}
}
?>【例2:模拟POST请求 提交数据或上传文件】
http://www.a.com/a.php

发送POST请求

function execUpload(){


$file = '/doucment/Readme.txt';
$ch = curl_init();
$post_data = array(
'loginfield' => 'username',
'username' => 'ybb',
'password' => '123456',
'file' => '@d:usrwwwtranslatedocumentReadme.txt'
);
curl_setopt($ch, CURLOPT_HEADER, false);
//启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
curl_setopt($ch, CURLOPT_URL, 'http://www.b.com/handleUpload.php');
$info= curl_exec($ch);
curl_close($ch);

print_r($info);

}

2.http://www.b.com/handleUpload.php

function handleUpload(){
print_r($_POST);
echo '===file upload info:';
print_r($_FILES);
}【CURL函数列表】

■curl_close — 关闭一个cURL会话
■curl_copy_handle — 复制一个cURL句柄和它的所有选项
■curl_errno — 返回最后一次的错误号
■curl_error — 返回一个保护当前会话最近一次错误的字符串
■curl_exec — 执行一个cURL会话
■curl_getinfo — 获取一个cURL连接资源句柄的信息
■curl_init — 初始化一个cURL会话
■curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
■curl_multi_close — 关闭一组cURL句柄
■curl_multi_exec — 运行当前 cURL 句柄的子连接
■curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
■curl_multi_info_read — 获取当前解析的cURL的相关传输信息
■curl_multi_init — 返回一个新cURL批处理句柄
■curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
■curl_multi_select — 等待所有cURL批处理中的活动连接
■curl_setopt_array — 为cURL传输会话批量设置选项
■curl_setopt — 设置一个cURL传输选项
■curl_version — 获取cURL版本信息 查看全部
在php中要模拟post请求数据提交我们会使用到curl函数,下面我来给大家举几个curl模拟post请求提交数据例子有需要的朋友可参考参考。注意:curl函数在php中默认是不被支持的,如果需要使用curl函数我们需在改一改你的php.ini文件的设置,找到php_curl.dll去掉前面的";"就行了。
 
【例1】
<?php
$uri = "http://tanteng.duapp.com/test.php";
// 参数数组
$data = array (
'name' => 'tanteng'
// 'password' => 'password'
);

$ch = curl_init ();
// print_r($ch);
curl_setopt ( $ch, CURLOPT_URL, $uri );
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
$return = curl_exec ( $ch );
curl_close ( $ch );

print_r($return);

接受php页面远程服务器:

<?php
if(isset($_POST['name'])){
if(!empty($_POST['name'])){
echo '您好,',$_POST['name'].'!';
}
}
?>
【例2:模拟POST请求 提交数据或上传文件】
http://www.a.com/a.php

发送POST请求

function execUpload(){


$file = '/doucment/Readme.txt';
$ch = curl_init();
$post_data = array(
'loginfield' => 'username',
'username' => 'ybb',
'password' => '123456',
'file' => '@d:usrwwwtranslatedocumentReadme.txt'
);
curl_setopt($ch, CURLOPT_HEADER, false);
//启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_BINARYTRANSFER,true);
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data);
curl_setopt($ch, CURLOPT_URL, 'http://www.b.com/handleUpload.php');
$info= curl_exec($ch);
curl_close($ch);

print_r($info);

}

2.http://www.b.com/handleUpload.php

function handleUpload(){
print_r($_POST);
echo '===file upload info:';
print_r($_FILES);
}
【CURL函数列表】


■curl_close — 关闭一个cURL会话
■curl_copy_handle — 复制一个cURL句柄和它的所有选项
■curl_errno — 返回最后一次的错误号
■curl_error — 返回一个保护当前会话最近一次错误的字符串
■curl_exec — 执行一个cURL会话
■curl_getinfo — 获取一个cURL连接资源句柄的信息
■curl_init — 初始化一个cURL会话
■curl_multi_add_handle — 向curl批处理会话中添加单独的curl句柄
■curl_multi_close — 关闭一组cURL句柄
■curl_multi_exec — 运行当前 cURL 句柄的子连接
■curl_multi_getcontent — 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
■curl_multi_info_read — 获取当前解析的cURL的相关传输信息
■curl_multi_init — 返回一个新cURL批处理句柄
■curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源
■curl_multi_select — 等待所有cURL批处理中的活动连接
■curl_setopt_array — 为cURL传输会话批量设置选项
■curl_setopt — 设置一个cURL传输选项
■curl_version — 获取cURL版本信息


兼容Java的AES加密

PHPzkbhj 发表了文章 • 0 个评论 • 961 次浏览 • 2016-08-15 16:26 • 来自相关话题

 <?php
class CryptAES
{
protected $cipher = MCRYPT_RIJNDAEL_128;
protected $mode = MCRYPT_MODE_ECB;
protected $pad_method = NULL;
protected $secret_key = '';
protected $iv = '';

public function set_cipher($cipher)
{
$this->cipher = $cipher;
}

public function set_mode($mode)
{
$this->mode = $mode;
}

public function set_iv($iv)
{
$this->iv = $iv;
}

public function set_key($key)
{
$this->secret_key = $key;
}

public function require_pkcs5()
{
$this->pad_method = 'pkcs5';
}

protected function pad_or_unpad($str, $ext)
{
if ( is_null($this->pad_method) )
{
return $str;
}
else
{
$func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';
if ( is_callable($func_name) )
{
$size = mcrypt_get_block_size($this->cipher, $this->mode);
return call_user_func($func_name, $str, $size);
}
}
return $str;
}

protected function pad($str)
{
return $this->pad_or_unpad($str, '');
}

protected function unpad($str)
{
return $this->pad_or_unpad($str, 'un');
}

public function encrypt($str)
{
$str = $this->pad($str);
$td = mcrypt_module_open($this->cipher, '', $this->mode, '');

if ( empty($this->iv) )
{
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
}
else
{
$iv = $this->iv;
}

mcrypt_generic_init($td, $this->secret_key, $iv);
$cyper_text = mcrypt_generic($td, $str);
$rt=base64_encode($cyper_text);
//$rt = bin2hex($cyper_text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return $rt;
}

public function decrypt($str){
$td = mcrypt_module_open($this->cipher, '', $this->mode, '');

if ( empty($this->iv) )
{
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
}
else
{
$iv = $this->iv;
}

mcrypt_generic_init($td, $this->secret_key, $iv);
//$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));
$decrypted_text = mdecrypt_generic($td, base64_decode($str));
$rt = $decrypted_text;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return $this->unpad($rt);
}

public static function hex2bin($hexdata) {
$bindata = '';
$length = strlen($hexdata);
for ($i=0; $i < $length; $i += 2)
{
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}

public static function pkcs5_pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}

public static function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text) - 1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
}

$keyStr = '8dfw091qdfdl5l2tt6wewewfdqxj';
$plainText = 'this is a string will be AES_Encrypt1';
$params = array(
"uid"=>"77a968d1-1d67-6fc0-fb48-88848f99da63",
"systemSource"=> "ami"
);
$string = json_encode($params);
$aes = new CryptAES();
$aes->set_key($keyStr);
$aes->require_pkcs5();
$encText = $aes->encrypt($string);
$decString = $aes->decrypt($encText);

echo $encText,"<br>",$string;

?> 查看全部
 
<?php
class CryptAES
{
protected $cipher = MCRYPT_RIJNDAEL_128;
protected $mode = MCRYPT_MODE_ECB;
protected $pad_method = NULL;
protected $secret_key = '';
protected $iv = '';

public function set_cipher($cipher)
{
$this->cipher = $cipher;
}

public function set_mode($mode)
{
$this->mode = $mode;
}

public function set_iv($iv)
{
$this->iv = $iv;
}

public function set_key($key)
{
$this->secret_key = $key;
}

public function require_pkcs5()
{
$this->pad_method = 'pkcs5';
}

protected function pad_or_unpad($str, $ext)
{
if ( is_null($this->pad_method) )
{
return $str;
}
else
{
$func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';
if ( is_callable($func_name) )
{
$size = mcrypt_get_block_size($this->cipher, $this->mode);
return call_user_func($func_name, $str, $size);
}
}
return $str;
}

protected function pad($str)
{
return $this->pad_or_unpad($str, '');
}

protected function unpad($str)
{
return $this->pad_or_unpad($str, 'un');
}

public function encrypt($str)
{
$str = $this->pad($str);
$td = mcrypt_module_open($this->cipher, '', $this->mode, '');

if ( empty($this->iv) )
{
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
}
else
{
$iv = $this->iv;
}

mcrypt_generic_init($td, $this->secret_key, $iv);
$cyper_text = mcrypt_generic($td, $str);
$rt=base64_encode($cyper_text);
//$rt = bin2hex($cyper_text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return $rt;
}

public function decrypt($str){
$td = mcrypt_module_open($this->cipher, '', $this->mode, '');

if ( empty($this->iv) )
{
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
}
else
{
$iv = $this->iv;
}

mcrypt_generic_init($td, $this->secret_key, $iv);
//$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));
$decrypted_text = mdecrypt_generic($td, base64_decode($str));
$rt = $decrypted_text;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

return $this->unpad($rt);
}

public static function hex2bin($hexdata) {
$bindata = '';
$length = strlen($hexdata);
for ($i=0; $i < $length; $i += 2)
{
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}

public static function pkcs5_pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}

public static function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text) - 1});
if ($pad > strlen($text)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
}

$keyStr = '8dfw091qdfdl5l2tt6wewewfdqxj';
$plainText = 'this is a string will be AES_Encrypt1';
$params = array(
"uid"=>"77a968d1-1d67-6fc0-fb48-88848f99da63",
"systemSource"=> "ami"
);
$string = json_encode($params);
$aes = new CryptAES();
$aes->set_key($keyStr);
$aes->require_pkcs5();
$encText = $aes->encrypt($string);
$decString = $aes->decrypt($encText);

echo $encText,"<br>",$string;

?>

使PHP7发挥性能需要注意哪些设置

PHPzkbhj 发表了文章 • 0 个评论 • 909 次浏览 • 2016-08-15 15:05 • 来自相关话题

让PHP7达到最高性能的几个建议:
 
1. Opcache

记得启用Zend Opcache,因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快,所以之前测试时期就发生了有人一直没有启用Opcache的事情。启用Opcache非常简单,在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"
2. 使用新的编译器

使用新一点的编译器,推荐GCC 4.8以上,因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持,这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

其实GCC 4.8以前的版本也支持,但是我们发现它支持的有Bug,所以必须是4.8以上的版本才会开启这个特性。
 
3. HugePage

我之前的文章也介绍过: 让你的PHP7更快之Hugepage ,首先在系统中开启HugePages,然后开启Opcache的huge_code_pages。

以我的CentOS 6.5为例,通过:
$sudo sysctl vm.nr_hugepages=512分配512个预留的大页内存:
$ cat /proc/meminfo | grep Huge
AnonHugePages: 106496 kB
HugePages_Total: 512
HugePages_Free: 504
HugePages_Rsvd: 27
HugePages_Surp: 0
Hugepagesize: 2048 kB然后在php.ini中加入:
opcache.huge_code_pages=1
这样一来,PHP会把自身的text段,以及内存分配中的huge都采用大内存页来保存,减少TLB miss,从而提高性能。

4. Opcache file cache

开启Opcache File Cache(实验性),通过开启这个,我们可以让Opcache把opcode缓存缓存到外部文件中,对于一些脚本,会有很明显的性能提升。
在php.ini中加入:
opcache.file_cache=/tmp
这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件,可以跨PHP生命周期存在。

5. PGO

我之前的文章: 让你的PHP7更快(GCC PGO) 也介绍过,如果你的PHP是专门为一个项目服务,比如只是为你的Wordpress,或者drupal,或者其他什么,那么你就可以尝试通过PGO,来提升PHP,专门为你的这个项目提高性能。

具体的,以wordpress 4.1为优化场景。首先在编译PHP的时候首先:
$ make prof-gen
然后用你的项目训练PHP,比如对于Wordpress:
$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null
也就是让php-cgi跑100遍wordpress的首页,从而生成一些在这个过程中的profile信息。

最后:
$ make prof-clean
$ make prof-use这个时候你编译得到的PHP7,就是为你的项目量身打造的最高性能的编译版本。 查看全部
让PHP7达到最高性能的几个建议:
 
1. Opcache

记得启用Zend Opcache,因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快,所以之前测试时期就发生了有人一直没有启用Opcache的事情。启用Opcache非常简单,在php.ini配置文件中加入:
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1"

2. 使用新的编译器

使用新一点的编译器,推荐GCC 4.8以上,因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持,这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)

其实GCC 4.8以前的版本也支持,但是我们发现它支持的有Bug,所以必须是4.8以上的版本才会开启这个特性。
 
3. HugePage

我之前的文章也介绍过: 让你的PHP7更快之Hugepage ,首先在系统中开启HugePages,然后开启Opcache的huge_code_pages。

以我的CentOS 6.5为例,通过:
$sudo sysctl vm.nr_hugepages=512
分配512个预留的大页内存:
$ cat /proc/meminfo  | grep Huge
AnonHugePages: 106496 kB
HugePages_Total: 512
HugePages_Free: 504
HugePages_Rsvd: 27
HugePages_Surp: 0
Hugepagesize: 2048 kB
然后在php.ini中加入:
opcache.huge_code_pages=1

这样一来,PHP会把自身的text段,以及内存分配中的huge都采用大内存页来保存,减少TLB miss,从而提高性能。

4. Opcache file cache

开启Opcache File Cache(实验性),通过开启这个,我们可以让Opcache把opcode缓存缓存到外部文件中,对于一些脚本,会有很明显的性能提升。
在php.ini中加入:
opcache.file_cache=/tmp

这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件,可以跨PHP生命周期存在。

5. PGO

我之前的文章: 让你的PHP7更快(GCC PGO) 也介绍过,如果你的PHP是专门为一个项目服务,比如只是为你的Wordpress,或者drupal,或者其他什么,那么你就可以尝试通过PGO,来提升PHP,专门为你的这个项目提高性能。

具体的,以wordpress 4.1为优化场景。首先在编译PHP的时候首先:
$ make prof-gen

然后用你的项目训练PHP,比如对于Wordpress:
$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null

也就是让php-cgi跑100遍wordpress的首页,从而生成一些在这个过程中的profile信息。

最后:
$ make prof-clean
$ make prof-use
这个时候你编译得到的PHP7,就是为你的项目量身打造的最高性能的编译版本。
  这里记录了关于PHP相关框架的学习笔记,如Yii2、TP等。