查漏补缺,持续更新ing...

php中的继承和实现:

一个接口 可以继承 另外的接口。要注意只有接口和接口之间使用继承关键字extends。

一个接口继承其他接口时候,直接继承父接口的静态常量属性和抽象方法。

类实现接口必须实现其抽象方法,使用实现关键字implements。

PHP中的类是单继承,但是接口很特殊。一个接口可以继承自多个接口。

抽象类实现接口,可以不实现其中的抽象方法,而将抽象方法的实现交付给具体能被实例化的类去处理。

2019年5月12日

 

base64处理图片

# base64编码串
        $image = file_get_contents('php://input');
        if (strstr($image,",")){
            $image = explode(',', $image);
            $image = $image[1];
        }
        # 判断目录是否存在 不存在就创建
        $path = "../uploads/".date("Ymd");
        if (!is_dir($path)){
            mkdir($path, 0777, true);
        }
        $image_src = md5(uniqid().time()).'.jpg';  //图片名字
        $result = file_put_contents( $path . "/" . $image_src, base64_decode($image));//返回的是字节数

2019年5月5日

mysql 慢日志:

slow_query_log=1 #是否启用慢查询日志,1为启用,0为禁用 
slow_query_log_file=slow.log #指定慢查询日志文件的路径和名字,可使用绝对路径指定;默认值是'主机名_slow.log',位于datadir目录 
long_query_time=2 #SQL语句运行时间阈值,执行时间大于参数值的语句才会被记录下来 
min_examined_row_limit=100 #SQL语句检测的记录数少于设定值的语句不会被记录到慢查询日志,即使这个语句执行时间超过了long_query_time的阈值 
log_queries_not_using_indexes=1 #将没有使用索引的语句记录到慢查询日志 
log_throttle_queries_not_using_indexes=10 #设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间 
log-slow-admin-statements=1 #记录执行缓慢的管理SQL,如alter table,analyze table, check table, create index, drop index, optimize table, repair table等。 
log_slow_slave_statements=0 #记录从库上执行的慢查询语句 
log_timestamps=system #5.7版本新增时间戳所属时区参数,默认记录UTC时区的时间戳到慢查询日志,应修改为记录系统时区 
log_output=FILE,TABLE #指定慢查询日志的输出方式,从5.5版本开始可以记录到日志文件(FILE,慢查询日志)和数据库表(TABLE,mysql.slow_log)中

2018年12月17日

 

linux 查找大文件  :

进入根目录,深度为1搜索大文件夹:

du -h --max-depth=1

然后查看哪些文件夹大,再进去 重复执行上面的命令,多半是项目日志文件。

2018年12月2日

 

GIT 更改文件权限导致文件版本进一,禁止检查权限更改:

git config core.filemode false

mysql5.7 group by语句报错:修改my.cnf

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2018年11月13日

 

linux更改ssh端口:

vim /etc/ssh/sshd_config

Port 改成想要的端口

保存后退出

service sshd restart

2018年11月12日

 

手算ln:
以ln(987654321)为例。
1、987654321=9.87654321*10^8,令a=9.87654321,b=8
2、对a取整得9
3、ln(a)=ln9=2ln3≈2×1.1
4、ln(987654321)≈ln(a)+b×ln10≈2.2+8×2.3=20.6
实际上ln(987654321)≈20.7108,之间的偏差只有
(20.7108-20.6)/20.7108×100%≈0.535195%

2018年10月31日

 

算法的时间复杂度 o(1):

时间复杂度是一个函数,它定量描述了该算法的运行时间。常见的时间复杂度有以下几种。
1,log(2)n,n,n log(2)n ,n的平方,n的三次方...,2的n次方,n!
即:o(1),o(log(2)n),o(n),o(nlog2n),o(n^2),o(n^3),o(2^n),o(n!)


1指的是常数。即,无论算法的输入n是多大,都不会影响到算法的运行时间。这种是最优的算法。而n!(阶乘)是非常差的算法。当n变大时,算法所需的时间是不可接受的。

用通俗的话来描述,我们假设n=1所需的时间为1秒。那么当n = 10,000时。
O(1)的算法需要1秒执行完毕。
O(n)的算法需要10,000秒 ≈ 2.7小时 执行完毕。
O(n2)的算法需要100,000,000秒 ≈ 3.17年 执行完毕。
O(n!)的算法需要XXXXXXXX(系统的计算器已经算不出来了)。
可见算法的时间复杂度影响有多大。

所以O(1)和O(n)差了2.7小时,区别显而易见。

 

2018年9月28日

 

mysql 字符集

2018年6月28日

 

PHP正则校验中文 总是记不住,干脆就不记了微笑

$str = '测试';
$name_check = preg_match('/^[\x{4e00}-\x{9fa5}]{1,4}$/u', $str);

2018年6月26日

 

 

还有一个replace into

但是这个 插入数据的表必须有主键或者是唯一索引,不然 replace into 会直接插入数据,就会出现大量重复的数据。

2018年5月24日11:25:32

 

mysql 根据主键 有就更新没有就插入 用到

 ON DUPLICATE KEY UPDATE  match_id = values(match_id) , match_zhu = values(match_zhu) , match_ke = values(match_ke) , match_state = values(match_state)

2018年5月23日17:09:45
 

图片上传:

if (!empty($_FILES["receiptimg"]['name'])) {
	//文件上传路径
	$file_path = './uploads/image/'.date('Ymd',time()).'/';
	//允许类型--可以加其他的文件的类型
	$type_arr =[
	  'image/png',
	  'image/jpeg',
	  'image/pjpeg',
	  'image/jpg'
	];
	//允许上传图片大小
	$max_size = ini_get('upload_max_filesize');
	$allow_size = substr($max_size,0,strlen($max_size)-1)*1024*1024;
	//后缀名
	$suffix = substr($_FILES['receiptimg']['name'],strpos($_FILES['receiptimg']['name'],'.'));

	//文件名
	$save_name = $file_path.time().uniqid().$suffix;

	if (is_uploaded_file($_FILES['receiptimg']['tmp_name'])) {
	  if (!in_array($_FILES['receiptimg']['type'], $type_arr)) {
	  	echo 'typeerror';exit;
	  }

	  if ($_FILES['receiptimg']['size'] > $allow_size) {
	  	echo 'sizeerror';exit;
	  }
	  if(!file_exists($file_path)) {  
	    mkdir($file_path,0775,true);
	  } 

	  if (move_uploaded_file($_FILES['receiptimg']['tmp_name'], $save_name)) {
	  	echo 'success';
	  }else{
	    echo "fail";
	  }
	}else{
	  echo 'forbidden';
	}

}

 

2018-4-26

 

 

今天公司项目新版本上线,旧项目是外包做的,服务器是外包配置的,所有的一切都是外包配置的,今天项目遇到了一个巨坑。

form 表单通过ajax序列化传值到后台,一共传了1087个键值对,php.ini 里的配置都是默认的,导致始终确实几个重要的值,最后才改到 max_input_vars   默认1000  改成2000即可。我对着nginx,php-fpm一顿看,两个多小时才发现是php.ini的参数设置,真是蠢哭了

 

2018-4-13 22:11

 

 

 

本地blog数据库赋予限并且新建管理员pendant:

grant all privileges on blog.* to 'pendant'@'localhost' identified by '123123' with grant option;

允许任意ip使用管理员pendant连接数据库,此时pendant等同于root

grant all privileges on *.* to 'pendant'@'%' identified by 'passwd' with grant option;

给超管所有sql权限:

grant all privileges on *.* to root@"%" identified by "passwd";

命令行导入数据表sql:

1.进入数据库安装目录下的bin文件夹然后把要导入的test.sql文件放进去 ;

2.cmd命令行进入同样的文件夹输入:mysql -u root -p --default-character-set=utf8 数据库名<test.sql

命令行导出数据库sql:

1.进入cmd 进入mysql安装的bin文件夹 ;

2.mysqldump  -u root -p 数据库名>导出文件名.sql

 

 

 

无限分类实现的三种方法:

 

<?php 

$data=[
	['id'=>1,'name'=>'江苏',"pid"=>0],
	['id'=>2,'name'=>'山东',"pid"=>0],
	['id'=>3,'name'=>'徐州',"pid"=>1],
	['id'=>4,'name'=>'沛县',"pid"=>3],
	['id'=>5,'name'=>'滕州',"pid"=>2],
	['id'=>6,'name'=>'曲阜',"pid"=>2],
	['id'=>7,'name'=>'丰县',"pid"=>3],
	['id'=>8,'name'=>'汉城公园',"pid"=>4],
];

//横向分类->树状
function make_tree($list){  
    $tree=array();   
    $packData=array();  
    //转换为带有主键id的数组  
    foreach ($list as  $data) {
        $packData[$data['id']] = $data; 
        //$packData[1]=['id'=>1,'name'=>'江苏',"pid"=>0]; $packData[2]=['id'=>2,'name'=>'山东',"pid"=>0],
    }  
    foreach ($packData as $key =>$val){       
        if($val['pid']==0){   //代表跟节点         
            $tree[]=& $packData[$key];  
        }else{  
            //找到其父类  
            $packData[$val['pid']]["son"][]=& $packData[$key];  
        }  
    }  
    return $tree;  
}  

var_dump("<pre>",make_tree($data));


//竖着分类->菜单列表
function vtree($data,$pid,$lv=0){
	static $res=[];
	foreach ($data as $k => $v) {
		if ($v['pid']==$pid) {
			$res[$k]=$v;
			$res[$k]['level']=$lv+1;
			vtree($data,$v['id'],$lv+1);
		}
	}
	return $res;
}
var_dump("<pre>",vtree($data,0,0));


//横向分类->树状
function htree($data,$pid,$lv=0){
    $res=[];
	foreach($data as $k => $v){
	           if($v['pid']==$pid){
	               $res[$k]=$v;
	               $res[$k]['level']=$lv+1;
	               $res[$k]['sub']=hTree($data,$v['id'],$lv+1);
	           }
	       }
    return $res;
}
var_dump("<pre>",htree($data,0,0));

2018-3-7

 

linux crontab 开启定时任务:

第一次 使用crontab -e 然后输入相应命令即可。

 

2018-2-27

 

 

1.$this :动态调用,指当前对象

通过一个例子,说明一下我当时的心理历程:

/**
* 父类
*/
class A 
{
	
	function show()
	{
		echo $this->msg();
	}

	function msg(){
		return "";
	}

}

 

这是父类,里面有两个方法, 我看到了show调用了msg,msg里面不是没有东西吗?这有什么意思? 是不是**啊?  (→_→)

然后再写了他的一个子类:

/**
* A的子类之一
*/
class B extends A
{
	
	function msg()
	{
		return "this is child";
	}
}

$b_obj=new B;
echo $b_obj->show();

 

 

 根据查看的项目里A类的子类,我发现在A的子类里都会重写A类的msg()方法,最终调用的还是子类自己的方法。 产生这个问题的原因就是 我没理解  $this 的 真正意义。

通过上面的输出,在页面上可以看到结果:这是子类的输出。

在A类的show方法里 var_dump($this);  结果是: object(B)#1 (0) { }    也就是说 实例化B 调用show方法,根据继承关系 会找到A类里的show 方法,

$this是动态调用,$this指当前对象,这个时候的当前对象不一定就是A类的实例化对象啊,这时候的$this 是B类的实例化对象。

然后$this->msg();就等于是B类的实例化对象调用自己的msg方法。

如果A类里show 方法这样写 echo A::msg();   那么就是写死的调用,就是调用A类自己的方法。

 

弄明白了这个,真的觉得自己是菜的难受啊......  \(-_-||)/

 

2017-7-10   在菜的道路上,控制不住记几,越走越远......

 

1. 论$i++  和 ++$i 的区别

后++   最后对自己运算

前++   首先对自己运算       

这个很好记,先来后到,在前就先,在后最后。

1.1

<?php
$i=1;
$y=$i++ ;
echo $y;	// res: 1
echo $i;	//res: 2

 上面运算可分为 $y=$i   和 $i=$i+1

$i++ 最后 是对 $i 自己进行运算

<?php
$i=1;
$y=$i++ + 3;
echo $y;	// res: 4
echo $i;	//res:2

 上面运算分为 $y=1+3, $i=$i+1

因为 后++ 是最后对自己进行运算,所以先忽略,最后在对自己运算。

也就是 $i初始是1 所以就是1+3 赋值给 $y,运算结束了,到最后了,$i 对自己运算 $i=$i+1;

 

<?php
$i=1;
$y=$i++ + ++$i;
echo $y;	// res: 4
echo $i;	//res:3

上面运算可分为 $i=$i+1, $y=$i+$i, $i=$i+1

也就是 $y=2+2 ,$i=1+1+1

运算里出现了 ++$i,先来后到,在前就先,  所以 不管别的,$i=$i+1=2

这个时候经过 ++$i这一步运算,$i已经是2了,然后$y=$i++  +  ++$i  = 2++ + 2 =4   然后 $i++ = $i +1=2+1 =3

主要还是优先级的问题,看懂了记住就好,先来后到,在前就先,在后最后。

 

2017-7-12

 

1.file_put_contents()

这两天没事,看了看爬虫,就试着写了一个简单的爬虫,用到了 file_put_contents()这个函数。

关于这个函数,参数解释如下:

file_put_contents(file,data,mode,context)

file 必需。规定要写入数据的文件。如果文件不存在,则创建一个新文件。
data 可选。规定要写入文件的数据。可以是字符串、数组(一维数组)或数据流。
mode 可选。规定如何打开/写入文件。可能的值:
  • FILE_USE_INCLUDE_PATH   //检查*filename*的副本路径 ,介个我不懂什么意思
  • FILE_APPEND          //如果设置,则在文件内容末尾追加内容,否则清空文件,重新写入
  • LOCK_EX         //锁定文件

该函数访问文件时,遵循以下规则:

  1. 如果设置了 FILE_USE_INCLUDE_PATH,那么将检查 *filename* 副本的内置路径
  2. 如果文件不存在,将创建一个文件
  3. 打开文件
  4. 如果设置了 LOCK_EX,那么将锁定文件
  5. 如果设置了 FILE_APPEND,那么将移至文件末尾。否则,将会清除文件的内容
  6. 向文件中写入数据
  7. 关闭文件并对所有文件解锁

如果成功,该函数将返回写入文件中的字符数。如果失败,则返回 False。

 

该函数file_put_contents()插入数据的时候默认是不换行的,如果想要换行,可以用到php的 PHP_EOL 它可自动识别系统并显示成相应的换行符。

如:file_put_contents($fileName,$b.PHP_EOL.PHP_EOL,FILE_APPEND|LOCK_EX);  //这个就是向$filename这个文件里插入$b,并且换两行。

 

1.php 有强制类型转换,在比较 字符串和数字的时候,字符串会被强制转换成数字,然后在进行比较

例如

<?php 
if(0=="a"){
echo "eq";
}else{
echo "neq";
}

 

 

 

 

1.冒泡排序:

<?php
#冒泡排序法
$arr = array(12,45,89,3,24,55,223,76,22,11,89,2,4,5,28,112,20,434,23,65,65,765,6,8,23,5,33,553,45,423,64,77,84,23);
$tmp;
for($i=0;$i<count($arr)-1;$i++ ){      
    for($j=0;$j<count($arr)-1-$i;$j++){
        if($arr[$j] > $arr[$j+1]){
            $tmp = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $tmp;
        }
    }
}
print_r($arr);

 

这是一维数组,一维数组其实不用冒泡排序,有php数组函数就可以排序。

如果是二维数组的话只要在红色的地方再加上相应的键就好了,现在是从大到小排序。

真坑哦,标了红色也不显示,此处手动强行加红色

<红色>

    if($arr[$j]["这里"] > $arr[$j+1]["这里"]){

    $tmp = $arr[$j]["这里"];

    $arr[$j]["这里"] = $arr[$j+1]["这里"];

    $arr[$j+1]["这里"] = $tmp;

   } 

</红色>

 

2.微信:

调用微信地理位置接口,如果用户不允许获取位置信息,则会调用cancel:function(){} 方法,这里面我用到了ajax异步请求刷新页面,传参的时候定义了一个空的经度和纬度值,结果在微信上运行就报错 语法错误 非法的标识符(identifier),

去掉了空值,运行正常,因此注意在调用微信接口传参的时候不要用空值。

 

3.js

$('#id').each(function(){

alert($(this).text())

})

 进行DOM遍历 比如遍历一个ul 显示里面的li的文本内容

 

$.each(data,function(key,val){

alert(val.属性名)

})

遍历数据,比如json对象,应该alert(val.属性名)

 

4.php

json_decode($res,true); 这个true的作用就是把json对象转换成数组,转换以后的数据类型就是数组了。

file_put_contents($fileName,$content.PHP_EOL.PHP_EOL,FILE_APPEND|LOCK_EX); PHP_EOL 是换行符,根据系统自动识别,,FILE_APPEND 是换行追加,LOCK_EX 是加锁。

sleep(2);在php函数方法中就是 延时2秒再接着执行下面的代码。

20170801

 

 

5.$_SERVER;常用参数:


$_SERVER['HTTP_HOST'],  ===   string(15) "www.xxxxx.com"

$_SERVER['REQUEST_URI'], === string(55) "/index.php?m=module&c=controler&a=action&catid=423&id=6"

$_SERVER['QUERY_STRING'], ===  string(44) "m=module&c=controler&a=action&catid=423&id=6"
 

 

6.上传文件的input的事件

<input type="file" οnchange='go()' name='my_file' id='upload' style='display:none'>

当页面点击浏览文件的时候,弹出选择文件框,当双击选择文件以后,就会出发 onchange()事件。

页面美化:点击某个div(或者其他) 触发js的点击事件click , click点击 id=upload的文件框,然后就等于直接弹出来选择文件, 选择完以后,直接出发onchange() 。

全程不需要input显示。

 

7.连接mysql数据库

 

$link =mysqli_connect("localhost", "root", "root") or die("数据库连接失败!");  //连接数据库
 mysqli_set_charset($link,"utf8"); //设置字符集
 mysqli_select_db($link,"test");//选择数据库

$sql = "select * from my_test"; //编写sql
$res=mysqli_query($link,$sql);//执行sql
while ($ress =mysqli_fetch_assoc($res)) {  //处理结果集

        $shuju[]=$ress;    //用户数据
    }
mysqli_close($link);  //关闭数据库连接

 

 

 

8.php中 use关键字 和引入类

 

以tp框架来说,tp是通过命名空间自动导入对应的类,引入命名空间用use 关键字。

use 没有引入对应类的功能,只是引入了命名空间。

加载类,可以用自动加载__autoload() 来实现或者注册自动加载函数,当你用到的当前内存中不存在的类时,就会触发__autoload()或者你自己注册的自动加载函数进行类的自动加载,而use的作用就是 告诉去哪个命名空间内去找需要的类。

 

//注册自加载
spl_autoload_register('autoload');

function autoload($class)
{
    require dirname($_SERVER['SCRIPT_FILENAME']) . '//..//' . str_replace('\\', '/', $class) . '.php';
}

/************************************* test *************************************/

use factoryAbstract\AnimalFactory;

$animal = new AnimalFactory();


上面这个,没有任何框架,就是一个简单的文件夹中,有两个文件 ,test.php 就是上面几行代码,animalfactory.php 文件 有命名空间,声明了AnimalFactory类。

test 注册了自动加载函数 autoload, use 引入了命名空间,下面实例化了AnimalFactory这个类。

上面的 use 和自动加载  在test.php中 二者缺一不可,缺少任何一个都会报错。

如果test.php里面声明了类,可以在类内利用__autoload() 函数在里面进行类的引入。

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值