站三界导航
首页 PHP代码
  • PHP将数组转换成URL参数的方法
    PHP将数组转换成URL参数的方法

    PHP将数组转换成URL参数的方法,在MVC框架中是比较常见的,在TP的系统内构中也包含了此类的方法,也就是我们生成一个数组,数组参数是不等的,我们需要在URL中以参数的形式传递出去,也就是当前页一个问号?后面是参数字符串,会自动进行urlencode的处理。目前PHP中比较有效的解决方案就是直接使用php的内置函数http_build_query,我们先生成一个数组如下:$data=array('foo'=>'bar','baz'=>'boom','site'=>'www.zhansanjie.com','name'=>'nowamagic');echohttp_build_query($data);然后使用echo进行输出打印,结果如下:foo=bar&baz=boom&site=www.zhansanjie.com&name=nowamagic我们是否就生成了一个比较完整的URL参数值呢。如果数组不给值的话,比如'foo',哪么参数就会自动加索引,也就会变成0=foo形式了,所以我们需要给数组一个val值。http_build_query还有更为复杂的用法,比如对多维数组的一个URL参数化,我们都可以进行尝试一下其使用的方法,因为我这里仅用到了PHP单个数组的URL化,多维数组暂时不去研究了。

    • PHP代码
    • 79阅读
    • 2022-06-30

  • PHP怎么记录用户停留页面的时间
    PHP怎么记录用户停留页面的时间

    一个比较奇葩的要求,需要在TP中记录用户停留访问的时间,而TP已经生成了纯HTML静态网页,在网页中添加时间记录是需要PHP文件配合的0,时间记录是要写在PHP文件里面的,而包含PHP文件的是JS引入,这就好比网页中的浏览数一个道理,好了,我们先看一下,HTML网页中的JS文件如下:<script>vardt1=newDate();window.onbeforeunload=function(){vardt2=newDate();varms=dt2.getTime()-dt1.getTime();varimg=newImage();img.src='log.php?stay_ms='+ms;}</script>这里我们包含了一个log.php的时间文件,记录停留时间的PHP文件如下:$refer='';if(isset($_SERVER['HTTP_REFERER'])){$refer=$_SERVER['HTTP_REFERER'];}$user_agent='';if(isset($_SERVER['HTTP_USER_AGENT'])){$user_agent=$_SERVER['HTTP_USER_AGENT'];}$ip=$_SERVER['REMOTE_ADDR'];if(isset($_GET['stay_ms'])){$log='['.date("Y-m-dH:i:s").']'.$ip.''.$refer.'@'.number_format($_GET['stay_ms'])."ms\r\n";file_put_contents("log/log_".date("Y-m-d").".txt",$log,FILE_APPEND);}if($_SERVER['QUERY_STRING']==''||isset($_GET['day'])){$day=isset($_GET['day'])?$_GET['day']:date("Y-m-d");$file="log/log_".$day.".txt";if(file_exists($file)){$log=file_get_contents($file);echonl2br($log);}}这里把用户停留页面的时间生成了一个log的txt文件,如果相要记录在数据库里面的话,直接在PHP中写逻辑就可以了,这里的逻辑是所有用户的访问时间,如果我们要记录单个会员用户的话,同样在PHP中写逻辑就OK了。

    • PHP代码
    • 72阅读
    • 2022-06-30

  • PHP提取出长URL中的根域名
    PHP提取出长URL中的根域名

    在采集的项目中,遇到各种各样的URL,因为要采集国外的内容,涉及到.jp,.ca,hk等域名,但前面又有各类的二级域名,这就导致我们在取根域名的时候遇到一定难度,我们来看一下网址,如:http://blog.ab.cc.win.aisa.hk/index.php突然一看,是不是懵逼得不行,当然,如果用人眼看的话,一眼就看出来是.hk的域名,但我想要把.hk的域名使用php给提取出来,网上有许多的代码,但都不能得到正确的答案,所以只能索性写一个,也希望大家给提出其中的bug来,代码如下:<?php#使用示例echogetBaseDomain('http://blog.jp.goo.ne.jp/index.php')->domain;echo"\n";echogetBaseDomain('http://51.ca/index.php')->domain;echo"\n";echogetBaseDomain('http://blog.ab.cc.win.aisa.hk/index.php')->domain;echo"\n";functiongetBaseDomain($url=''){if(!$url){return$url;}#列举域名中固定元素$state_domain=array('al','dz','af','ar','ae','aw','om','az','eg','et','ie','ee','ad','ao','ai','ag','at','au','mo','bb','pg','bs','pk','py','ps','bh','pa','br','by','bm','bg','mp','bj','be','is','pr','ba','pl','bo','bz','bw','bt','bf','bi','bv','kp','gq','dk','de','tl','tp','tg','dm','do','ru','ec','er','fr','fo','pf','gf','tf','va','ph','fj','fi','cv','fk','gm','cg','cd','co','cr','gg','gd','gl','ge','cu','gp','gu','gy','kz','ht','kr','nl','an','hm','hn','ki','dj','kg','gn','gw','ca','gh','ga','kh','cz','zw','cm','qa','ky','km','ci','kw','cc','hr','ke','ck','lv','ls','la','lb','lt','lr','ly','li','re','lu','rw','ro','mg','im','mv','mt','mw','my','ml','mk','mh','mq','yt','mu','mr','us','um','as','vi','mn','ms','bd','pe','fm','mm','md','ma','mc','mz','mx','nr','np','ni','ne','ng','nu','no','nf','na','za','aq','gs','eu','pw','pn','pt','jp','se','ch','sv','ws','yu','sl','sn','cy','sc','sa','cx','st','sh','kn','lc','sm','pm','vc','lk','sk','si','sj','sz','sd','sr','sb','so','tj','tw','th','tz','to','tc','tt','tn','tv','tr','tm','tk','wf','vu','gt','ve','bn','ug','ua','uy','uz','es','eh','gr','hk','sg','nc','nz','hu','sy','jm','am','ac','ye','iq','ir','il','it','in','id','uk','vg','io','jo','vn','zm','je','td','gi','cl','cf','cn','yr','com','arpa','edu','gov','int','mil','net','org','biz','info','pro','name','museum','coop','aero','xxx','idv','me','mobi','asia','ax','bl','bq','cat','cw','gb','jobs','mf','rs','su','sx','tel','travel');if(!preg_match("/^http/is",$url)){$url="http://".$url;}$res=null;$res->domain=null;$res->host=null;$url_parse=parse_url(strtolower($url));$urlarr=explode(".",$url_parse['host']);$count=count($urlarr);if($count<=2){#当域名直接根形式不存在host部分直接输出$res->domain=$url_parse['host'];}elseif($count>2){$last=array_pop($urlarr);$last_1=array_pop($urlarr);$last_2=array_pop($urlarr);$res->domain=$last_1.'.'.$last;$res->host=$last_2;if(in_array($last,$state_domain)){//www.zhansanjie.com$res->domain=$last_1.'.'.$last;$res->host=implode('.',$urlarr);}if(in_array($last_1,$state_domain)){$res->domain=$last_2.'.'.$last_1.'.'.$last;$res->host=implode('.',$urlarr);}#print_r(get_defined_vars());die;}return$res;}?>首先我们定义一个getBaseDomain的function方法,然后直接使用实例来获取URL的根域名即可,实例如echogetBaseDomain('http://blog.jp.goo.ne.jp/index.php')->domain;echo"\n";,获取到根域名之后,就可以得到下一步的使用。

    • PHP代码
    • 75阅读
    • 2022-06-30

  • php生成动态的图片随机码,可指定画布大小
    php生成动态的图片随机码,可指定画布大小

    PHP验证码在注册或者登陆的时候是必不可少的,主要是为了防止垃圾注册或者恶意登陆,在TP系统中有内置的生成验证码的类,直接调用就可以了,而在PHP的原生代码中,则需要使用image之类的函数,使用imagecreate来进行画布的创建,其实如果我们要扒开TP图片类的话,也是使用了PHP的函数类来创建的,好了,我们先看一下PHP生成动态随机码的方法吧,可以自行指定图片的大小,其中使用了创建画布imagecreate函数和随机码的函数mt_rand等等,代码如下:$image_width=100;$image_height=100;$image_str='';if(isset($_GET['w'])){$image_width=intval($_GET['w']);}if(isset($_GET['h'])){$image_height=intval($_GET['h']);}if(isset($_GET['s'])){$image_str=$_GET['s'];}$img=imagecreate($image_width,$image_height);$color=imagecolorallocate($img,mt_rand(157,255),mt_rand(157,255),mt_rand(157,255));imagefilledrectangle($img,0,$image_height,$image_width,0,$color);$step=mt_rand(15,30);$start=mt_rand(0,$step);$color=imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));imagesetthickness($img,mt_rand(3,10));if($image_height>$image_width){for($i=$start;$i<$image_height*2;$i+=$step){imageline($img,0,$i,$i,0,$color);}}else{for($i=$start;$i<$image_width*2;$i+=$step){imageline($img,$i,0,0,$i,$color);}}if($image_str!=''){$black=imagecolorallocate($img,0,0,0);imagestring($img,12,5,5,$image_str,$black);}header('Content-type:image/png');//www.zhansanjie.comimagepng($img);imagedestroy($img);一段很简单的PHP生成动态随机码的代码,代码有点粗糙,但是比较容易理解,如果是简单的应用,可以封装成一个图片验证码类,在使用的时候直接进行调用就OK了。

    • PHP代码
    • 77阅读
    • 2022-06-30

  • PHP获取周几的方法
    PHP获取周几的方法

    今天做的一个项目需要一个签到的功能,也就是需要获取在某个时间段下的周几,或者未来某个时间几天以后的周几,我们需要获取的就是周天数,因为是集团做的一个功能,所以在TP里面写了一个获取周几的一个函数方法,我们先来看一下方法函数如下:functiongetTimeWeek($time,$i=0){$weekarray=array("一","二","三","四","五","六","日");//www.zhansanjie.com$oneD=24*60*60;return"周".$weekarray[date("w",$time+$oneD*$i)];}getTimeWeek方法共有两个参数,$time是我们定义的时间,是一个时间戳的形式,$i是今天开始的意思,我们可以测试一下,如下:$time=time();echogetTimeWeek($tiem);可以获取到当前时间戳的周几,这样的项目实例在应用中是比较少见的,这里仅做一个记录使用,实际的意义不是太大。

    • PHP代码
    • 91阅读
    • 2022-06-30

  • PHP跳出循环的方法及continue、break、exit的区别
    PHP跳出循环的方法及continue、break、exit的区别

    PHP中的循环结构大致有for循环,while循环,do{}while循环以及foreach循环几种,不管哪种循环中,在PHP中跳出循环大致有这么几种方式:<?php$i=1;while(true){//这里看上去这个循环会一直执行if($i==2){//2跳过不显示$i++;continue;}elseif($i==5){//但到这里$i=5就跳出循循环了break;}else{echo$i.'<br>';}$i++;}exit;echo'这里不输出';?>结果:134continuecontinue是用来用在循环结构中,控制程序放弃本次循环continue语句之后的代码并转而进行下一次循环。continue本身并不跳出循环结构,只是放弃这一次循环。如果在非循环结构中(例如if语句中,switch语句中)使用continue,程序将会出错。例如在下面的这段PHP代码片段中:<?phpfor($i=1;$i<=100;$i++){if($i%3==0||$i%7==0){continue;}&#160;else{echo”$i\n<br/>”;}}?>PHP的代码片段的作用是输出100以内,既不能被7整除又不能被3整除的那些自然数,循环中先用if条件语句判断那些能被整除的数,然后执行continue;语句,就直接进入了下个循环。不会执行下面的输出语句了。breakbreak是被用在上面所提的各种循环和switch语句中的。他的作用是跳出当前的语法结构,执行下面的语句。break语句可以带一个参数n,表示跳出循环的层数,如果要跳出多重循环的话,可以用n来表示跳出的层数,如果不带参数默认是跳出本重循环。看下面这个多重循环嵌套的例子:for($i=1;$i<=10;$i++){for($j=1;$j<=10;$j++){$m=$i*$i+$j*$j;echo”$m\n<br/>”;if($m<90||$m>190){break2;}}}这里使用了break2跳出了两重循环,你可以试验一眼,将2去掉,得到的结果是完全不一样的。如果不使用参数,跳出的只是本次循环,第一层循环会继续执行下去。gotogoto实际上只是一个运算符,和其他语言一样,PHP中也不鼓励滥用goto,滥用goto会导致程序的可读性严重下降。goto的作用是将程序的执行从当前位置跳转到其他任意位置,goto本身并没有要结束的循环的作用,但其跳转位置的作用使得其可以作为跳出循环使用。但PHP5.3及以上版本停止了对goto的支持,所以应该尽量避免使用goto。下面的是一个使用了goto跳出循环的例子for($i=1000;$i>=1;$i–){if(sqrt($i)<=29){gotoa;}echo“$i”;}a:echo”thisistheend”;例子中使用了goto来跳出循环,这个例子用来检测1000以内,那些数的平方根大于29。exitexit是用来结束程序执行的。可以用在任何地方,本身没有跳出循环的含义。exit可以带一个参数,如果参数是字符串,PHP将会直接把字符串输出,如果参数是integer整形(范围是0-254),那个参数将会被作为结束状态使用。<?phpfor($i=1000;$i>=1;$i–){if(sqrt($i)>=29){echo”$i\n<br/>”;}else{exit;}}echo”本行将不会被输出”;?>上面这个例子中直接在从循环里结束了代码的运行,这样会导致后面的代码都不会被执行,如果是在一个phpweb页面里面,甚至连exit后面的html代码都不会被输出。returnreturn语句是用来结束一段代码,并返回一个参数的。可以从一个函数里调用,也可以从一个include()或者require()语句包含的文件里来调用,也可以是在主程序里调用,如果是在函数里调用程序将会马上结束运行并返回参数,如果是include()或者require()语句包含的文件中被调用,程序执行将会马上返回到调用该文件的程序,而返回值将作为include()或者require()的返回值。而如果是在主程序中调用,那么主程序将会马上停止执行<?phpfor($i=1000;$i>=1;$i–){if(sqrt($i)>=29){echo”$i\n<br/>”;}else{return;}}echo”本行将不会被输出”;?>这里的例子和上面使用exit的效果是一样的。在循环结束条件,自然跳出这个当然是最好理解了,当循环满足循环临界条件时就是自己退出。以上是PHP中跳出循环的几种方式的简单总结。if不是循环结构,所以不能使用break,continue退出。如果你非要在if语句中这样用的话,可以把这个if语句放在一个循环结构中$i=0;$s=1;while($i==0){if($s==1){$v=8;break;}$v=9;}echo$v;

    • PHP代码
    • 108阅读
    • 2022-06-30

  • 10个你应该学习使用的PHP特性
    10个你应该学习使用的PHP特性

    本文主要总结了10个PHP特性,这些PHP特性对于PHP开发者来说都是应该学习和使用的,译文如下:1)标量类型声明(PHP7)PHP是一种松散类型的编程语言,因此没有提供任何指定输入参数类型和返回值类型的方法。PHP7通过以下语法改变了这个现象:functionadd(int$x,int$y):int{return$x+$y;}echoadd(1,2);有效类型为:类/接口名称,self,array(数组),callable(回调类型),bool(布尔型),float(浮点型),int(整型)和string(字符串)。2)—空接合操作符(PHP7)空接合操作符虽然小,但非常好用,是PHP7中新增加的。—只要操作符的左边存在且不为空,就返回左边,否则就返回操作符的右边://$aisnotdefined$b=NULL;$c="abc123";echo($a$b$c);//Result:abc1233)匿名类(PHP7)PHP7中还有一个新增的也很不错,那就是匿名类。有时候,我们只是没有必要创建一个命名的类,因为它的名字会导致当前命名空间的膨胀。语法非常简单:echo(newclass(){publicfunctionmyMethod(){return"Hello!";}})->myMethod();//Result:Hello!4)ReflectionReflection是一个用来获取有关运行时代码信息的强大框架。让你可以对类、接口、函数、方法和扩展执行反向工程,以构建映射引擎,IoC容器或文档框架等等。下面是一个获取匿名类所有方法的简单例子:$class=newReflectionClass(newclass(){publicfunctiongetText(){return"Hellofromanonymousclass";}});$methods=$class->getMethods();var_dump($methods);5)短数组初始化在用PHP编程的时候,我倾向于大量使用数组,因为它们不仅功能强大,而且简单易用。PHP的5.4.x版本使得更容易初始化:$myArray=["foo","name"=>"bar"];6)DateTime类PHP的5.2版本附带DateTime类作为首选的操纵和格式化日期和时间的方式。7)Lambda表达式/匿名函数匿名函数(有时也被称为lambda表达式)是没有指定名称的函数。匿名函数可以被分配给一个变量,如下例所示:$sayHi=function($toName){echo("Hi".$toName);};$sayHi("Peter");8)array_maparray_map是一个不错的函数,能帮助你对数组中的每个元素执行计算。这在混合了匿名函数/lambda表达式的时候特别好用。无论你为数组中的元素提供什么方法,array_map函数都适用:$nameLengths=array_map(function($item){returnstrlen($item);},["Sue","Peter","Michael"]);//Result:3,5,7需要注意的是,array_map可能会比foreach慢一点儿(特别当混合使用lambda表达式的时候更为明显),所以要慎用于那些非常大的数组。9)json_encode()和json_decode()我最近倾向于大量使用JSON序列化和反序列化。PHP的json_encode和json_decode函数对此提供了大力支持。需要注意的是,json_encode会忽略私有成员:classcar{public$make="Tesla";public$model="ModelS";private$errorCodes=['34343','545344'];}$carAsJson=json_encode(newcar());//Result:{"make":"Tesla","model":"ModelS"}10)密码的哈希(hashing)和验证PHP通过password_hash和password_verify函数,用一种安全的方式来大力支持密码的哈希和验证。因为使用非常简单,所以我们就没有必要重新发明轮子了。

    • PHP代码
    • 119阅读
    • 2022-06-29

  • 用php获取本周,上周,本月,上月,本季度日期的代码
    用php获取本周,上周,本月,上月,本季度日期的代码

    <?phpechodate("Y-m-d",strtotime("now")),"<br/>";echodate("Y-m-d",strtotime("-1weekMonday")),"<br/>";//离现在最近的周一echodate("Y-m-d",strtotime("-1weekSunday")),"<br/>";//离现在最近的周末echodate("Y-m-d",strtotime("+0weekMonday")),"<br/>";//将要到来的周一echodate("Y-m-d",strtotime("+0weekSunday")),"<br/>";//将要到来的周末echodate("n");//第几个月echodate("w");//本周周几echodate("t");//本月天数echo"<br/>上周:<br/>";echodate("Y-m-dH:i:s",mktime(0,0,0,date("m"),date("d")-date("w")+1-7,date("Y"))),"<br/>";echodate("Y-m-dH:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7-7,date("Y"))),"<br/>";echo"<br>本周:<br>";echodate("Y-m-dH:i:s",mktime(0,0,0,date("m"),date("d")-date("w")+1,date("Y"))),"<br/>";echodate("Y-m-dH:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y"))),"<br/>";echo"<br>上月:<br>";echodate("Y-m-dH:i:s",mktime(0,0,0,date("m")-1,1,date("Y"))),"<br/>";echodate("Y-m-dH:i:s",mktime(23,59,59,date("m"),0,date("Y"))),"<br/>";echo"<br>本月:<br>";echodate("Y-m-dH:i:s",mktime(0,0,0,date("m"),1,date("Y"))),"<br/>";echodate("Y-m-dH:i:s",mktime(23,59,59,date("m"),date("t"),date("Y"))),"<br/>";$getMonthDays=date("t",mktime(0,0,0,date("n")+(date("n")-1)%3,1,date("Y")));//本季度未最后一月天数echo"<br>本季度:<br>";echodate('Y-m-dH:i:s',mktime(0,0,0,date('n')-(date('n')-1)%3,1,date('Y'))),"<br/>";echodate('Y-m-dH:i:s',mktime(23,59,59,date('n')+(date('n')-1)%3,$getMonthDays,date('Y'))),"<br/>";$jdtoday=gregoriantojd(date('n'),date('j'),date('y'));$offset=jddayofweek($jdtoday)-1;for($i=0-$offset;$i<7-$offset;$i++){$date=strtotime($i.'days');echo('<th>'.date('D',$date).'/'.date('n-j',$date).'</th>');}?>

    • PHP代码
    • 66阅读
    • 2022-06-29

  • php遍历目录并批量修改文件权限
    php遍历目录并批量修改文件权限

    做程序的开发,不得不遇到的就是文件权限的问题,很多时候我们程序出现的各种各样的问题也是因为文件权限的原因,尤其是在linux系统下更是如此,合理正确的分配文件的权限可以让程序更加的有效和安全,这里举个例子将一个目录遍历,并将其下所有文件权限改为777,对于文件的权限如何划分,大家可以google一下。先看代码<?php//$dir->目录$chmod->权限如:0777functionrecurDir($dir,$chmod=''){if(is_dir($dir)){if($handle=opendir($dir)){while(false!==($file=readdir($handle))){if(is_dir($dir.'/'.$file)){if($file!='.'&&$file!='..'){$path=$dir.'/'.$file;$chmod?chmod($path,$chmod):FALSE;echo$path.'<p>';recurDir($path);}}else{$path=$dir.'/'.$file;$chmod?chmod($path,$chmod):FALSE;echo$path.'<p>';}}}closedir($handle);}}recurDir('ask',0777);如上面代码,即是将本文件同级下的ask目录下的所有文件的权限改为777,但是并不包含ask这个目录,我们应该要来了解一下文件权限操作的常识,一个文件只能是改变其下级,或者同级的下级目录或文件的权限,而起同级的目录或文件,或者上级的目录或文件,其是不能改变的。原因是什么,就是出于安全的考虑,试想一下,如果下级可以改上级,那么我们岂不是可以控制整个电脑了,这样当然不安全。

    • PHP代码
    • 96阅读
    • 2022-06-29

  • 通用防盗链破解接口
    通用防盗链破解接口

    防盗链的方式有很多,最通用的方式就是通过判断来路等信息来防止素材被盗链,但是只要你是网络可见的资源,只要你能让用户看到,原理上来说都是可以被破解的。我们增加一定的防盗链措施也只是过滤一部分初中级盗链,如果想要盗链,其实防不住的,只是增加了盗链成本而已。nginx防止盗链非常通用的方式是这样location~*\.(gif|jpg|swf|flv)${valid_referersnoneblockedwww.zhansanjie.com;if($invalid_referer){rewrite^/http://www.zhansanjie.com/logo.png;#return404;}}其实就是通过判断来路。这里提供一个接口,我用php通过curl伪装来路,头信息等,来获取图片接口地址为:http://www.zhansanjie.com/api/img/使用为<imgsrc="http://www.zhansanjie.com/api/img/index.php?p=http://www.zhansanjie.com/logo.png">

    • PHP代码
    • 80阅读
    • 2022-06-29

站三界导航
本站声明:本站严格遵守国家相关法律规定,非正规网站一概不予收录。本站所有资料取之于互联网,任何公司或个人参考使用本资料请自辨真伪、后果自负,站三界导航不承担任何责任。在此特别感谢您对站三界导航的支持与厚爱。