整理云盘的时候发现了学习的时候总结的一些php笔记,现在贴出来希望可以帮助到有需要的人。
1:Ajax寫法:
$.post('admin.php?route=information/information/getPersonalInfo&token=<?php echo $token; ?>',{_1_num:_1_num,_name:_name},function(data){
if(data==1){
alert("暂无该用户信息,请确认输入信息是否正确");
}else{
var _data = JSON.parse(data); //json串轉化成js对象
$("#text_certificate_number").html(_data.certificate_number); //输出js对象
openCon();
}
})
2:sql語句:
(一)distinct與group by:
distinct:返回唯一數據(去重,比如兩條記錄的name相同,那麽返回的數據只有一條.distinct必须放在开头)
如:select distinct name from A;(有兩個name都是lisa,但是id不同)
返回:$back=array('tony','lisa','jerry');
如:select distinct name, id from A;(有兩個name都是lisa,id也相同)
返回:$back=array('1'=>'tony','2'=>'Lisa','3'=>'jerry','3'=>'joe')
GROUP BY:
如:select 类别, sum(数量) as 数量之和 from A group by 类别
distinct和Group by 区别:
distinct只是将重复的行从结果中出去;
group by是按指定的列分组,一般这时在select中会用到聚合函数。
distinct是把不同的记录显示出来。
group by是在查询时先把纪录按照类别分出来再查询。
group by 必须在查询结果中包含一个聚集函数,而distinct不用。
例子1:假如有这么一个表:tab_1,它有两个字段:xm、gzlb、je(姓名、工资类别、金额),具体数据如下:
xm```````gzlb`````````je
-----------------------------------------
张三`````养老金`````1000
张三`````护理费`````200
张三`````其他```````50
.............
李四`````养老金`````800
李四`````其他```````50
.............
王五`````养老金`````900
王五`````其他```````35
可以看出每个人的工资都是按类别存放的,如果要返回合计的数据,如:
张三``````1250
李四``````850
王五``````935
该怎么写SQL呢?初学者往往会这么写:select xm, sum(je) from tab_1;但结果会是什么样呢?结果将是:
张三``````1250
张三``````850
张三``````935
李四``````1250
李四``````850
李四``````935
王五``````1250
王五``````850
王五``````935
这是将全部字段都进行了所有的排列组合,即:笛卡尔积!要防止这个情况的发生,我们就可以用到group by(分组)了!
select xm, sum(je) from tab_1 group by xm;
上面的SQL指定了用xm字段分组,这样一来就返回出正确的结果了:
张三``````1250
李四``````850
王五``````935
====================================================================
例子2:假设又有这么一个表:tab_2,有这些字段:bh, xm, dah,……(编号、姓名、档案号、……),
比如有这样的情况:向该表录入数据的人员非常不认真,重复录入了不少数据,如:
bh``````xm```````dah
------------------------
1```````张三`````10001
2```````李四`````10002
3```````王五`````10003
………………
84``````张三`````10001
85``````赵六`````10004
………………
126`````王五`````10003
可以看出张三、王五各重复了一次,假设这个表有几万条数据,那么要查出究竟有多少重复的,该怎么查呢?
select bh, xm, dah from tab_2 group by xm, sfzh having count(*) >= 2;
返回值为:
bh``````xm```````dah
------------------------
1```````张三`````10001
84``````张三`````10001
3```````王五`````10003
126`````王五`````10003
解释一下刚才的SQL:是从tab_2表中检索编号、姓名、档案号,怎么检索呢?是用姓名、档案号做为分组,分组的条件是记录数大于等于2的。
这个比喻很形象:having count()语句相对于group by语句,就相当于where语句相对于select语句
(二)where與having:
Where:是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数。
Having:是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作(對查詢出來的數據作爲查詢條件),在Having中可以使用聚合函数(SUM,COUNT,MAX,AVG...)
如:Store_Information数据表中销售总额超过1500美圆的商店的信息:
SELECT store_name, SUM(sales) FROM Store_Information GROUP BY store_name HAVING SUM(sales) > 1500
3: jq直接給(font)标签写样式: $("font").css('font-size','15px');
4: 前台js页面跳转:
url = 'index.php?route=information/information/getPersonalInfo&information_id=<?php echo $information_id;?>&_num='+_num;
location=url;
5://截取第一个斜杠前面的内容可以这样来:
//echo substr($str,0,strpos($str, '/'))
//截取第一个斜杠后面的内容可以这样来:
//echo substr($str,strpos($str,'/')+1);
6: php 转义html标签 反转html标签:
$a = '<strong>123</strong>'; //假设这是html代码
$b = htmlspecialchars($a); //将< >这些符号转为<等等
echo htmlspecialchars_decode($b); //这个是htmlspecialchars函数的反函数
echo html_entity_decode($a); //这个也是htmlspecialchars的反函数
7:报错或者没有效果,使用F12调试方法:
1:请求ajax没有效果:Network——》XHR——》点击文件,右侧即展示网络请求各种参数及报错,点击preview即可查看报错。
8: jq获取未来某天的日期
function tab(dayNum){
var oDate = new Date(); //获取当前时间
var dayArr = '';
var dayArr = new Date(oDate.getFullYear(),oDate.getMonth(),oDate.getDate() + 14);
return dayArr;
}
tab(7); //获取未来一周的日期
9:弹框样式大全https://craftpip.github.io/jquery-confirm/
10: bing方法给video对象绑定return false的匿名方法。
这样的效果是禁止鼠标右键的另存为功能。
$('#video1').bind('contextmenu',function() { return false; });
11://求两个时间相差月份
//$date1="2019-01-18"
//$date2="2018-12-01"
function getMonthNum( $date1, $date2, $tags='-' ){
$date1 = explode($tags,$date1);
$date2 = explode($tags,$date2);
return abs($date1[0] - $date2[0]) * 12 - $date2[1] + abs($date1[1]);
}
12:header重定向,延时2秒跳转:header("Refresh:2;url=www.baidu.com");
13:get和post方式請求接口詳細説明:
https://www.cnblogs.com/CHEUNGKAMING/p/5717429.html
14: 上传图片
$file_size=$_FILES['image']['size'];
if($file_size>5*1024*1024) {
echo "文件过大,不能上传大于5M的文件";
exit();
}
$file_type=$_FILES['image']['type'];
//判断是否上传成功(是否使用post方式上传)
if(is_uploaded_file($_FILES['image']['tmp_name'])) {
//把文件转存到你希望的目录(不要使用copy函数)
$uploaded_file=$_FILES['image']['tmp_name'];
//我们给每个用户动态的创建一个文件夹
$user_path=$_SERVER['DOCUMENT_ROOT']."/admin/view/plupload/image/".$username;
// $_POST['image'] = $username.;
//判断该用户文件夹是否已经有这个文件夹
if(!file_exists($user_path)) {
mkdir($user_path);
}
//$move_to_file=$user_path."/".$_FILES['image']['name'];
$file_true_name=$_FILES['image']['name'];
$move_to_file=$user_path."/".time().rand(1,1000).substr($file_true_name,strrpos($file_true_name,"."));
//echo "$uploaded_file $move_to_file";
$this->request->post['image'] = strstr($move_to_file, "admin/");
if(move_uploaded_file($uploaded_file,iconv("utf-8","gb2312",$move_to_file))) {
echo $_FILES['image']['name']."上传成功";
} else {
echo "上传失败";
}
} else {
echo "上传失败";
}
15:php特殊符号转化 urldecode()和urlencode()。如“=”转化“%3D”
16:html文本转化纯文本:html_entity_decode()
17:支付宝支付操作流程:https://blog.csdn.net/liangyouzi/article/details/84401936
18:js 字符串所有双引号去掉:
var list = [0,"2",0,"1",0,0,0,0,0,0,0,0];
list = list.replace(/\"/g, "");
19:js阻止a标签空链接跳转:
$('.k').click(function(e){
if(warning){
stopDefault(e);
}
})
function stopDefault( e ){
if ( e && e.preventDefault )
e.preventDefault();
else
window.event.returnValue = false;
}
20:php+html页面乱码:header("Content-type: text/html; charset=utf-8");
21:mysql字段类型为datetime的字段只查询年月日:
$sql .= " AND date_format(cv.visit_create_date,'%Y-%m-%d') <= '".$filter_user_create_end."'";
22:SELECT COUNT(*) FROM `表名` WHERE ( unix_timestamp(addtime) > 1538362994 and unix_timestamp(addtime) < 1541041394 )
23: php查询两个字符串相同的部分
function longest($str1 ='' , $str2 =''){
$start=0;
$end=2;
$len = strlen( $str1 );
// 找到两个字符串完全相同的部分,写入数组 $array
for ($i=0; $i < $len; ) {
$strPart = substr($str1, $start, $end);
if(is_int(strpos( $str2, $strPart))){
$array [] = $strPart;
$end++;
}else{
$i++;
$start = $i - 1;
$end = 2;
}
}
// 找到 $array 中最长的字符串
$longest = '';
foreach ($array as $val) {
if( strlen($val) > strlen($longest)){
$longest = $val;
}
}
return $longest;
}
echo longest("Mark Chui","Mark");
24: TP在HTML页面直接输出设置的session的值<input type="text" value="{$Think.session.code}" name="originator">
25:防止重复提交表单:
(1)控制器设置一个随机数
$code = mt_rand(0,1000000);
session('code',$code);
(2)视图用一个hidden类型的input框输出session值,表单提交,控制器判断是否存在session,若存在则提交表单,销毁session;若不存在session,则输出错误消息
<input type="hidden" value="{$Think.session.code}" name="originator">
if($_POST['originator'] == session("code")){
unset($_SESSION["code"]);
$data=array(
);
.....
}else{
echo '请不要刷新本页面或重复提交表单!';
}
26: 自动回滚到页面顶部document.body.scrollTop = document.documentElement.scrollTop = 0;
27: jq获取单选框的值 $("input[name='opennew']:checked").val()
28:jq判断单选框是否有作出选择$("input[name='ifshow']:checked").val()==null
29:jq组装checked复选框选中的值
var catId = '';
$("input[type='checkbox']:checked").each(function(i, n){
catId += $(this).val()+',';
});
30:$time=time();
$times=date('Y-01-01',$time);
$nowTime = strtotime($times); //今年年初的时间戳
$lastTimes=strtotime("+1 years",$nowTime); //明年年初的时间戳
31: 数组的值相加的函数array_sum();
32:用JS获取地址栏参数的方法(超级简单)
方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!)
function GetQueryString(name)
{
var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
var r = window.location.search.substr(1).match(reg);
if(r!=null)return unescape(r[2]); return null;
}
// 调用方法
alert(GetQueryString("参数名1"));
alert(GetQueryString("参数名2"));
alert(GetQueryString("参数名3"));
33:TP控制器返回上一页:echo "<script> alert('修改失败'); history.go(-2); </script>";
TP控制器返回并刷新上一页:echo "<script> location.href='".$_SERVER["HTTP_REFERER"]."'; </script>";
34: //点击取消某个操作
$(".FirmTotalTxt5").click(function(){
if(window.confirm('确定取消吗?')){
var _ids="{$goods_info['id']}";
var url="{:U('Pc/Goods/goods_details')}?id="+_ids;
window.location.href=url;
}else{
return false;
}
})
35: 隔几秒刷新页面
function sure(){
$('.footmark-delete').hide();
$('.clear_sucess').show();
setTimeout(function(){
location.href=location;
$('.clear_sucess').show();
},300)
}
36: 获取TP框架的方法名:ACTION_NAME
37: 用PHP写一段代码,实现不使用第3个变量,交换$a、$b的值,$a、$b的初始值自己定。
方法1:使用list函数(把数组中的值赋给一些变量)
list($a,$b) = array($b,$a);
echo $a.'-'.$b,'<br />';
方法2:
$a = $a . '-' . $b;
$a = explode('-',$a);
$b = $a[0];
$a = $a[1];
echo $a.'-'.$b,'<br />';
// 方法3:
// 当两个变量都是数字的时候
$a = $a + $b;
$b = $a-$b;
$a = $a-$b;
echo $a . '-' . $b,'<br />';
38:在PHP算法中%的使用:%指的是取余,既是取小于除数的余数
$a=87%7=3;
49: $str = cd;
$$str="longdog";
$$str.="ok";
echo $cd;
$$str=$cd="longdog";
$$str.=longdog."ok"=longdogok;
$$str=$cd=longdogok;
echo longdogok;
40: 1+2+3+....+n分别用递归算法和迭代算法计算出来:
递归(反复调用函数):
function add($n){
if($n==1){
return 1;
}else{
return $n+add($n-1);
}
}
迭代(按照某种顺序逐个访问列表中的每一项。比如,for语句):
function add($n){
$result = 0;
for($i=1;$i<$n+1;$i++){
$result += $i;
}
return $result;
}
$n=100;
add($n);
41:
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime。下面首先还是直奔主题以示例说明如何使用 mktime 获取今日、昨日、上周、本月的起始时间戳和结束时间戳,然后在介绍一下 mktime 函数作用和用法。
01 //php获取今日开始时间戳和结束时间戳
02 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
03 $endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
04 //php获取昨日起始时间戳和结束时间戳
05 $beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
06 $endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
07 //php获取上周起始时间戳和结束时间戳
08 $beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));
09 $endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));
10 //php获取本月起始时间戳和结束时间戳
11 $beginThismonth=mktime(0,0,0,date('m'),1,date('Y'));
12 $endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y'));
PHP mktime() 函数用于返回一个日期的 Unix 时间戳。
语法mktime(hour,minute,second,month,day,year,is_dst)
42: 通过ajax加载出来内容,有点击事件,写法:(每个li下面的tehui_car有点击事件,通过ajax加载出来的商品也有,teihui_ul2是ul的class)
$(".tehui_ul2").on('click','li .tehui_car',function(){
var _this = $(this);
})
43: TP框架vendor和library的区别:
http://www.php.cn/php-weizijiaocheng-381642.html
1. 手动加载第三方类库
如果要加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用命名空间或者命名空间和路径不一致的类库,或者你就是想手动加载类库文件,我们都可以通过手动导入的方式加载。
我们可以使用import方法导入任何类库,用法如:
// 导入Org类库包 Library/Org/Util/Date.class.php类库
import("Org.Util.Date");
// 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库
import("Home.Util.UserUtil");
// 导入当前模块下面的类库
import("@.Util.Array");
// 导入Vendor类库包 Library/Vendor/Zend/Server.class.php
import('Vendor.Zend.Server');
对于import方法,系统会自动识别导入类库文件的位置,ThinkPHP可以自动识别的类库包包括Think、Org、Com、Behavior和Vendor包,以及Library目录下面的子目录,如果你在Library目录下面创建了一个Test子目录,并且创建了一个UserTest.class.php类库,那么可以这样导入:
import('Test.UserTest');
注意,如果你的类库没有使用命名空间定义的话,实例化的时候需要加上根命名空间,例如:
public funcion index(){
import('Test.UserTest');
$test = new \UserTest();
}
2. 手动加载第三方普通.php后缀的原生文件
如果你的第三方类库都放在Vendor目录下面,并且都以.php为类文件后缀,也没用采用命名空间的话,那么可以使用系统内置的Vendor函数简化导入。 例如,我们把 Zend \ Filter\Dir.php 放到 Vendor 目录下面,这个时候 Dir 文件的路径就是 Vendor\Zend\Filter\Dir.php,我们使用vendor 方法导入只需要使用:
public function index(){
Vendor('Zend.Filter.Dir');
$obj = new \Dir();
}
另外:如果你的文件是a.b.php(b不是class)的话,也可以这样导入:Vendor('目录.a#b');
实例化对象时候,以class ab {...}示例:new \ab();
3. 手动加载.php后缀且面向过程的文件 (面向过程就是文件里面没有class aaa{},不用实例化操作,直接使用)
我们可以使用原生的语法:
在控制器的方法里面使用:include_once ‘./ThinkPHP/Library/Vendor/lib/aaa.bbb.php’
44:关于public、protected、private
public:公有,可以在任何地方访问
protected:自身及子类可以访问
private:自身可以访问
45:static 静态变量,可以用self::加方法名或者变量名常量名,不能用于访问类自身的属性;
常量不能被赋值修改;
子类调用父类的属性或者方法用parent::加方法名或者变量名常量名,访问类常量时不用在常量名称前面加$符号
static关键字用于访问类自身定义的静态成员,访问静态属性时需要在属性名前面添加$符号
46:const 常量,定义的常量必须是大写英文字母
47:interface 定义一个接口,接口里面的方法不可以实现,接口之间的继承用extends
48:接口和类之间的实现用implements
49:类实现了接口,那么类必须实现接口里面定义的方法
50:abstract定义一个抽象类,抽象类里面定义的方法可以实现也可以不实现
51:子类继承父类,如果父类有构造方法子类没有,那么自动执行父类的构造方法;如果父类没有构造方法子类有,那么自动执行子类构造方法;如果父类子类都有构造方面,那么自动执行子类构造方法,如果需要执行父类构造方法需要使用parent::constract();
52:parent关键字可以访问父类被重写的成员