ThinkPHP开发学习笔记

ThinkPHP开发学习笔记

一、环境安装与设置

 

开发运行环境

开发环境:wamp2.5   Notepad++

运行环境:CentOS 7.2x64  lnmp1.3一键安装包          (lamp一键安装包)

MySQL 5.5  PHP 5.5  nginx 1.1

WinSCP     putty(F-Secure SSH)   Navicat for MySQL  Notepad++

       环境升级--->>LNMP 1.2/1.3升级Nginx、MySQL/MariaDB、PHP教程

      centos 手动增加swap分区  解决内存过小mysql进程被杀  

      centos 手动增加swap分区2

Centos7开机自动启动lnmp

1./root  目录   新建脚本文件myservice.sh,添加内容:lnmp start

2.   脚本文件myservice.sh加执行权限:chmod +x /root/myservice.sh

3. /etc/rc.d/rc.local文件加执行权限:

         chmod +x /etc/rc.d/rc.local

4./etc/rc.d/rc.local文件,添加内容:

touch /var/lock/subsys/local

/root/myservice.sh

 

安装LNMP

wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.sh lnmp

安装zip

apt-get install zip 或yum install zip

文件压缩解压

unzip abc.zip

zip -r abc123.zip abc 123.txt  把当前目录的abc文件夹和123.txt压缩成为abc123.zip

Linux查看文件夹大小

du -sh 查看当前文件夹大小

du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序

du -sk filename 查看指定文件大小

改变文件夹宿主

chown -R www:www  rczp

改变文件夹权限

chmod -R 755 rczp

文件夹移动改名

mv XXX CCC

删除文件夹

rm -rf  XXX

LNMP相关配置文件

Nginx主配置文件:/usr/local/nginx/conf/nginx.conf

Nginx虚拟主机配置文件:/usr/local/nginx/conf/vhost/域名.conf

MySQL配置文件:/etc/my.cnf

PHP配置文件:/usr/local/php/etc/php.ini   可能需要解除禁用scandir()

php-fpm配置文件:/usr/local/php/etc/php-fpm.conf

PureFtpd配置文件:/usr/local/pureftpd/pure-ftpd.conf

PureFtpd MySQL配置文件:/usr/local/pureftpd/pureftpd-mysql.conf

状态管理

LNMP 1.2+状态管理: lnmp {start|stop|reload|restart|kill|status}
LNMP 1.2+各个程序状态管理: lnmp {nginx|mysql|mariadb|php-fpm|pureftpd} {start|stop|reload|restart|kill|status}
LNMP 1.1状态管理: /root/lnmp {start|stop|reload|restart|kill|status}

Nginx状态管理:/etc/init.d/nginx {start|stop|reload|restart}

PHP-FPM状态管理:/etc/init.d/php-fpm {start|stop|quit|restart|reload|logrotate}

PureFTPd状态管理: /etc/init.d/pureftpd {start|stop|restart|kill|status}

MySQL状态管理:/etc/init.d/mysql {start|stop|restart|reload|force-reload|status}

Apache状态管理:/etc/init.d/httpd {start|stop|restart|graceful|graceful-stop|configtest|status}

Memcached状态管理:/etc/init.d/memcached {start|stop|restart}

PHP-FPM状态管理:/etc/init.d/php-fpm {start|stop|quit|restart|reload|logrotate}
PureFTPd状态管理: /etc/init.d/pureftpd {start|stop|restart|kill|status}
ProFTPd状态管理: /etc/init.d/proftpd {start|stop|restart|reload}
Redis状态管理: /etc/init.d/redis {start|stop|restart|kill}

多PHP版本状态管理:/etc/init.d/php-fpm5.5 {start|stop|quit|restart|reload|logrotate} 前面5.5为对应的PHP版本,其他版本自行替换。

如重启LNMP,1.2+输入命令:lnmp restart 即可;单独重启mysql:/etc/init.d/mysql restart 也可以 lnmp mysql restart ,两个是一样的。

相关图形界面程序

phpinfo : http://IP/phpinfo.php

phpMyAdmin : http://IP/phpmyadmin/

PHP探针 : http://IP/p.php

PureFTP管理界面:http://IP/ftp/

Memcached测试页面:http://IP/memcached.phpLNMP

相关目录

Nginx目录: /usr/local/nginx/

MySQL目录: /usr/local/mysql/

PHP目录: /usr/local/php/

网站目录: /home/wwwroot/default/

Nginx日志目录:/home/wwwlogs/

nginx伪静态设置

nginx.conf 添加

location /rczp/

{

if (!-e $request_filename){

rewrite  ^/rczp/(.*)$  /rczp/index.php?s=$1  last;

}

}

 

tp5项目传到lnmp只有首页可以访问,其他都是404

##pathinfo设置##
LNMP上各个版本pathinfo各个版本的设置基本一样:
lnmp v1.1上,修改对应虚拟主机的配置文件
去掉#include pathinfo.conf前面的#,把try_files $uri =404; 前面加上# 注释掉。
1.2,1.3上,修改对应虚拟主机的配置文件
include enable-php.conf;替换为include enable-php-pathinfo.conf;
修改pathinfo需要重启nginx生效。
照着这个配置下lnmp 药到病除

 

二、php

日期时间处理

$data['motion_sn'] = date("Ymd",time()) . rand(1000,9999);

$time=date('Y',time())+1;  年份加一

$time=$time.'0101';

$time=strtotime($time);

$name=date('Y-m-d')

$checkdata['chktime']=date('Y-m-d H:i:s',time());

$nowdate=date("y-m-d",strtotime("-1 day"));

$time=date('Y',time());

字符串

strstr($othercp2,$othercp)>=0 //php函数  查找子串strstr("母串","子串")

$coorgs=substr($coorgs,0,strlen($coorgs)-3);}取字串函数

$motion['coor']=$coorgs;

$year=substr($batchid,0,4);

$idno=substr($batchid,-2);      取子串

str_replace("-","",date("Y-m-d",$t));

$rt=str_replace("<br>",chr(10),$rt)  字符串替换

 

<?php echo substr($v.xxwjpg,strpos($v.xxwjpg,"/")+1-strlen($v.xxwjpg));?> 前台页面显示从数据表取出的文件名

常用文件函数

file_exists($filesName)                          测试文件是否存在

file_get_contents($filepath);               把文件内容全部读出

str_replace(".txt","",$file);           替换指定字符

$fil = fopen($filesName, "a+")            以追加方式打开文件

fwrite($fil, $tempstr); fclose($fil);      写入文件         关闭文件

$tempcj=strstr($cjrow,":",true);   取子串

$readid=substr($readid,-6);         取子串

array_filter($allname);             去除多维数组中的空值

字符串打散为数组

用于生成前台显示的协办单位中文字串

$coorstr = explode("/",$motion['coorganizer']);

foreach($coorstr as $strid)

$coorgs=$coorgs. M("company")->where("id='$strid'")->getField("companyname")." / ";

使用explode分割字串为数组时,应该使用双引号单双引号在写入文件时完全不同。

foreach

foreach (array_expression as $value)foreach (array_expression as $key => $value)foreach 仅能够应用于数组和对象第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key

 

三、MySQL

统计各年份入职人数

        select left(oa_oa,4) as year,count(*) as num from oa group by left(oa_oa,4)

NOT NULL字段默认值

LNMP、LAMP环境下运行,如果字段定义为NOT NULL 但未指定默认值会出错,WAMP能运行,最好设置字段默认值,避免出问题

正式运行时数据表应设置索引字段,加快检索速度

locate(substr,str) 子串检索函数,如果包含,返回>0的数,否则返回0

left(motion_sn,4) 取左子串函数

字串连接

UPDATE motion SET motion_sn=concat("2015",right(motion_sn,4)) where id<1041 //在`motion_sn`字串前面接上'2015'

字符补齐

UPDATE motion SET motion_sn=concat("2016",lpad(motion_sn,4,'0')) where id>1040//向左补齐(参数,长度,在前补齐参数字母

子查询统计

UPDATE `jobinfo` SET `passnum`=(select count(*) from checktest where status=2 and checktest.jobcode=jobinfo.jobcode)

sum(case status when status=0 then 1 else 0 end) as status0,

sum(case when status=1 then 1 else 0 end) as status1,

sum(case when status=2 then 1 else 0 end) as status2,

sum(case when status=3 then 1 else 0 end) as status3,

sum(case when status=4 then 1 else 0 end) as status4

子查询统计各类人员数量

SELECT sum(case staffstatus when 0 then 1 else 0 end) as nobao, sum(case staffstatus when -1 then 1 else 0 end) as nopass,sum(case staffstatus when 2 then 1 else 0 end) as pass FROM `staff` WHERE 1

distinct去重

(wechat)

select distinct f_hr_emp_no as id,f_cls_c as emp_name from t_bd_class where f_bd_dept_code='$departid'"

设置空值null为0

UPDATE `staff` SET `staffstatus`=ifnull(`staffstatus`,0)

数据库检索中文排序

$company = M("company")->order("convert(name using gbk)")->select();

特定数据排在最前面

SELECT * FROM user ORDER BY user_id NOT IN(7,8,9),score DESC

root 密码遗忘处理

# /etc/init.d/mysql stop

# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &

# mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD(’newpassword’) where USER=’root’;

mysql> FLUSH PRIVILEGES;

mysql> quit

# /etc/init.d/mysql restart

# mysql -uroot -p

Enter password: <输入新设的密码newpassword>

mysql>

Navicat 连接阿里云ECS   mysql

四、ThinkPHP   JS   html

TP配置文件设置

'URL_MODEL'             =>  2,// URL访问模式,可选参数0、1、2、3,代表以下四种模式:

// 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE  模式); 3 (兼容模式)  默认为PATHINFO 模式

TP3.2.3项目在TP5,nginx环境中只能在兼容模式运行,不支持REWRITE模式,默认首页为/index.php/home/index/index.html

多个项目共存同一环境session隔离

配置文件Application/Common/Conf/config.php设置了SESSION_PREFIX参数

'SESSION_PREFIX'   =>'rczp',

程序中使用session(‘userid’)方式访问,切记使用$_ SESSION [‘userid’]方式。

生成的session数据格式由原来的 $_SESSION['name'] 变成 $_SESSION['rczp']['name']

上传文件设置

由于thinkPHP自身的BUG,已经实例化上传类后,再修改上传根目录无效,必须用配置文件传递参数的方法来实例化上传类.

(1)

$config = array(

'maxSize' => 2048000,

'exts' => array('jpg', 'jpeg', 'gif', 'png','rar','doc','xls','docx','xlsx'),

'saveName' => array('uniqid',''),

'replace' => true,

'autoSub' => false,

'savePath' => '/'.$userid."/",

);

$upload=new \Think\Upload($config);

$info=$upload->upload();

(2)

$upload=new \Think\Upload();

$upload->maxSize = 2048000;

//$upload->rootPath  = './Uploads/'; // 设置附件上传根目录

$upload->savePath  ='/'.$userid."/"; // 设置附件上传(子)目录

$upload->autoSub = false;//true;

$upload->saveName='';

$upload->uploadReplace = true;

$info=$upload->upload();

页面内容提交【check()审核结果】后返回之前的分页界面

解决提交后不能返回到该分页的问题:前台传输查询条件值,后台获取查询条件值后处理,在返回分页界面时带回前台。点击返回“按钮”时通过JS代码回到之前的分页页面。

 

<input type="hidden" name="oldpg" id="oldpg"  value="{$pg}">

<input type="hidden" name="status" id="status"  value="{$status}">

<input type="hidden" name="depart" id="depart"  value="{$depart}">

 

$("#back").click(function(){

var opg= document.getElementById("oldpg").value;

var status= document.getElementById("status").value;

var depart= document.getElementById("depart").value;

var url="{:U('Motion/showstaff')}?search_status="+status+"&search_depart="+depart+"&p="+opg;

window.location.href=url;

})

 

改进措施:考虑通过ajax方式提交数据到后台,不刷新整个页面,就可以通过windows.history.back(-1)的方式返回到之前的分页页面。

下拉列表onchange=”submint()”,当选取值后自动提交后台

<form class="am-form" name="yyy" id="yyy" action="#" method="get">

<select name='year' onChange="submit();">

<option value='all' selected>信息公开年度</option>

<volist name="yearno" id="yno">

<option value="{$ yno.yearno}" <if condition="$ yno.yearno eq $yearno ">selected </if>>{$ yno.yearno}</option>

</volist>

</select>

</form>

 

<script>

function submit(){

document.yyy.submit;

}

</script>

KindEditor在线编辑器

头部引入

<head>

<script charset="utf-8" src="__PUBLIC__/kindeditor-4.1.10/kindeditor.js"></script>

</head>

 

<script>

//在线编辑器,保留文本格式

KindEditor.ready(function(K) {

window.editor = K.create('#result')

 

});

</script>

KindEditor可替换Html中textarea,把文字格式存到数据库中,在前台页面显示时需使用函数html_entity_decode。

$motion['mycontent']=html_entity_decode($motion['mycontent']);

格式化结案内容(使用KindEditor必须步骤)

htmlspecialchars_decode() 函数把预定义的 HTML 实体转换为字符

foreach ($messagelist as $k => $v){                            $messagelist[$k]['content']=html_entity_decode($messagelist[$k]['content']);//yyh20160716

无条件页面跳转

<head>

<meta http-equiv="refresh" content="0;url=Home/index/motionlist.html">

</head>

高亮菜单js

<script type="text/javascript" src="http://www.haodoxi.com/dede58/js/jquery.min.js"></script>

<style>

.nav { margin:0; padding:0; list-style-type:none;}

.nav li { float:left; background:#FFD1A4; margin-right:1px; color:#fff; }

.nav li a { display:block; width:120px; height:45px; line-height:45px; text-align:center; color:#fff; font-size:16px; text-decoration:none;}

.curument{ background:#D96C00; font-weight:bold;}

</style>

 

<ul class="nav" id="nav">

<li><a href="index.html">首页</a></li>

<li><a href="1.html">栏目一</a></li>

<li><a href="2.html">栏目二</a></li>

<li><a href="3.html">栏目三</a></li>

<li><a href="4.html">栏目四</a></li>

</ul>

 

<script type="text/javascript">

var urlstr = location.href;

var urlstatus=false;

$("#nav a").each(function () {

if ((urlstr + '/').indexOf($(this).attr('href')) > -1&&$(this).attr('href')!='') {

$(this).addClass('curument'); urlstatus = true;

} else {

$(this).removeClass('curument');

}

});

if (!urlstatus) {$("#nav a").eq(0).addClass('curument'); }

</script>

点击按钮(链接)弹出确认框

onclick="if(confirm('确定要发布招聘批次吗?')==false) return false;"

ajax用法

yian

<script>

$("form").submit(function(){

var statu = confirm("提交之后将不能修改,是否提交");

if(!statu){

return false;

}

})

$("#draft").click(function(){

KindEditor.sync('#mycontent');

var data = $("form").serialize();

data.mycontent = $('#content').val(); //jQuery

 

$.post("{:U('Information/ajaxadd')}",data,function(res){

if(res.status==1){

alert('草稿保存成功');

}else{

alert('草稿保存失败');

}

 

},'json').error(function(){alert('草稿保存失败。');});

});

</script>

 

public function ajaxadd(){

$data = I('post.');

$userid= session('userid');

$add['content'] = serialize($data);

$add['userid'] = session('userid');

$add['addtime'] =time();

$add['status'] = '0';

M("infodraft")->where("userid=".$userid)->delete();

if(M("infodraft")->add($add)){

$this->ajaxReturn(array('status'=>1));

}else{

$this->ajaxReturn(array('status'=>0));

}

}

Wechat

 

<script>

$(function(){

$('#stubut').on('click', function(e){

var departid = document.getElementById('depart').value;

var teacherid = document.getElementById('teacher').value;

var stuno = document.getElementById('stuno').value;

var stuname = document.getElementById('stuname').value;

var idcard = document.getElementById('idcard').value;

if(departid=='' ||teacherid=='' ||stuno=='' ||stuname=='' ||idcard=='')

{alert("输入的数据不能为空!");

return false;}

$.ajax({                                                   url:"http://ossc.cqcet.edu.cn/wechat/index.php/app/userBind/Bind/stubind/mid/2",

type:"get",

data:{"departid":departid,"teacherid":teacherid,"stuno":stuno,"stuname":stuname,"idcard":idcard},

success:function(data){

var list = data['data'];

var str="";

var errcode=list['errcode'];

str = str+list['departid']+list['teacherid']+list['stuno']+list['stuname']+list['idcard'];

if(errcode=='OK')

{  alert("数据绑定成功!"+str); //设置提交按钮不可操作

$("#stubut").attr("class","weui-btn_disabled");

}

else  alert("输入的数据有错,请检查!");

},

error:function(){

//$("#dialog").dialog("close");

alert("出错了哦");

}

})

})

})

 

</script>

 

function ajaxPost(){

var departid = document.getElementById('depart').value;

$.ajax({

type:"get",

url:'{:addonUrl('Bind/ajaxtea')}',

data:{"departid":departid},

success:function(data){

var list = data['data'];

var str="";

for(a in list )

{//动态添加下拉列表项

str = str+"<option value='"+list[a]["id"]+"'>"+list[a]["emp_name"]+"</option>";                                                        }

$("#teacher").html(str);

}

}); //end ajax

}

 

(1)

$openid=session('openid');

$binddata = array('userid'=>$stuno,'userstatus'=>3,'usertype'=>1);

$we_conf='mysql://wechat:ABcd1234@10.150.11.211:53306/wechat#utf8';

Db::connect($we_conf)->table('mp_friends')->where('openid',$openid)->setField($binddata);

$data = array(

'errcode' => 'OK',

'departid' => $departid,

'teacherid' => $teacherid,

'stuno' => $stuno,

'stuname' => $stuname,

'idcard' => $idcard

);

 

$dd['data']=$data;

ajaxReturn($dd);

///-----------------------------------------------------------------

 

 

 

(2)

public function ajaxtea(){

$departid=input('departid');

if(!empty($departid))

{

$bd_conf='mysql://wechat:ABcd1234@10.150.11.211:53306/bd#utf8';

$teacher=Db::connect($bd_conf)->query("select distinct f_hr_emp_no as id,f_cls_c as emp_name from t_bd_class where f_bd_dept_code='$departid'");

$data['data']=$teacher;

ajaxReturn($data);

}

限制上传文件数量

rczp

 

<form class="am-form am-form-horizontal" name="myfiles" action="" method="post" enctype="multipart/form-data">

<td bgcolor="#ffffff" class="font1" width="80%">

[您还可以上传{$filesnum}个附件,附件格式为jpg,gif,zip,rar,doc,png]

<br>

<switch name="filesnum">

<case value="10" break="0"><input type="file" name="attachfile9" size="45"><br></case>

<case value="9" break="0"><input type="file" name="attachfile8" size="45"><br></case>

<case value="8" break="0"><input type="file" name="attachfile7" size="45"><br></case>

<case value="7" break="0"><input type="file" name="attachfile6" size="45"><br></case>

<case value="6" break="0"><input type="file" name="attachfile5" size="45"><br></case>

<case value="5" break="0"><input type="file" name="attachfile4" size="45"><br></case>

<case value="4" break="0"><input type="file" name="attachfile3" size="45"><br></case>

<case value="3" break="0"><input type="file" name="attachfile2" size="45"><br></case>

<case value="2" break="0"><input type="file" name="attachfile1" size="45"><br></case>

<case value="1" break="0"><input type="file" name="attachfile0" size="45"><br></case>

</switch>

</td>

</form>

动态设置获取checkbox的值

rczp

 

<label>

<if condition="$reg eq 1">

<input name="reg" id="reg"type="checkbox" value="1" checked="checked">

<else />

<input name="reg" id="reg"type="checkbox" value="0">

</if>&nbsp;&nbsp;&nbsp;允许应聘者注册

</label>

<input type="hidden" id="hidereg" name="hidereg" value="{$reg}"/>

 

<script>

$("#reg").click(function(){

var reg = document.getElementById("reg");

var hidereg = document.getElementById("hidereg");

if(reg.checked==true) {hidereg.value=1;;}

else hidereg.value=0;

})

</script>

增加ThinkPHP分页类文件

(yian rczp)修改样式ThinkPHP\Library\Think\ Pyyh.class.php 可以跳转到指定页码,不用一页一页翻;

修改ThinkPHP函数文件

解决在局域网代理nginx模式下面部分机器无法获取准确IP

rczp)修改ThinkPHP\Common\funcitons.php->get_client_ip()

五、amaze ui

<body>

行包含两列,第一列占 4 份,第二列占 8 份,我们只设置了 .am-u-sm-n 这个 class,意味着无论视口多大,都保持这个比例的划分

<div class="am-g">

<div class="am-u-sm-4">4</div>

<div class="am-u-sm-8">8</div>

</div>

 

 

sm 区间两列是等分的,md 区间为 1:2 划分,lg 区间为 1:3

<div class="am-g doc-am-g">

<div class="am-u-sm-6 am-u-md-4 am-u-lg-3">sm-6 md-4 lg-3</div>

<div class="am-u-sm-6 am-u-md-8 am-u-lg-9">sm-6 md-8 lg-9</div>

</div>

 

</body>

 

 

阅读更多
下一篇Nextcloud搭建过程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭