php使用empty()函数要注意事项

 更新时间:2016年11月25日 17:29  点击:1392
使用empty()判断数字0的时候,empty()也会返回true,就是说如果你的变量有可能出现数字0这个变量,要使用isset()来判断会好一些!!

从表面上看,很容易误解empty()函数是判断字符串是否为空的函数,其实并不是,我也因此吃了很多亏。

empty()函数是用来测试变量是否已经配置。若变量已存在、非空字符串或者非零,则返回 false 值;反之返回 true值。所以,当字符串的值为0时,也返回true,就是执行empty内部的语句。这就是陷阱。

 代码如下 复制代码

$a=array("1"=>"ddf");
var_dump(empty($a));///boolean false
$b=0;
var_dump(empty($b));  ///boolean true

劝告各位,千万注意使用empty()函数。

判断字符串是否为空,可以这么判断: if ($value=="") ...
    * 格式:bool empty ( mixed var )
    * 功能:检查一个变量是否为空
    * 返回值:
    * 若变量不存在则返回 TRUE
    * 若变量存在且其值为""、0、"0"、NULL、、FALSE、 array()、var $var; 以及没有任何属性的对象,则返回 TURE
    * 若变量存在且值不为""、0、"0"、NULL、、FALSE、 array()、var $var; 以及没有任何属性的对象,则返回 FALSE
    * 版本:PHP 3, PHP 4, PHP 5

从表面上看,很容易误解empty()函数是判断字符串是否为空的函数,其实并不是,我也因此吃了很多亏。 empty()函数是用来测试变量是否已经配置。若变量已存在、非空字符串或者非零,则返回 false 值;反之返回 true值。所以,当字符串的值为0时,也返回true,就是执行empty内部的语句。这就是陷阱。如: 假设 $value = 0; 则empty($value)=false。劝告各位,千万注意使用empty()函数。判断字符串是否为空,可以这么判断: if ($value=="") ... 格式:bool empty ( mixed var ) 功能:检查一个变量是否为空 返回值:若变量不存在则返回 TRUE 若变量存在且其值为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 TURE 若变量存在且值不为""、0、"0"、NULL、、FALSE、array()、var $var; 以及没有任何属性的对象,则返回 FALSE 版本:PHP 3, PHP 4, PHP 5


当你使用empty检查一个函数返回的结果时会报错:Fatal error: Can't use function return value in write context

例如:

 代码如下 复制代码

<?php
echo empty(strlen('be-evil.org'));

到PHP手册里面查看,在empty函数描述的地方有以下文字:

Note: empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

empty() 只检测变量,检测任何非变量的东西都将导致解析错误!

因此,我们不能拿empty来直接检测函数返回的值,上面例子的解决方案如下:

 代码如下 复制代码

<?php

$length = strlen('be-evil.org');

echo empty($length);
?>

在apache与php的环境中默认过期时间是20分钟左右,那么我们要怎么设置session过期呢,下面看具体方法总结。

我们最常用的是在php程序中设置

 代码如下 复制代码

<?php
if(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)
 $_SESSION['last_access'] = time();
?>

这样就搞定了,如果要设置过期的话也可以在程序中实例

 代码如下 复制代码

<?php
unset($_SESSION['last_access']) 或 $_SESSION['last_access']='';
?>

session有过期的机制


session.gc_maxlifetime  原来session 过期是一个小概率的事件,分别使用session.gc_probability和session.gc_divisor 来确定运行session 中gc 的概率  session.gc_probability和session.gc_divisor的默认值分别为 1和100 

分别为分子和分母  所以session中gc的概率运行机会为1% 。如果修改这两个值,则会降低php的效率。所以这种方法是不对的!!

所以,修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间了:(例如,我们把过期时间修改为86400秒)

 代码如下 复制代码

session.gc_maxlifetime = 86400

然后,重启你的web服务(一般是apache)就可以了。

session“回收”何时发生?

默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的

 代码如下 复制代码

#概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100


注意1:假设这种情况gc_maxlifetime=120,如果某个session文件最后修改时间是120秒之前,那么在下一次回收(1/100的概率)发生前,这个session仍然是有效的。

注意2:如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期session文件。这时需要定时手动(或者crontab)的删除过期的session:cd /path/to/sessions; find -cmin +24 | xargs rm

我们来给大家介绍一下关于在php中无发限分类的一些用法,包括有直接无限分类数据库与数组的操作,有需要的朋友可参考参考。

先看一个php与mysql数据库的无限分类


建立数据库 :
id,fid,fname(id和fid都必需是数字类型而且fid的默认值一定要设成0;

 代码如下 复制代码

<?php
$stime=microtime();

$db=@mysql_connect("localhost","root","micronsky.net")   or die("数据库连接失入");
mysql_select_db("temp",$db);
//定义第一级分类
function mainfl()
{
     global $db;
$result=mysql_query("select id,fid,fname from wxjfl where fid=0   order by id desc",$db);
if ($myrow=mysql_fetch_array($result)) {
   do {
   echo $myrow["fname"];
   echo "<br>";
   echo subfl($myrow["id"],"  ");   //此处调用子级分类函数
   }
   while ($myrow=mysql_fetch_array($result));
}

}
//定义子级分类
function subfl($fid,$strdis)
{
global $db;
$result1=mysql_query("select id,fid,fname from wxjfl where fid=$fid   order by id desc",$db);
if ($myrow1=mysql_fetch_array($result1)) {
do {
   //echo $strdis;
   echo $strdis.$myrow1["fname"];
   echo "<br>";
   subfl($myrow1["id"],"  ".$strdis); //这里一定要注意并不需要像上面那个函数那样echo ...只要直接调用子级分类函数并付值就行了!同时这里也是递归部分
}
while ($myrow1=mysql_fetch_array($result1));
}
}


echo mainfl();

$ltime=microtime();
echo "<br>";
echo number_format($ltime-$stime,4);   //统计执行时间,这里就比ASP快多了,但这跟写法没多大关系,主要是PHP本身加入了加速器的原因!

?>


现在我们直接利用数组进行分页

 代码如下 复制代码

/**
 * 创建父节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_parent($ar, $id='id', $pid='pid') {
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ){
      if( ! isset($t[$item[$pid]]['parent'][$item[$pid]]) )
         $t[$item[$id]]['parent'][$item[$pid]] =& $t[$item[$pid]];

          $t[$k]['reference'] = true;
    }
  }
  return $t;
}


/**
 * 创建子节点树形数组
 * 参数
 * $ar 数组,邻接列表方式组织的数据
 * $id 数组中作为主键的下标或关联键名
 * $pid 数组中作为父键的下标或关联键名
 * 返回 多维数组
 **/
function find_child($ar, $id='id', $pid='pid') {
  foreach($ar as $v) $t[$v[$id]] = $v;
  foreach ($t as $k => $item){
    if( $item[$pid] ) {
      $t[$item[$pid]]['child'][$item[$id]] =& $t[$k];

      $t[$k]['reference'] = true;
    }
  }
  return $t;
}

 

示例:

 

 代码如下 复制代码
$data = array(
    array('ID'=>1, 'PARENT'=>0, 'NAME'=>'祖父'),
    array('ID'=>2, 'PARENT'=>1, 'NAME'=>'父亲'),
    array('ID'=>3, 'PARENT'=>1, 'NAME'=>'叔伯'),
    array('ID'=>4, 'PARENT'=>2, 'NAME'=>'自己'),
    array('ID'=>5, 'PARENT'=>4, 'NAME'=>'儿子')
);
$p = find_parent($data, 'ID', 'PARENT');
$c = find_child($data, 'ID', 'PARENT');

上面两种方法是将所有节点按id平摊到一个数组中,然后找到他们的 parent 或 children ,通过引用将 平摊的元素挂接到 parent 、children 下,

但被引用的元素依然存在于平摊的数组中,因此,在实际应用时,最好标记那些被引用的元素,以避免以他们为根开始遍历,导致重复。

 代码如下 复制代码


        foreach ($p as $key => $item) {
            if($item['reference']) continue;
            print_r($item);
        }

        foreach ($c as $key => $item) {
            if($item['reference']) continue;
            print_r($item);
        }

 

递归法,PHP 数组元素被删除后,数组游标会归零,因此在遍历过程中一些已经找到 “归宿” 的元素也不得不留在数组中,无法缩减后继元素的搜索范围:

 代码如下 复制代码


$mylist = array(array( 'parent_id'=>0,'id'=>1),
                    array( 'parent_id'=>0,'id'=>2),
                    array( 'parent_id'=>0,'id'=>3),   
                    array( 'parent_id'=>2,'id'=>4),
                    array( 'parent_id'=>2,'id'=>5),
                    array( 'parent_id'=>3,'id'=>6),
                    array( 'parent_id'=>3,'id'=>7),   
                    array( 'parent_id'=>4,'id'=>8),
                    array( 'parent_id'=>5,'id'=>9),
                    array( 'parent_id'=>5,'id'=>10)
                );

 

    function _findChildren($list, $p_id){    //数据层级化,
          $r = array();
          foreach($list as $id=>$item){
            if($item['parent_id'] == $p_id) {
                   $length = count($r);
                  $r[$length] = $item;
                  if($t = $this->_findChildren($list, $item['id']) ){
                      $r[$length]['children'] = $t;
                  }               
            }
          }
          return $r;
    } 
 

print_r(_findChildren($mylist, 0));

我们在做缓存文件时经常会要把php代码或数组转换成字符串保存到数据库中,下面我来介绍两种把数组保存到数据库的方法。

方法一:

用serialize写入,再用unserialize输出

serialize()就是将PHP中的变量如对象(object),数组(array)等等的值序列化为字符串后存储起来.序列化的字符串我们可以 存储在其他地方如数据库、Session、Cookie等,序列化的操作并不会丢失这些值的类型和结构。这样这些变量的数据就可以在PHP页面、甚至是不 同PHP程序间传递了。
而unserialize()就是把序列化的字符串转换回PHP的值。返回的是转换之后的值,可为 integer、float、string、array 或 object如果传递的字符串不可解序列化,则返回 FALSE

 代码如下 复制代码

class db {
 private $host;
 private $user;
 private $pwd;
 private $dbname;
 private $Mysqli;
 function __construct($host, $user, $pwd, $dbname) {
  $this->host = $host;
  $this->user = $user;
  $this->pwd = $pwd;
  $this->dbname = $dbname;
  $this->db();
 }
 function db() {
  $this->mysqli = new mysqli ( $this->host, $this->user, $this->pwd, $this->dbname );
 }
 function select() {
  $this->mysqli->query("SET CHARSET GBK");
  $sql = "SELECT id,cname FROM hdw_channel";
  $result = $this->mysqli
   ->query ( $sql );
  $rows = array ();
  while ( $row = $result->fetch_assoc () ) {
   $rows [] = $row;
  }
  ECHO "<PRE>";
  print_r ( $rows );
 }
 function __wakeup(){   //反序列化,
  $this->db();
 }
}
$chanel = new db("localhost",'root','','hdcms');
//$chanel->select();
session_start();
$_SESSION['channel_obj'] = serialize($chanel);   //将对象序列化,保存的是对象的属性,没有方法,所以要用__wakeup()


class ren{
 private $name;
 private $age;
 function __construct($name,$age){
  $this->name =$name;
  $this->age = $age;
 }
 function show(){
  echo "姓名是:{$this->name}  年龄是:{$this->age}";
 }
 function __sleep(){
  return array_keys(get_object_vars($this));  //或得数组里边的键名,序列化某些变量
 }
}
$zao = new ren("赵六",44);
echo serialize($zao);       //序列化(指定哪个变量序列化)

====================================
 
session_start();
include '59.php';
$channel_obj=unserialize($_SESSION['channel_obj']);  //反序列化类对象
$channel_obj->select();  //有了__wakeup方法才可以起作用

方法二:

用json_encode写入,再用json_decode输出

json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。

 代码如下 复制代码

<?php
/**************************************************************
 *
 * 使用特定function对数组中所有元素做处理
 * @param string &$array  要处理的字符串
 * @param string $function 要执行的函数
 * @return boolean $apply_to_keys_also  是否也应用到key上
 * @access public
 *
 *************************************************************/
function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
{
    static $recursive_counter = 0;
    if (++$recursive_counter > 1000) {
        die('possible deep recursion attack');
    }
    foreach ($array as $key => $value) {
        if (is_array($value)) {
            arrayRecursive($array[$key], $function, $apply_to_keys_also);
        } else {
            $array[$key] = $function($value);
        }
 
        if ($apply_to_keys_also && is_string($key)) {
            $new_key = $function($key);
            if ($new_key != $key) {
                $array[$new_key] = $array[$key];
                unset($array[$key]);
            }
        }
    }
    $recursive_counter--;
}
 
/**************************************************************
 *
 * 将数组转换为JSON字符串(兼容中文)
 * @param array $array  要转换的数组
 * @return string  转换得到的json字符串
 * @access public
 *
 *************************************************************/
function JSON($array) {
 arrayRecursive($array, 'urlencode', true);
 $json = json_encode($array);
 return urldecode($json);
}

$array = array
       (
          'Name'=>'希亚',
          'Age'=>20
       );


echo JSON($array);
?>

下面来介绍两个PHP中随机产生一组不重复的数字实现程序代码,有需要学习的朋友可参考参考。
 代码如下 复制代码

<?php
/**
 * PHP获取一组随机数字不重复
 */
$a = microtime();
function createRandID($m){
    // 产生一个从1到$m的数组
    $arr = range(1,$m);
    // 打乱数组
    shuffle ($arr); 
    // 取前十个
    for($i=0;$i<=10;$i++){
        // 赋值给新数组$n
        $n[] = $arr[$i];    
    }
    // 返回这组数字
    return implode($n,',');
}
 
echo createRandID(700000);
echo '<br />';
echo $a - microtime();
?>

执行结果:

560875,593409,325987,658308,248054,205426,375413,676243,485853,575393,115975
0.672761

由以上结果可以看到,时间花了0.6。我们把随机数范围从700000调到900000再看看执行结果

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 7200000 bytes) in /data0/htdocs/www/a.php on line 10

数组太大程序跑不下了!!

 代码如下 复制代码

<?php
/**
 * PHP获取一组随机数字不重复
 * 琼台博客
 */
$a = microtime();
function createRandID($m){
    // 注意,要先声明一个空数组,否则while里的in_array会报错
    $arr = array();
    // 使用while循环,只要不够10个就永远循环
    while(count($arr)<=10){
        // 产生一个随机数
        $a = rand(1,$m);
        // 判断:如果产生的随机数不再数组里就赋值到数组里
        // 主要避免产生重复的数字
        if(!in_array($a,$arr)){
            // 把随机数赋值到数组里
            $arr[] = $a;    
        }
    }
    // 返回产生的随机数字
    return implode($arr,',');
}
echo createRandID(700000);
echo '<br />';
echo $a - microtime();
?>

执行结果:

308326,155128,280424,493174,214855,219990,482837,66329,512934,232527,386975
0.00015699999999996

由以上执行结果可以看到,时间根本可以忽略不计,我们把随机数范围从700000调到999999再看看执行结果

392281,822956,401282,176255,143076,501802,393338,546922,21836,601991,362006
0.00013600000000002

执行结果跟最大取数值设置都没有丝毫关系,还是跑的挺快!

[!--infotagslink--]

相关文章

  • python中numpy.empty()函数实例讲解

    在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • Illustrator文字转曲的操作方法与注意事项分享

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一说文字转曲的操作方法以及注意事项,各位想知道具体信息的使用者们,那么下面就快来跟着小编一起看看吧。...2016-09-14
  • 网页页面控制注意事项

    1、检查标题。2、检查版权信息,尤其是电话号码。3、图片、文件定位问题。4、产品页面首页指向产品类别问题。5、文章页面首页指向文章类别问题。6、产品图片大小...2016-09-20
  • 微信小程序页面开发注意事项整理

    这篇文章主要介绍了微信小程序页面开发注意事项整理的相关资料,需要的朋友可以参考下...2017-05-22
  • 网站改版要怎么那些?网站改版注意事项

    站改版是每个站长必然经历的过程,也是每个网站必定会发生的状态。网站希望建设越来越好改版是不可避免的,但是网站改版对于网站优化和推广来说又是一大弊端,无论是网站结...2016-10-10
  • 站长注意:网站性能最佳体验

    1、尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减...2016-10-10
  • php 总结数值计算的注意事项

    php数值计算有一些结果可能并不是我们想的那样但它这样计算有自己的理论基础了,下面我们来看一篇php 总结数值计算的注意事项吧。 一:四舍五入 1.round —...2016-11-25
  • php empty()函数详细

    今天要讲到了是关于empty函数的用法,和等空有什么区别,以及用它来操作数组时是不是返回正常的值,有需要的朋友可以参考一下。 代码如下 复制代码 ...2016-11-25
  • PHP匿名函数与注意事项详解

    匿名函数是PHP5.3引进来了,php5.3不但引进了匿名函数还有更多更好多新的特性了,下面我们一起来了解一下PHP匿名函数与注意事项详解 PHP5.2 以前:autoload, PDO 和 My...2016-11-25
  • 网站SEO中页面搜索结果匹配的注意事项

    什么是搜索结果匹配?非常简单,我们把它分成完全匹配和部分匹配。那么究竟什么是完全匹配呢?我们先来举个例子,百度搜“seo是什么”,结果中出现红色的字就是匹配项。 ...2016-10-10
  • PHP双引号使用注意事项

    双引号在php使用中我们通常把它定义为字符串了,但你知道双引号在使用过程中会有一些小问题呢,那么有什么问题我们来看看 PHP很多语法特性会让攻击者有机可乘,例如PH...2016-11-25
  • MYSQL到ORACLE程序迁移的注意事项

    MYSQL到ORACLE程序迁移的注意事项 2001-09 有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随...2016-11-25
  • 新站成长的几点注意事项

    第一:网站别急着上线   有的童鞋网站上线就是买了空间和域名之后,将程序直接丢在空间里面,然后就是哪天有问题,就随机随地的修改;这里,我自己是不赞同的,网站买了空间之后,...2016-10-10
  • 经验共享:网站建设中应该注意的12个错误

    本文认真总结了网站建设中我们难免犯的一些错误,希望大家做网站的时候要提高警惕。   1. “欢迎访问本站”?免了吧!   像这样没有意义的玩艺儿,包括商号...2017-07-06
  • BootStrap注意事项小结(五)表单

    这篇文章主要介绍了BootStrap注意事项小结(五)表单的相关资料,非常不错,具有参考借鉴价值,,需要的朋友可以参考下...2017-03-13
  • 高端网站建设规避网站设计注意事项

    今天文章要给大家介绍的是高端网站建设规避网站设计注意事项,让大家更好的了解网站建设,还不知道的下面就一起来看看。 现在做网站不仅仅只是做网站这样简单,如何让...2017-07-06
  • ORACLE数据库应用开发的三十个注意事项

    今天笔者结合二十余年的ORACLE数据库应用开发和运维的经验教训,总结在使用ORACLE数据库环境中的应用开发中需要注意的一些注意事项,这些问题不但可以作为ORACLE数据库开发的注意事项,大多数也适用于常见的关系型数据库开发甚至非关系型数据开发。...2021-06-06
  • ASP.NE网站发布注意事项简析

    ASP.NET网站部署到IIS中的关键点,本文介绍了一些ASP.NE网站在发布是需要注意事项,需要了解的朋友可以参考下...2021-09-22
  • php中STRPOS查找失败返回的是FALSE注意事项

    strpos() 函数返回字符串在另一个字符串中第一次出现的位置了,但是我们在按官方的手册来测试时发现一直返回false了,那么要如何来解决 STRPOS用法strpos(string,fin...2016-11-25