php的赋值与引用

针对php的引用,有时总会错误认为指向一块内存,修改也会影响到该内存数据,直到看到php的源码分析,有了更清楚的理解,部分出自< php核心技术和最佳实践 >

写时复制

  • web

    • php变量有is_ref和refcount标志,用来标识是否引用和变量引用次数
  • 当两个变量$a=$b;,虽然不是引用,但是值相同,为了内存复用,$b 的refcount会加1

  • 只有当$b 的值改变,才会新开辟内存写入值,并置refcount为1

    Read More

jquery 和 html5

Jquery

选择器

  • prev>child
  • prev+next
  • prev~siblings
  • [attr^=”val”] : 开头为val的属性
  • [attr*=”val”] : 包含val的属性
  • [attr~=”val”] : 将attr以空格分隔后,含有val片段的属性
  • [attr|=”val”] : 为val或val-开头的属性

Read More

js数据类型

数据类型

  • 字符串对象和字符串

    • 字符串可隐式转化为字符串对象

      var a=new String('a');
      var b=new String('a');
      a==b;    //false,引用不同
      a===b;    //false,引用不同
      a=='a';    //true,内部转换
      a==='a';//false,值相同,类型不同
      String('a')==='a';//true,显式转换为字符串
    • 是不可变的,其方法是非破坏性的,不能改写其内容。

      var a='abc';
      a[0]='A';
      console.log(a);//结果仍是'abc';

Read More

js函数和闭包

作用域

函数作用域

  • 在函数中,无论变量、函数声明先后,都会在调用时优先选择

    块级作用域

  • js中不存在块级作用域,局部变量作用域并不会局限于块级

    {
        for(var i=0;i<10;i++){
            //...    
        }
        //这里i值为10
    }
  • 但let声明的变量可实现块级作用域

Read More

正则速查

正则表达式

  • 元字符

    • . [匹配除换行符以外的任意字符]
    • \w [匹配字母数字下划线或汉字]
    • \s [匹配任意空白符]
    • \b [匹配单词的开始或结束]
    • * [匹配0-n次连续出现的字符]
    • + [匹配1-n次连续出现的字符]
    • ? [匹配0-1次出现的字符]
    • ^ [匹配相反的字符]

    example:非(提取a标签内容)
            $reg='#<a[^>]*>([^<>]*)<\/a>#';
            $str="<a href='ssss'>some</a>other<a href='ddd'>some</a>";
            $res=preg_match_all($reg,$str,$m);

Read More

对数组元素打乱输出(不重复随机串)

回顾2014的一个笔试题

Q:对一个数组(如[1,2,3,4,5])的元素顺序打乱输出,到要求100次内不重复

我当时的思路是Math.random()随机打乱+闭包函数保存已随机过的数组键拼接字符串用于唯一判断
但回来想保存值序列不更好么,另查了大神的打乱数组方式,综合一下,和大家分享

A:

<script>
function random(a, b){
//用于打乱数组的排序函数
   return Math.random()>.5 ? -1 : 1;
}
//闭包函数
var uniqueArr=(function(uniqueStr){
       var arr=[];
       return function(uniqueStr){
           for(var i=0,len=arr.length;i<len;i++){
               if(arr[i]==uniqueStr){
                   return false;
               }
           }
           arr.push(uniqueStr);
           return arr;
       };
   })(null);
//打乱数组函数
function randomSort(arr){
   var res=arr.sort(random);//打乱的数组
   var keys=res.join('');//数组值串

   if(un=uniqueArr(keys)){//不重复
       //console.log(un,res);//测试用
       return res;
   }else{
       return randomSort(arr);
   }
}
//测试一下
var arr = [1, 2, 3, 4, 5];
randomSort(arr);
randomSort(arr);
randomSort(arr);
randomSort(arr);
randomSort(arr);
</script>

翻出来放这里,其实也是希望能够抛砖引玉,希望大家提点改进!

如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/02/28/random-element-of-array-js.html

html5拖拽2-chrome拖拽下载

  1. 接着上一文章,chrome中实现了文件的拖拽下载,和桌面互动的效果非常好。
    主要要求是在dataTransfer中设定文件的信息,信息需按以下格式:

    'MIMETYPE:文件名:文件URL'

    我们可以这样设置文件元素:

    <a id="mp3" 
        href="http://e.com/f.mp3" 
        draggable='true' 
        data-downloadurl="audio/mpeg:f.mp3:http://e.com/f.mp3">you can download this mp3 to desktop in chrome by drag
    </a>
  2. 接下来问题是获取自定义属性,即data-*,使用dataset(html5属性)

    var url=document.getElementById("mp3").dataset.downloadurl;
  3. 最后就是绑定数据了:

    document.getElementById("mp3").ondragstart=function(e){
                e.dataTransfer.setData('DownloadURL',e.target.dataset.downloadurl);
            };

    可以拖动下载到桌面了,记得是在chrome中啊。

如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/02/22/html5-drag-api2-chrome-drag-to-downloa.html

隐藏服务器信息

隐藏 Apache 版本信息

/etc/httpd/conf/httpd.conf(找不到可查看apache配置目录下的extra/httpd-default.conf,记得修改后引入此文件)

ServerTokens Prod
ServerSignature Off

隐藏 php 版本

php.ini

expose_php On
改成
expose_php Off

重启apache后,php版本和apache版本在http头中隐藏了。


详解 :
ServerTokens
用于控制服务器是否响应来自客户端的请求,向客户端输出服务器系统类型或内置模块等重要的系统信息。
在主配置文件中提供全局控制默认阀值为”Full”(ServerTokens Full),所以,如果你的Linux发行版本没有更改过这个阀值的话,所有与你的系统有关的敏感信息都会向全世界公开。比如RHEL会将该 阀值更改为”ServerTokens OS”,而Debian依然使用默认的”Full”阀值

 以apache-2.0.55为例,阀值可以设定为以下某项(后面为相对应的Banner Header):
Prod >>Server: Apache
Major >>Server: Apache/2
Minor >>Server: Apache/2.0
Minimal >>Server: Apache/2.0.55
OS >>Server: Apache/2.0.55 (Debian)
Full (or not specified) default >>Server: Apache/2.0.55 (Debian) php/5.1.2-1+b1 mod_ssl/2.0.55 OpenSSL/0.9.8b

ServerSignature
控制由系统生成的页面(错误信息,mod_proxy ftp directory listing等等)的页脚中如何显示信息。
可在全局设置文件中控制,或是通过.htaccess文件控制
默认为”off”(ServerSignature Off),有些Linux发行版本可能会打开这个阀门,比如Debian在默认的虚拟主机上默认将这个阀门设置为开放
全局阀门的阀值会被虚拟主机或目录单位的配置文件中的阀值所覆盖,所以,必须确保这样的事情不应该发生 .

参考自:http://www.path8.net/tn/archives/5074

如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/02/13/hide-lamp-server-info.html

php后台跳出框架集

在后台管理系统中,一般使用框架集来分隔显示管理页面,但是若检测到session过期需要跳出框架集时,php后台要怎么操作?

if(no_login()){
    exit("<script>top.location.href='login.php';</script>");
}

这里的top其实就是a标签的target=’_top’的对应。

补充

2015.7.28
无独有偶,今天又遇到了跳转没反应,这回是登陆跳转,怎么会,我也不信,先看代码!

<?php
if (!empty($_POST)) {
    header('location: https://newbmiao.github.io');
    exit;
}
?>


<form method='post' target='hiddenwin'>
    <table>
        <tr>
            <th>用户名</th>
            <td><input type='text' name='account' id='account'/></td>
        </tr>
        <tr>
            <th>密码</th>
            <td><input type='password' name='password'/></td>
        </tr>
        <tr>
            <th></th>
            <td>
                <button type='submit' id='submit'>登录</button>
            </td>
        </tr>
    </table>
</form>
<iframe frameborder='0' name='hiddenwin' id='hiddenwin' scrolling='no'></iframe>

看到没,form里的那个target,请求内容要呈现的目标容器指定,所以header请求的跳转是生效了,但是放到了,那个隐藏的iframe里,所以感觉没有跳转。坑爹的iframe伪装不刷新!

要解决,还是要用top或者parent去作为目标容器。


附target列表:

  • _blank 在新窗口中打开被链接文档。
  • _self 默认。在相同的框架中打开被链接文档。
  • _parent 在父框架集中打开被链接文档。
  • _top 在整个窗口中打开被链接文档。 framename 在指定的框架中打开被链接文档。
如有疑问,请文末留言交流或邮件:newbvirgil@gmail.com 本文链接 : https://newbmiao.github.io/2015/01/11/php-jump-out-of-the-frameset.html