window服务器下定时执行php页面,以实现信息的抓取;bat执行(php)接口文件。作者:徐老师,徐多蔚,xuduowei

 

@echo off
rem 关闭回显
start “C:\Program Files\Internet Explorer\iexplore.exe” “这里写上你接口url1”
start “C:\Program Files\Internet Explorer\iexplore.exe” “这里写上你接口url2”

rem 使用浏览器打开url地址,5秒后自动关闭ie
ping 127.0.0.1 -n 5 >nul
taskkill /im iexplore.exe /f

 

针对window系统,如何定时执行这个bat文件,以定时执行接口文件呢?

以win7服务器为例:

1、开始–控制面板–管理工具–计划任务

2、在“任务计划程序库”上右键–创建基本任务

3、具体操作步骤

提示:若是需要重启启动电脑,如下:

程序脚本:C:\Windows\System32\shutdown.exe

参数:-r -f -t 0

https://jingyan.baidu.com/article/e6c8503c55529be54f1a18d1.html


关注公众号,了解更多it技术(it问答网

tp3.2.3-php文章管理系统-融合权限分配,可精确到按钮;开发作者:徐多蔚,xuduowei,徐老师

后台进入:

http://www.xuduowei.com/tc/php2/index.php/Admin

用户的模块管理,增,删,改,查,分页,搜索分页,权限分配。

本项目仅仅只有后端部分,部门核心功能:
登录,验证码,分页,搜索分页,权限分配,可精确到按钮思路!

 

 


关注公众号,了解更多it技术(it问答网

similar_text()计算相似度、basename得到文件名【不要扩展名】,项目中有时候需要得到文件名和数据库中的字段进行匹配,整理:徐老师,徐多蔚,xuduowei

项目中有时候需要得到文件名和数据库中的字段进行匹配。我们就可以按若下2个函数作为核心函数进行业务逻辑处理。

similar_text() 函数计算两个字符串的匹配字符的数目。

该函数也可以计算两个字符串的相似度(以百分比计)。

代码如下:

similar_text(‘你好啊,早上好’, ‘你好啊’, $percent);
echo $percent;
die;

//得到文件名【不要扩展名】
$f=”aaaa.gif”;
$ext_arr=explode(“.”,$f);
$extString=$ext_arr[count($ext_arr)-1];
echo basename($f, “.”.$extString);

作者:徐多蔚【徐老师】 xuduowei.com


关注公众号,了解更多it技术(it问答网

计算两个字符串的相似度mysql 自定义函数:Levenshtein_mysql

1、功能描述:

mysql 自定义函数。用来计算字符A转换成字符串B所花费的代价,数值越小,代价越低。(换句话来说,就计算两个字符串的相似度,值越小相似度越高)。

该实现采用了编辑距离算法,详见:http://baike.baidu.com/link?url=EhmqDIoInSurOWI8VfR5bdmwxuYjPGKgqET2oNyv9–zDREhTUe5sYdxWLxS4v3tdK1PJVOFaOy9c6uHoElBSK

2、使用方法:

使用源代码的话,从第1步开始。如果是直接使用二进制发布包的话,直接从第4步开始即可。

1)下载本代码

2)安装mysql开发包。

mysql主分支文件名类型:libmysqlclient15-dev mariaDB分支文件类似:MariaDB-10.0.21-centos7-x86_64-devel

3)编译源代码:

g++ -shared -fPIC -I /usr/include/mysql -o lev_distance.so lev_distance.cpp

4)将so文件复制到mysql插件目录

cp lev_distance.so /usr/lib64/mysql/plugin

5)创建mysql自义函数。

CREATE FUNCTION levenshtein RETURNS INTEGER SONAME ‘lev_distance.so’;

6)完成。

7)测试:

SELECT levenshtein(‘abc’,’dbca’)

项目主页:http://www.open-open.com/lib/view/home/1440302113917

文章来源:http://www.genshuixue.com/i-cxy/p/11592035

 


关注公众号,了解更多it技术(it问答网

tp3快速上手笔记-徐多蔚

文件夹及文件【控制器,模型】命名才用驼峰法[首字母大写]
URL:
url访问方式:
index.php?m=home&c=index&a=abc
m:模块;  默认模块是home
c:控制器;默认控制器是index
a:方法。 默认方法是index
tp采用的是单入口文件!
tp3.2.3版本中支持以下4种格式。其中有2种是最最重要。
URL模式 URL_MODEL设置
普通模式 0
PATHINFO模式 1 [标准] =============重要。
REWRITE模式 2
兼容模式 3
配置文件中:’URL_MODEL’=>1, //0:普通模式;1:pathinfo模式【默认的】
I(‘post.’)     //所有的值
I(‘post.name’)
 
 
 
 
I(‘get.’) //所有的值
I(‘get.name’)
get方式传值:
index.php?m=home&c=news&a=newslist&abc=1&cde=2
index.php/home/news/newslist/?abc=1&cde=2
index.php/home/news/newslist/abc/1/cde/2
get方式取值:
方法一:
$_GET[‘abc’];
方法二:
I(‘get.’);数组类型
I(‘get.变量名’); 得到的就是具体的变量值
视图的渲染:
$this->display(‘/视图文件名’);//注意没有扩展名
格式:$this->display(‘/视图文件名’); //找View视图文件夹下的 视图文件名
============================================
格式:$this->display(‘视图文件名’); //默认找View视图文件夹下,和控制器同名的文件夹中的视图文件名
如何定义模板变量且赋值?
{$xdw}
针对数组的定义和引用!
控制器文件code:
$arr=array(‘a’=>2,’b’=>3,’c’=>4);
$this->assign(“xdw”,$arr);
视图文件code:
{$xdw.b} 或者  {$xdw[‘b’]}  //比smarty更智能。
tp3.2.3视图中,如何循环数组?
<foreach name=”xdw” item=”vo” key=”k” >
{$k}|{$vo} <br/>
</foreach>
提示:xdw 就是定义的模板变量名,vo就是循环值,k就是索引下标值或键名。
===========================================
在视图文件中,如何调用系统函数和自定义函数?
调用系统函数:
1、系统函数;
格式如:{$list.abc|substr=1,1}
或 {$list.abc|substr=###,1,1}
提示:若###省略,则把对应的变量值做为第一个参数值传递。
2、自定义函数
a、在哪里定义
   函数可以放到
ThinkPHP\Common\functions.php
ThinkPHP\ThinkPHP.php
b、如何引用 借鉴 系统函数引用方法。
==========================================
数据库如何操作?
tp3.2.3中配置文件有2种类型;1、全局配置文件;2、模块配置文件。
1、全局配置文件:
App\Common\Conf\config.php   有效于全部模块
2、模块配置文件:
App\Home\Conf\config.php     仅有效于当前模块
增、删、改、查
 
$obj=M();//若用query方法执行一个完整的sql,则这里可以M()。
$arr=$obj->query(“select * from obj_liuyan_cs”);
print_r($arr);
查:
增加:
$obj=M(“表名”);
$obj->add($arr);//返回值是增加后的主索引值,如:id值。
修改::==============================================
return $obj->where($where)->save($arr);//返回的值是实际更新的记录数。
删除::==============================================
return $users->where($where)->delete();//返回值是删除的真实记录数。
查询:
$obj=M(‘表名’);
$obj->query($sql); //$sql为完全自定义的sql。
$users=M(“ceshi”);
$arr=$users->where(“id=2”)->find();//结果是1维数组;只能是一条。
$arr=$users->where(“id=2”)->select();//结果是2维数组;
多表查询格式,也可以套用到单表中。
$rs=$obj->table(‘users u’)
->field(‘u.id,u.username’)
->order(‘id desc’)
->where()
->limit(1,1)
->select();
===============================
左右连接,子查询:
$obj=M();
$rs=$obj->table(‘users u’)
->field(‘u.sfzid,c.cardnum,(select pay from pays where cardid=c.id) as pay’)
->join(‘left JOIN cards as c ON c.uid=u.id’)
->select();
==================2018/1/10
php开发中,有3类元素是不可以重名的。
1、常量;
2、方法【函数】;
3、类。
命名空间:1、全局空间;2、子空间
命名空间就是帮助我们解决重名问题!
在php中如何声明命名空间呢?
我们可以用namespace来定义命名空间。
注意:namespace前方不可以有输出,否则报错!
page.php code:
function abc(){
echo ‘2’;
}
=========================
include(“page.php”);
function abc(){
echo ‘1’;
}
结果报错,提示重复定义abc();
我们可以在开头定义命名空间,如下:
namespace a;
include(“page.php”);
function abc(){
  echo ‘1’;
}
这就不会报错了,原因是,page.php被include包含进来,page.php中的内容在全局空间中。
namespace a;
include(“page.php”);
function abc(){
  echo ‘1’;
}
abc();//结果是1,默认执行的是当前命名空间里的方法。
如果要执行全局空间的,怎么办?
\abc();//结果是2
访问当前命名空间元素有2种方式:
方式一:直接引用,如abc();
方式二:完整路径引用,如\a\abc();
我们可以声明命名空间的时候,进行多级创建。
如 namespace a\a1;
完整的引用路径:\a\a1\abc();
注意:namespace 一定要放在页面开头,前方不可以有任何的输出!
命名空间中常量特殊!
需要用const 定义。
=====================================
导入类到命名空间中的顺序:
include(“page.php”);
use xdw3;
================================
一个页面中可以定义多个命名空间的!!
namespace xdw\xdw1{
}
namespace xdw\xdw2{
}
提示::一个页面中若定义了多个命名空间,则{}之外不可以有任何代码的执行。
tp3.2.3框架中如何创建模型及如何使用?
创建模型的方法:
页面命名:UsersModel.class.php
内容如下:
namespace 模块名\Model;
use Think\Model;
class UsersModel extends Model {
    public function index(){
 echo 1234;
    }
}
模型在控制器中的引用:
方法一:
$obj=new \模块名\Model\UsersModel(…)
$obj->index();
$obj=new \模块名\Model\UsersModel
$obj->index();
方法二:
先导入,后直接实例化:
use \Admin\Model\UsersModel;
$obj=new UsersModel();
$obj->index();
提示:模型的命名即表名,配置的默认库中要有这个表才可以。否则会报错的。因为模型存在的意义就是对表的操作。表都没有,创建模型有啥意义呢?
模型中主要是进行值的返回!输出动作在控制器里操作!
切记:模型不可以直接被访问,只能通过控制器间接的访问操作。
V
C
M
项目构架!
项目中一般分前端模块[Home]和后端模块[Admin]
__PUBLIC__
表单提交的动作页面,不推荐使用:
?m=admin&c=index&a=checklogin
也不推荐使用
/admin/index/checklogin
{:U(‘admin/index/checklogin’)}
admin:模块名;
index:控制器名;
checklogin:方法名。
I(“post.”);
tp中内置的页面跳转方法:
$this->success(‘success’, U(‘index/succ_page’),$time);
$this->error(‘error’, U(‘index/index’),$time);
提示:$time的单位是秒。
$time可省略,若省略,则调用默认时间。
默认success时间是 1s;error时间是3s。
9:21 2018/1/11
U方法可以传递参数:
 
{:U(‘index/page?filename=pass&t=2’)}
取值:
方法一【内置自动取值,函数参数名和U传递过来的变量名一致】:
function page($filename,$t){
   echo $filename;
}
方法二【手动通过I(‘get.’)取值】
function page(){
   echo I(“get.filename”);
}
tp3.2.3中用户信息的跟踪【会话机制】
session在tp3.2.3中默认已经开启了,所以不需要再次开启
可直接使用
$_SESSION[‘session名’]=值;
tp3.2.3中,内置了session处理。
定义:
session(‘name’,’value’);  //设置session
取值:
$value = session(‘name’);
删除单个:
session(‘name’,null); // 删除name
删除所有:
session(null); // 清空当前的session
MODULE_NAME 当前模块名
CONTROLLER_NAME 当前控制器名
ACTION_NAME     当前方法名
========================================
tp3.2.3中使用框架验证码。
使用方法,打开手册,搜索验证码。
1、
复制
$Verify = new \Think\Verify();
$Verify->entry();
到我们自定义的控制器方法中。
如下:
//生成验证码
function CreateYzm(){
$Verify = new \Think\Verify();
$Verify->entry();
}
2、
使用
打开对应的视图文件,如login.html
{:U(‘index/CreateYzm’);}把这个作为src的属性值。
3、
判断正误
使用内置方法进行判断。
// 检测输入的验证码是否正确,$code为用户输入的验证码字符串
function check_verify($code, $id = ”){
$verify = new \Think\Verify();
return $verify->check($code, $id);
}
在对应的控制器中使用此方法判断正确true与失败false
$this->check_verify(‘表单传值’);
实现登录页面刷新验证码技术:::
document.getElementById(‘imgyzm’).src=”yzm.php?”+new Date().getTime();
onclick=”this.src=this.src+’?'”
我们如何使用自己定义类的验证码呢?
1、自定义类为切入点。【怎么定义自定义类】
www\tp1214\ThinkPHP\Library\Think
创建一个文件,格式 类名.class.php
类文件内容格式:
namespace Think;
class Yzm{
function CreateImg(){
echo 666;
}
}
验证码有2种解决方案。
1、tp内置验证码技术
2、diy验证码技术。
2、如何使用自定义类。
提示:若我们在登录页面对应的控制器中设置了防跳墙方法。则对应的方法如:【index,验证码方法,判断登录方法】要进行过滤。
9:03 2018/1/12
提示:tp项目开发中,建议:每一个功能块都对应一个控制器。
修改密码流程:
1、/*判断2次输入的新密码一致*/
2、//新密码和老密码不能一样
2.1 判断时间
3、/*要先判断老密码输入正确后,才能进行新密码的修改。*/
扩展:我们需要实现一个功能,如:1天内最多只允许修改3次
密码。
select unix_timestamp();得到当前的时间戳的。
select count(id) as cc from obj_users_log where uid=1 and type=2 and unix_timestamp(updatetime)>(unix_timestamp()-3600*24)
========================================
tp3.2.3中分页类的使用。
$obj=M(‘users’);
$num=3;
$count=$obj->count();
$Page= new \Think\Page($count,$num);
分页样式的修改:
$arr=$obj->order(‘id desc’)->limit(“$Page->firstRow,$Page->listRows”)->select();
$Page->setConfig(‘prev’,’上一页’);
//一定要放到$Page->show();之上才有效!
$Page->setConfig(‘next’,’下一页’);
$show= $Page->show();// 分页显示输出
$this->assign(‘show’,$show);
$this->assign(‘arrlist’,$arr);
$this->display(“/list”);
搜索分页:
注意事项:
$arra[‘keywords’]=$keywords;
//$Page->parameter=$arra;  //$Page->parameter,放到show之上
 $Page->parameter = array_map(‘urlencode’,$arra); //若不这样,搜索的时候若有’将报错的。
$show= $Page->show();// 分页显示输出
完整sql:
select count(a.id) from obj_users_group_role a,obj_users_role b where a.groupid=2 and b.mokuai=’Admin’ and b.kongzhiqi=’Users’ and b.fangfa=’index’ and a.roleid=b.id
echo “模块名是:”.MODULE_NAME.”控制器是:”.CONTROLLER_NAME.”方法是:”.ACTION_NAME;
select a.*,b.groupid from obj_users_role a left join  obj_users_group_role b on a.id=b.roleid
魔术方法:
function _empty(){
echo ‘errordddddddddd’;
}
EmptyController.class.php  空控制器执行文件。
 tp3.2.3视图中条件的判断:
<if condition=”$v.groupname eq ” “>无分组<else />{$v.groupname}</if>
<if condition=”($name eq 1) OR ($name gt 100) “>
value1
<elseif condition=”$name eq 2″/>value2<else /> value3
</if>
在condition属性中可以支持eq等判断表达式,同上面的比较标签,但是不支持带有”>”、”<”等符号的用法,因为会混淆模板解析,所以下面的用法是错误的:
<if condition=”$id < 5 “>value1
    <else /> value2
</if>
必须改成:
<if condition=”$id lt 5 “>value1
<else /> value2
</if>
tp3.2.3中借助大 U方法传递参数:如:id
<?php echo U(‘users/del/?id=’.$v[‘id’]);?>
或者 <?php echo U(‘users/del?id=’.$v[‘id’]);?> 多个参数用&分割
<a class=”button border-red” href=”<?php echo U(‘users/del/?id=’.$v[‘id’]);?>” ><span class=”icon-trash-o”></span> 删除</a>
tp3.2.3中的缓存:
支持的缓存类型众多,常见常用的文件缓存设置方式:
1、页面静态缓存;
全局配置中
'HTML_CACHE_ON'     =>    true, // 开启静态缓存
'HTML_CACHE_TIME'   =>    60,   // 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX'  =>    '.html', // 设置静态缓存文件后缀
	'HTML_CACHE_RULES'  =>     array(  // 定义静态缓存规则
	 // 定义整个Users控制器 生成的路径App/html/Users/  html会自动生成
	'Users:'      =>       'Users/{:action}_{id}',
)

参考:https://www.cnblogs.com/chinalorin/p/5855254.html

2、局部数据缓存

会按照缓存初始化时候的参数进行缓存数据,也可以在缓存设置的时候改变参数,例如:

// 缓存数据300秒
S(‘name’,$value,300);
甚至改变之前的缓存方式或者更多的参数:

// 采用文件方式缓存数据300秒
S(‘name’,$value,array(‘type’=>’file’,’expire’=>300));
如果你在缓存设置的时候采用上面的数组方式传入参数的话,会影响到后面的缓存存取。

缓存读取
// 读取缓存
$value = S(‘name’);
缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。 如果缓存标识不存在或者已经过期,则返回false,否则返回缓存值。

缓存删除
// 删除缓存
S(‘name’,null);
删除缓存标识为name的缓存数据。

实战项目部分案例:
方案一:
if(S('Users_index')){
			$arr=S('Users_index');
		}else{
			$arr=$obj->table(C("DB_PREFIX")."users as a")
				->field("a.*,b.groupname")
				->where($tj)
				->join('left JOIN '.C("DB_PREFIX").'users_group as b ON b.id=a.gid')
				->limit($Page->firstRow.','.$Page->listRows)
				->select();
			S('Users_index',$arr,array('type'=>'file','expire'=>10));
		}


或者直接按如下写法:
方案二:推荐使用,效果和方案一一样的,但是写法更简单。
$arr=$obj->table(C("DB_PREFIX")."users as a")
				->field("a.*,b.groupname")
				->where($tj)
				->join('left JOIN '.C("DB_PREFIX").'users_group as b ON b.id=a.gid')
				->limit($Page->firstRow.','.$Page->listRows)
				->cache('Users_index',10)
				->select();

 

提示:生成的文件缓存存储在:App\Runtime\Temp 目录中。

 提示:若同时开启了页面静态缓存和局部数据缓存,则以页面缓存优先!

关注公众号,了解更多it技术(it问答网

php原生态php文章管理系统-适合初学者学习;功能开发作者:徐多蔚,xuduowei,徐老师

前端效果:http://www.xuduowei.com/tc/php1

后台登录:http://www.xuduowei.com/tc/php1/admin888

后台功能模块预览:

登录成功后,首先看到的是开发信息和基本设置。

基本设置中有个网站设置及网站设置-增加变量,这个主要是更方便参数的修改和扩展,比如网站的名称,网站的关键字,网站的描述,网站的联系人电话,地址,qq,email,网站备案号等。

基本设置中有个缩略图管理,这个主要是管理文章记录缩略图多余的情况,比如修改文章缩略图了,或者删除文章记录了,有可能其对应的缩略图文件还在。这个时候,我们就需要对多余的缩略图进行删除操作。

 

栏目管理:主要是cms内容列表查看,增加,修改,删除,以及分类的管理【实现无限极分类】。如下图:

用户管理:查看用户,添加用户,如下图:

单页管理:重点是单页业务处理,如:关于我们,服务流程,公司简介。如下图:

 

权限思路分析:

分析权限设置的核心:
需要对分组id进行权限的分配而不是指定的用户!!
我们需要给用户表增加一个新字段,字段名:groupid tinyint型
我们事先声明号:
1为超级管理员【拥有所有的,全部的操作权限】;
2为信息发布员,只希望让他有增加文章的操作。其他权限不给!
要模拟设置好2个用户【??? 为超级管理员】;
【???为信息发布员】
我们考虑在登录验证登录后写入$_SESSION[‘groupid’]=$rs[‘groupid’];
我们考虑在哪个页面实现所谓的权限判断?safecheck.php
非数据库方式进行“权限”的验证,首先要想到的就是用数组来定义!!!!!!!
我们要考虑到分组可能有很多个?这个时候若要用数组的方式定义对应的权限,我们首先考虑到的应该是2维数组。
2维数组中,要方便根据我们的分组ID快速找到对应的权限。
$arr=array(
“2”=>array(
“权限1″,”权限2”
)
)

关注公众号,了解更多it技术(it问答网

ci快速上手手册-徐多蔚xuduowei整理【原创】

徐多蔚
官方:
https://codeigniter.com/
中国:
http://codeigniter.org.cn/
ci:
url路径1:
index.php/welcome/abc/?id=6
welcome: 控制器名;[默认:welcome]
abc: 方法名;  [默认:index]
id:表示的是传递给控制器的参数,如 ID 或其它各种变量。
index.php/welcome/abc/?id=6
get接值:$this->input->get(); //得到的get传过来的值,格式是数组。
若是post方式:接收值格式:
$this->input->post();
url路径2:
example.com/index.php?c=controller&m=function
index.php?c=welcome&m=abc
注意:ci中方法参数默认是m,若需要修改,也可以更改的。
application/config/config.php 文件中进行设置,只需将将 enable_query_strings 更改为 TRUE 即可。
$config[‘function_trigger’] = ‘m’;//修改方法参数
==================================================
提示:我们可以在对应的application\controllers下方创建文件夹比如:
index
admin
来模拟tp中的“模块”
,ci中如何访问呢?
pathinfo模式:
index.php/文件夹名/控制器名/方法名
CI中url要么用普通模式,要么用pathinfo模式[推荐使用此模式]【仅同时支持一种!】。
视图的渲染:
$this->load->view(‘welcome_message’);
view下:
welcome_message.php [默认后缀是.php]
================================================
ci框架视图赋值变量
$this->load->vars(“xdw”,array(‘a’=>’1’,’b’=>2,’c’=>3));
$this->load->view(‘abc/hi’);
code1:
控制器:
$this->load->vars(“xdw”,array(‘a’=>’1’,’b’=>2,’c’=>3));
$this->load->view(‘abc/hi’);
视图引用:
<?php
 print_r($xdw);
?>
code2:
控制器:
$this->load->view(‘abc/hi’,array(‘xdw’=>array(‘a’=>’1’,’b’=>2,’c’=>3)));
视图引用:
<?php
 print_r($xdw);
?>
视图中如何使用自定义函数,以有利于功能扩展?
1、system\helpers 目录下创建一个common_helper.php 文件
2、控制器中需要载入对应的文件。
$this->load->helper(‘common’);//注意是common不是common_helper【系统自动可以识别】
3、视图中就可以直接引用自定义函数了。
提示:如何设置自动载入?
application\config\autoload.php
搜索helper
$autoload[‘helper’] = array(‘common’);
CI 中视图引入JS、CSS文件的方式===========
echo base_url(); //得到项目的目录。
切记必须先载入helper url文件。
$autoload[‘helper’] = array(‘common’,”url”);
//url 的2种载入方式:
1、$this->load->helper(‘url’);//手动
2、如何设置自动载入?
application\config\autoload.php
搜索helper
$autoload[‘helper’] = array(‘url’);
表单提交路径=============
$this->load->helper(‘url’);//不能少,也可以在autoload.php中配置好。
用site_url(‘控制器/方法名’);//文件夹名/控制器名/方法名
===========================
数据库的增、删、改、查
1、确保配置项正常。
application\config\database.php
2、
$this->load->database();
$rst=$this->db->query(“select * from obj_users”);
$rs=$rst->result_array();//写法上有多种
foreach($rs as $k){
echo $k[‘username’].”<br/>”;
}
提示:$rst->result_array();//把抽象的结果集转换成数组 echo $k[‘username’];
      $rs=$rst->result();   //把抽象结果转换成对象     echo $k->username
配置交换表前缀
$db[‘default’][‘dbprefix’] = ‘obj_’;
$db[‘default’][‘swap_pre’] = ‘my_’;
那么我们在写sql语句时就用my_这个表前缀,ci会自动把my_换位obj_,所以,dbprefix可以随便修改,方便我们修改数据库名。
如:$sql = “SELECT * FROM my_users”;
$rst=$this->db->query($sql);
$rst=$this->db->get(表名);
$this->db->where(“id=1”);
$rst=$this->db->select(“username”)->get(“users”);
删除:
$this->load->database();
$num=$this->db->where(“id=14”)->delete(‘users’); //返回的是布尔值true/false;
修改:
$this->load->database();
$num=$this->db->where(“id=13”)->update(‘users’,array(“username”=>’xdw’));
var_dump($num);//布尔值
增加:
$this->load->database();
$num=$this->db->insert(‘users’,array(“username”=>’xdw666′));
var_dump($num);//布尔值
模型如何载入?
手动:
$this->load->model(“m_welcome”);//m_welcome大小写均可,推荐首字母大写。和模型命名一致。
控制器中载入模型的核心源码:
$this->load->model(“M_welcome”);//手动下载入指定模型不可省略。
$m=new M_welcome();
$rs=$m->abc();
var_dump($rs);
若我们需要载入指定目录中的模型,demo:
$this->load->model(“模型文件夹名称/M_welcome”);
对应的模型的命名建议和控制器名区别开,一般建议在前方加前缀M_
模型文件的写法:
class M_index  extends CI_Model{ //注意:extends CI_Model不能省,否则报错!
自动:
自动载入,在config/autoload.php中配置
$autoload[‘model’] = array(‘m_welcome’);
提示:m_welcome 或者M_welcome均可,推荐首字母大写,这样和模型的命名保持一致。
我们可以在autoload.php中设置自动载入数据库类,这样我们对数据库操作的时候,就可以省略:
$this->load->database();
配置项如下:
$autoload[‘libraries’] = array(‘database’);
///session的使用;
使用前都要导入session类,导入方法。
导入session方式一:全局法:
config/autoload.php中 $autoload[‘libraries’] = array(“session”);
导入session方式二:页面导入:
function __construct(){
parent::__construct();//不可省略
$this->load->library(‘session’);
}
使用格式一:
设置:
$_SESSION[session名]=值
取的:
$_SESSION[session名]
使用格式二:
设置:
$this->session->name=值;
取的:
$this->session->name;
CI框架获取控制器名和方法名
$directory=$this->router->fetch_directory();//目录名
$class = $this->router->fetch_class();//获取控制器名
$method = $this->router->fetch_method();//获取方法名
==================================

提示:ci中若要模拟tp中公共类的继承。

参考格式如下:
@include_once(APPPATH . ‘controllers/admin/Common.php’);
class Welcome extends Common {

其中Common.php代码如下:
class Common extends CI_Controller {

解说:
ci对CI_Controller做了自动包含,但是对其他的没有做自动包含。需要手动include包含类文件。

================================
了解下YII框架。
https://www.yiiframework.com/
https://www.yiichina.com/

关注公众号,了解更多it技术(it问答网

tp3.2.3搜索分页

$obj=M(‘users’);
$tj=””;
//$condition[‘uid’] = array(‘like’,’%’.$keyword.’%’);
if(I(“get.”)){
$keyword=I(“get.keyword”);
//$tj=” username like ‘%”.$keywords.”%'”;
$s[‘username’] = array(‘like’,’%’.$keyword.’%’);
      /* $condition[‘usertype’] = array(‘neq’,2);
        $condition[‘uid’] = array(‘like’,’%’.$keyword.’%’);
        $condition[‘status’] = $status;
        $condition[‘sex’] = $sex;*/
}
$num=3;//设置一页分多少条
$count=$obj->where($s)->count();//计算总记录数
$Page= new \Think\Page($count,$num);// 实例化分页类 传入总记录数和每页显示的记录数(25)
$arr=$obj->order(‘id desc’)->where($s)->limit(“$Page->firstRow,$Page->listRows”)->select();
//print_r($arr);
print_r( $Page->parameter);
$Page->setConfig(‘prev’,’上一页’);//一定要放到$Page->show();之上才有效!
$Page->setConfig(‘next’,’下一页’);
$map[‘keyword’] = $keyword;
$Page->parameter = array_map(‘urlencode’,$map);  //将parameter变成字符串形式,导致无法翻页。所以选择第二种。
//array_map是将函数作用到数组的每个元素上。
$show= $Page->show();// 分页显示输出
//echo $show;
$this->assign(‘show’,$show);
$this->assign(‘arrlist’,$arr);
$this->display(“/list”);

关注公众号,了解更多it技术(it问答网

用PHP代码给GIF动画图片加水印,保持原有的动画效果

在程序开发时,上传图片加水印是常见的功能。

但是常规加水印的方法对GIF动画图片就会产生问题,加上水印后,GIF 图片就不动了。

那么有没有办法给GIF动画图片加上水印后,保持原有的动画效果呢(效果图在最后)?

下面就给大家详细的说说:

一、首先分别下载3个开源的php类库

imageworkshop

composer 地址:https://packagist.org/packages/sybio/image-workshop

GifFrameExtractor

composer 地址:https://packagist.org/packages/sybio/gif-frame-extractor

gifcreator

composer 地址:https://packagist.org/packages/sybio/gif-creator

二、准备好gif图片

三、主要代码

1.你的GIF地址

$gifPath = ‘123.gif’;

2.获取gif宽和高(后面有用)

$imginfo=getimagesize($gifPath);

3.判断图片是否是GIF动画图

if (GifFrameExtractor::isAnimatedGif($gifPath))

4.将GIF图片释放成一帧一帧的图

$gfe = new GifFrameExtractor();

$frames = $gfe->extract($gifPath,true);

5.初始化水印

$watermarkLayer = ImageWorkshop::initTextLayer(‘代码庸医’, ‘simkai.ttf’, 15);

我这里是直接用字作为水印,也可以用图片作为水印,方法如下:

$watermarkLayer = ImageWorkshop::initFromPath(‘你的水印图片地址’);

6.给每一个图片帧加上水印

foreach ($frames as $frame)

{

$frameLayer = ImageWorkshop::initFromResourceVar($frame[‘image’]);

$frameLayer->resizeInPixel($imginfo[0], $imginfo[1], true); // 设置图片高度宽度

$frameLayer->addLayerOnTop($watermarkLayer, 20, 20, ‘LB’); // 水印位置

$retouchedFrames[] = $frameLayer->getResult();

}

7.合并每一帧生成加上水印的GIF图片

$gc = new GifCreator();

$gc->create($retouchedFrames, $gfe->getFrameDurations(), 0);

file_put_contents(‘pic/newgif.gif’, $gc->getGif());


关注公众号,了解更多it技术(it问答网

phpStudy下Apache环境安装SSL证书实现https链接

phpstudy的Apache环境下如何安装SSL证书?网上很多教程,然并卵。本文真实可靠实际操作,为大家教学phpstudy下A环境安装SSL证书的正确方法。不用花钱请大神,希望大家分享该知识为https普及做贡献。

工具/原料

  • 申请并下载好ssl证书(PEM格式)
  • phpstudy集成环境下正常运行的网站
  • 避免意外请先备份(复制)好httpd.conf配置文件。

方法/步骤

  1. 首先,开启apache的编译ssl模块,如图打开phpstudy—其它选项设置—PHP扩张及设置—php扩展—php-openssl前面打勾

  2. 如图点击打开修改httpd.conf配置文件,打开找到#LoadModule ssl_module modules/mod_ssl.so,去掉前面的注释符#(保证前面没有#号),使得ssl模块生效。

    增加一条引用语句   Include conf/vhosts_ssl.conf

  3. 依次打开phpstudy安装文件,打开Apache打开conf文件,在conf文件夹中创建一个名为vhosts_ssl.conf的配置文件。编辑vhostsssl.conf文件,增加如下内容:

    Listen 443

    SSLStrictSNIVHostCheck off

    SSLCipherSuite AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL

    SSLProtocol all -SSLv2 -SSLv3

    <VirtualHost *:443>

    DocumentRoot “D:\phpStudy\WWW\bbs”(网站根目录路径)

    ServerName www.yuming.com(更换成自己的域名)

    ServerAlias yuming.com(更换成自己的域名)

    <Directory “D:\phpStudy\WWW\bbs”>(网站根目录路径)

    Options FollowSymLinks ExecCGI

    AllowOverride All

    Order allow,deny

    Allow from all

    Require all granted

    </Directory>

    SSLEngine on

    SSLCertificateFile “D:\phpStudy\Apache\conf\ssl\XXX.cer”(证书路径)

    SSLCertificateKeyFile “D:\phpStudy\Apache\conf\ssl\XXX.key”(证书路径)

    </VirtualHost>

  4. 将下载好的证书放入ssl目录路径D:\phpStudy\Apache\conf\ssl\如图,注意文件格式,.cer和.key只需要这两个证书文件。你可以右键属性查看文件类型确认文件格式正确不。

  5. 防火墙端口入站规则哪里关闭443,绿勾变成灰色就关闭了,关闭后现在重启phpstudy,正常重启后,在浏览器里面输入https://的域名就能看到安全锁出来啦。

    地址栏未能显示绿色锁标是因为网站有http非加密资源,如图片,css,js等,需要全部调整为https开通协议资源才能挂锁成绿色。

    END

注意事项

  • 如果启用了cdn加速或网站卫士需要到cdn将其设置成http是协议,否则有可能乱码或不挂绿锁
  • 有不清楚不明白有疑问的可以联系我尽力帮助。

来源:https://jingyan.baidu.com/article/49ad8bceb4dc735835d8fa6a.html


关注公众号,了解更多it技术(it问答网