未来往事

MySQL子查询常见格式 晴

Rinald 本站原创 MySQL 2014/01/14 23:17
MySQL常见的几种子查询形式
mysql从4.1版开始支持子查询功能,在此版本前,可以用join写连表查询来进行替代,但不推荐这么写,相当的麻烦。mysql子查询的几种常见写法:
该句法可分为加关键词和不加关键词的写法,当不加关键词的时候,子查询语句返回的是一个离散值(注意是一个),查询语句将以子查询语句的结果作为自己 where子句的条件进行查询,该句法可以在子查询语句前加入any、all、some等关键字,此时子查询语句返回的是一组离散值。any则表示,查询语句是以子查询返回的值作为一个范围,在此值范围内进行查询,其与in关键字相像;all关键不太好了解,表示起全部匹配啥的。

该 句法相当的明了,就是查询语句的where子句是以子查询语句的结果作为其范围的,与上一种语法的any相似;

该语句的执行实质是:子查询语句的执行所得的结果与查询的结果集匹配,若能找到匹配的返回真,否则返回假,并且两边的结果集都是一组离散值;

该语句比较蹩脚,其执行是这样的:当子查询进行操作,有返回结果的时候,该语句才会执行,而且有多少个结果,语句就执行几次;

该句法,在平时用的比较少,而且并不好理解。其实是这么一回事,通过子查询执行的结果来构造一张新的表(这个表是一张衍生数据表,是一张虚拟的表),其用来作为主句的查询的对象,该句法功能非常强大,在一些复杂的查询中会经常用到。

子查询虽然挺方便,但其有不少缺点,其不支持limit,而且经实验证明其执行效率相当不理想,在一般的情况下,还是不推荐是用子查询。
本文介绍了PHP会话控制,主要阐述以下几点内容:
会话控制的产生背景/概念
cookie的维护与生命周期(有效时间)
session的维护与生命周期(回收机制)
cookie与session之间的区别与联系
问题1:禁用cookie后session为什么会失效?
问题2:IE浏览器下丢失session,每次刷新页面,都会生成新的sessionID(Firefox浏览器正常)
session、cookie简单实例

▶ 本文最后更新:2014-01-23(更新内容‘问题2’

● 理解会话控制的概念
理解一个概念就需要理解他的背景及产生的原因,这里引入WEB环境及其HTTP协议。会话控制产生的背景:
阅读过HTTP协议相关资料的同学都会知道HTTP协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议,所谓无状态,指的是不会维护http请求数据,http请求是独立的,不持久的。也就是说HTTP协议没有一个内建的机制来维护两个事务之间的状态或者说是关系吧。当一个用户在请求一个页面后再去请求另外一个页面时,HTTP将无法告诉我们这两个请求是否来自同一个用户。

由此我们就会觉得很奇怪了,平时我们在论坛逛帖子或电商网站购物时,只要我们在这个站点内,不论我们怎么跳转,从一个页面跑到另一个页面,网站总会记得我是谁,比如告诉你购买了哪些东西。这是怎么做到的呢,估计大家猜到了,这就是运用了HTTP会话控制。在网站中跟踪一个变量,通过对变量的跟踪,使多个请求事物之间建立联系,根据授权和用户身份显示不同的内容、不同页面。

PHP Session会话控制:
PHP的session会话是通过唯一的会话ID来驱动的,会话ID是一个加密的随机数字,由PHP生成,在会话的生命周期中都会保存在客户端。我们知道客户端(也就是浏览器)保存数据的地方只有cookie,所以PHP的会话ID一般保存在用户机器的cookie中。了解cookie后我们知道,浏览器是可以禁用cookie的,这样会话就会失效。所以PHP会话控制还有一种模式,就是在URL中传递会话ID。如果在浏览网站时我们稍加留心的话,有些URL中有一串看起来像随机数字的字符串,那么其实很有可能就是URL形式的会话控制。

讲到这里,有些人可能会有疑问了,客户端只是保存一个会话ID,那么会话控制中保存的会话变量比如你购物时买的物品列表等,它们是存放在哪个地方的呢?很显然,会话变量是在服务器端使用的,那么这些会话变量必定存放在服务器端。默认情况下,会话变量保存在服务器的普通文件中(也可以自己配置使用数据库来保存,可以Google一下),会话ID的作用就像是一把钥匙,在服务器端保存会话的文件中找到该会话ID对应的会话变量,比如购买物品的列表。

那么会话控制的整个过程可能就像这个样子,用户登录或者第一次浏览某个站点的页面时,该站点会生成一个PHP的会话ID并通过cookie发送到客户端(浏览器)。当用户点击该站点的另一个页面时,浏览器开始连接这个URL。在连接之前,浏览器会先搜索本地保存的cookie,如果在cookie中有任何与正在连接的URL相关的cookie,就将它提交到服务器。而刚好在登陆或第一次连接时,已经产生了一个与该网站URL相关的cookie(保存的会话ID),所以当用户再次连接这个站点时,站点就可以通过这个会话ID识别出用户,从服务器的会话文件中取出与这个会话ID相关的会话变量,从而保持事务之间的连续。


接下来我们了解下两个重要的概念:cookie和session
● 关于cookie的维护与生命周期
cookie是在服务器端被创建并写回到客户端浏览器,浏览器接到响应头中关于写cookie的指令则在本地临时文件夹中
创建了一个cookie文件,其中保存了你的cookie内容,cookie内容的存储是键值对的方式,键和值都只能是字符串。例如:
文件:Cookie:administrator@localhost/
内容格式:voteID100101localhost/15361167667230343893360385046430343691*

cookie的创建:
setcookie()函数设置cookie,函数原型如下
setcookie(name, value, expire, path, domain);
注释:cookie标题头必须在发送其他标题头之前发送,否则就无效(这是cookie的限制,而不是PHP的限制)。在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)。

cookie的维护:
cooke有四个标识符:cookie的name,domain,path,secure标记。要想在将来改变这个cookie的值,需要发送另一个具有相同cookie name,domain,path的Set-Cookie消息头,这将以一个新

的值来覆盖原来cookie的值。然而,如果仅仅只是改变这些选项的某一个也会创建一个完全不同的cookie,如只是更改了name值。

cookie失效时间:
可以设置过期时间,如果不设置则是会话级别的,即关闭浏览器就会消失。当cookie创建时包含了失效日期,这个失效日期则关联了以name-domain-path-secure为标识的cookie。要改变一个cookie的失效日期,你必须指定同样的组合。当改变一个cookie的值时,你不必每次都设置失效日期,因为它不是cookie标识信息的组成部分。例如:
在cookie上的失效日期并没有改变,因为cookie的标识符是相同的。实际上,只有你手工的改变cookie的失效日期,否则其失效日期不会改变。这意味着在同一个会话中,一个会话cookie可以变成一个持久化cookie(一个可以在多个会话中存在的),反之则不可。为了要将一个持久化cookie变为一个会话cookie,你必须删除这个持久化cookie,这只要设置它的失效日期为过去某个时间之后再创建一个同名的会话cookie就可以实现。

需要记得的是失效日期是以浏览器运行的电脑上的系统时间为基准进行核实的。没有任何办法来来验证这个系统时间是否和服务器的时间同步,所以当服务器时间和浏览器所处系统时间存在差异时这样的设置会出现错误。

cookie自动删除:
cookie会被浏览器自动删除,通常存在以下几种原因:
会话cooke(Session cookie)在会话结束时(浏览器关闭)会被删除
持久化cookie(Persistent cookie)在到达失效日期时会被删除,如:
如果浏览器中的cookie限制到达,那么cookies会被删除以为新建cookies创建空间。

● 关于session的维护与生命周期
+阅读全文

如何面对生活 晴

Rinald 九九文章网 随笔/分享 2013/12/25 12:48
  人活在这个世上,不可能都是一帆风顺的,有时遇到困难,有时遇到挫折,有时遇到变故,有时遇到不顺心的人和事,这些都是人生前进中的正常现象。但是,有的人遇到这些现象时,心烦意乱,痛苦不堪,悲观失望,甚至失去面对生活的勇气。
  
  当你遇到不顺时,它会让你的头脑更加理性,让你面对不顺时,不是悲观失望,而是反思自己的做事方法,做人原则,让你有则改之,无则加勉,更上一层楼。
  
  如果没有人陪,学着一个人听音乐看书写字。这是个好习惯。
  
  不要对人随便发脾气。
  
  如果一个人怠慢你,请你离开他。不懂得珍惜你的人不要为之不舍,更不必继续付出你的友情,爱情。
  
  如果可以不抽烟,别抽。如果可以不喝酒,别喝。
  
  再郁闷也不要去泡酒吧。一个孤独的人手握高脚杯和抽烟,会更添寂寞感和忧伤。
  
  闲下来的时候,放一段柔情音乐,翻阅几页好书,然后睡个懒觉,快哉。心情不好的时候也可以睡一觉。
  
  从现在开始,聪明一点,不要问别人想不想你?爱不爱你?若是要想你,爱你自然会对你说,但是从你的嘴里说出来,别人会很骄傲和不在乎你。
  
  有固定的消遣场所,比如固定的咖啡馆,书店。让那个人地方的服务生认识你,这样,你会在孤单时有个温暖的去处。
  
  不要为了任何人任何事折磨自己。比如不吃饭,哭泣,自闭,抑郁,这些都是傻瓜做的事。当然,偶然傻一下有必要,人生不必时时聪明。
  
  任何情况下,背后不说他人是非。如果一定要说,说好话。
  
  一定要有几个异性朋友,没有非份之想。就是关键时候,帮你出出主意。
  
  学会承受痛苦,有些话适合烂在心里,有些痛苦,适合无声无息的忘记。当经历过,你长大了,自己知道就好。很多改变,不需要你说,别人会看得到。
版本:PHP4, PHP5
string implode ( string $glue , array $pieces )
string implode ( array $pieces )
implode() 函数将一个一维数组元素合为一个字符串,并返回该字符串。其内容为由 glue 分割开的数组的值。

参数说明:
glue:默认为空的字符串
pieces:你想要转换的数组
备注:4.3.0开始glue 变为可选参数。

范例:

输入内容过滤 PHP 不指定

Rinald 本站原创 PHP 2013/12/01 22:36
PHP内容过滤方法,过滤没用的信息比较严格,有用的可能也输入不进去,可以从网上找找其他的过滤方法:
iframe高度随页面内容自适应高度,当页面高度变动时iframe高度也自动变化
浏览器兼容:IE6++、Firefox全系列、Chrome全系列、(其他版本浏览器未做测试,期待你测试评论反馈以完善本文,谢谢)

同域环境下实现方法:
方法一:仅修改iframe父页面(iframeA.php),iframe子页面内容(iframeB.php)不用添加其他js或额外代码
iframe父页面(iframeA.php)添加代码如下:
<iframe width="100%" height="0" id="frame_content" src="http://fity.cn/iframeB.php" scrolling="no" frameborder="0" onload="this.height=this.contentWindow.document.documentElement.scrollHeight"></iframe>

<script type="text/javascript">
function reinitIframe(){
var iframe = document.getElementById("frame_content");
try{
var bHeight = iframe.contentWindow.document.body.scrollHeight;
var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;
var height = Math.max(bHeight, dHeight);
iframe.height =  height;
}catch (ex){}
}
window.setInterval("reinitIframe()", 200);
</script>

方法二:修改iframe子页面内容(iframeB.php),iframe父页面(iframeA.php)不需要加入js代码
iframe父页面(iframeA.php)添加代码如下:
<IFRAME border=0 marginWidth=0 frameSpacing=0 marginHeight=0 src="http://fity.cn/iframeB.php" frameBorder=0 noResize scrolling="no" width=100% height=100% vspale="0" id="childFrame" ></IFRAME>
iframe子页面(iframeB.php)代码范例如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn">
<head>
<script language="javascript" type="text/javascript">
function IFrameResize(){
//alert(this.document.body.scrollHeight); //弹出当前页面的高度
var obj = parent.document.getElementById("childFrame"); //取得父页面IFrame对象
//alert(obj.height); //弹出父页面中IFrame中设置的高度
obj.height = this.document.body.scrollHeight; //调整父页面中IFrame的高度为此页面的高度
}
window.setInterval("IFrameResize()", 200);//这里的时间可以设置短一些,时间越短高度变动时抖动越不明显
</script>
</head>
<body onload="IFrameResize()">
<div id='main' style='background:#FFF;width:100%;'>
测试数据
<br/>
测试数据
<br/>
测试数据
<br/>
http://fity.cn
</div>
</div>
</body>
</html>
注意:这里需要定义body onload属性


跨域环境下实现方法:
iframe若是跨域,不能直接用JS来控制,只能通过一个中间代理,我们这里选择在iframe的子页面(iframeB.php)中加一个与iframe父页面(iframeA.php)同域的页面(iframeC.php);这样页面iframeC.php就能和父页面iframeA.php进行无障碍的通讯了;因为子页面iframeB.php页面嵌入iframeC.php,所以页面iframeB.php可以改写页面iframeC.php的href值,这里给出一个例子,假设域名对应文件如下:
引用
iframeA.php  位于http://fity.cn域上
iframeB.php   位于http://www.household114.com域上
iframeC.php  位于http://fity.cn域上

实现方式:
+阅读全文

discuz楼层错乱一楼不显示处理 不指定

Rinald 本站原创 Discuz 2013/11/30 23:52
discuz楼层错乱1楼主题内容不显示问题解决

任何数据库应用都存在分页性能问题,mysql的性能问题似乎更大些。Discuz7.2(以下简称dz7.2)和Discuz X2(简称X2)的抢楼机制基本相同,抢楼与普通帖子(盖楼)是不同的处理机制。到了Discuz X2.5(简称X2.5)就把抢楼与盖楼机制统一。
引用来源:X2.5的新程序架构

由以上信息可以看出Discuz!X2.0及更早版本与Discuz!X2.5对抢楼及盖楼的机制并不相同、数据结构也相应的存在差距。为了解决这一问题,我们同时首先需要了解下discuz数据表以下几个常见字段:
tid:主题id
pid:帖子id
position:显示位置
first:是否是首贴


Discuz!X2.0及更早版本主题抢楼盖楼数据表:
forum_post 帖子表
forum_postposition帖子排楼顺序表,用来存储论坛帖子的排序,该表采用 (tid, position) 两个字段联合做自增主键,在高并发情况下,效率自然不高。(题外话,补充一点:该表不宜修改为InnoDB,建议新增了一列自增ID做主键,该主键和业务完全没有任何关系,仅用做自增主键。)
forum_postposition表的存储内容格式:
点击在新窗口中浏览此图片
在抢楼帖中假设forum_post表中first字段为1且该帖pid与forum_postposition表中pid相等且forum_postposition表中position字段为1对应则为1楼。


Discuz!X2.5及更高版本主题抢楼盖楼数据表:
forum_postpositin帖子排楼顺序表:取消了forum_postpositin表,在 post主表中增加 position 字段保存每个帖子的楼号。
forum_post 帖子表中多了一个position字段,如图:
点击在新窗口中浏览此图片
至此,你应该知道如何解决或处理该问题了。该问题在Discuz!X2.5及更高版本中很少遇见或几乎不会遇见,原因上述内容已经提到。

扩展阅读

先不分析X2.5固定楼号的利弊,就谈谈从dz7.2到X2.5对楼层处理机制以及变化的优缺点。
dz7.2用 postposition表来实现抢楼楼号排序,顺便也实现了对高楼层分页性能优化;X2 postpositon表只用来抢楼,对于高楼层主题分页优化没看到相关处理;X2.5对post主表添加楼号字段来让所有帖子的楼号固定,从而解决分页性能问题,也一并解决了抢楼问题。

从抢楼为主,附加高楼层分页到所有楼层分页为主,附带实现了抢楼,这个变化说明随着discuz功能增加对于分页性能的需求也变大,另外一个显示原因是那些长期使用discuz系统的大站数据也越来越大,大于1000万帖子的不是少数,他们对分页性能提高的需求更迫切。

看似Discuz!X2.5及更高版本的处理方式更好,但或许是因为缺乏DBA的支持,Discuz因为mysql的弱智低能带来的称重包袱而导致开发正走向歧路,具体可以参阅Discuz上这篇帖子《从Discuz7.2/X2盖楼机制到DiscuzX2.5盖楼抢楼合一分析Discuz!X的mysql技术包袱》


高级CSS样式选择器 不指定

Rinald 本站原创 WEB前端 2013/11/12 16:56
CSS选择器,CSS样式选择器,CSS选择器详解,高级CSS选择器,高级CSS选择器参考手册,CSS选择器参考指南

我们知道CSS 2 开始引入了属性选择器。属性选择器可以根据元素的属性及属性值来选择元素。简单的说即在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。本文主要描述CSS样式表中选择器的一些用法,当然你可能已经对CSS样式选择器不在生疏,但是通过本文你将能更好的掌握CSS样式的一些高级选择器使用。

CSS是对网页设计师可用的最强大的工具之一,你也许已经掌握了id、class、后台选择器这些基本的css选择器。但这远远不是css的全部。本文向大家介绍一些常见的高级CSS样式选择器,包括我们最头痛的浏览器兼容性问题。掌握了它们,才能真正领略css的巨大灵活性。

在深入研究高级CSS选择器之前,理解CSS优先级是如何工作很重要,这样我们就知道如何适当的使用我们的选择器并避免浪费大量的时间来调试一些只要我们注意到优先级的话就很容易被搞定的问题。当我们写CSS的时候我们必须注意有些选择器在级联(cascade)上会高于其它选择器,我们写在最后面的选择器将不一定会覆盖前面我们写在同一个元素的样式。选择器的优先级别规则:一般而言,选择器越特殊,它的优先级越高。也就是选择器指向的越准确,它的优先级就越高。通常我们用1表示标签名选择器的优先级,用10表示类选择器的优先级,用100标示ID选择器的优先级。在本文中也会在相关选择器中进行标注。

一、基本选择器(兼容浏览器:IE6+、Firefox、Chrome、Safari、Opera)
*  通用元素选择器,匹配任何元素,在页面上的每一个元素上起作用
h4  标签选择器,匹配所有使用h4标签的元素.优先级仅仅比*高
.textbox  class(类)选择器,匹配所有class属性中包含textbox的元素,class选择器与id选择器的不同是class选择器能作用于期望样式化的一组元素
#mainWrapper  id选择器,匹配所有id属性等于mainWrapper的元素。id是我们最常用的css选择器之一。id选择器的优势是精准,高优先级(优先级基数为100,远高于class的10),作为javascript脚本钩子的不二选择,同样缺点也很明显优先级过高,重用性差,所以在使用id选择器前,我们最好问下自己,真的到了非用id选择器的地步?
例如:


二、多元素的组合选择器/扩展选择器(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
E,F  多元素选择器/群组选择器,同时匹配所有E元素或F元素,E和F之间用逗号分隔,如div,span,img{}(值得注意的是兼容IE6+)
E F  后代元素选择器--这也是我们最常用的一种选择器。要留意的点是,这种方式的选择器将选取其下所有匹配的子元素,无视层级,所以有的情况是不宜使用的。匹配所有属于E元素后代的F元素,E和F之间用空格分隔(值得注意的是兼容IE6+)
E > F  子元素选择器,匹配所有E元素的子元素F,与后代选择器E F不同的是,子选择器只对E下的直接子级F起作用
E + F  毗邻元素选择器,匹配所有紧随E元素之后的同级元素F(只匹配第一个元素)
例如:


三、属性选择器(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
属性选择器(Attribute selector)让你可以基于属性来定位一个元素。你可以只指定该元素的某个属性,这样所有使用该属性——而不管它的值——的这个元素都将被定位,也可以更加明确并定位在这些属性上使用特定值的元素 —— 这就是属性选择器展示它们的威力的地方。

CSS 2.1 属性选择器 (注意:由于博客程序问题,value值需要有双引号,下同)
E[att]  匹配所有具有att属性的E元素,不考虑它的值。(注意:E元素在此处可以省略,比如 [cheacked] 。以下同);
E[att=value]  匹配所有att属性等于 value 的E元素,即:该属性有指定的确切的值;
E[att~=value]  匹配所有att属性具有多个空格分隔的值、其中一个值等于 value 的E元素,即:该属性的值必须是一系列用空格隔开的多个值,(比如,class= title featured home ),而且这些值中的一个必须是指定的值 value ;
E[att|=value]   匹配所有att属性具有多个连字号分隔(hyphen-separated)的值、属性的值就是 value 或者以 value 开始并立即跟上一个 - 字符,也就是 value- 。(比如lang= zh-cn );

CSS 3 属性选择器
E[att^= value ]  属性att的值以 value 开头的元素,即:该属性的值以指定值开始。
E[att$= value ]  属性att的值以 value 结尾的元素,即:该属性的值包含指定的值(而无论其位置)
E[att*= value ]  属性att的值包含 value 字符串的元素,即:该属性的值以指定的值结束。
例如:


四、 CSS 2.1中的伪类(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
E:first-child   匹配父元素的第一个子元素。
E:link  匹配所有未被点击的链接标签。
E:visited  匹配所有已被点击的链接标签。
E:active  匹配鼠标已经其上按下、还没有释放的E元素
E:hover  匹配鼠标悬停其上的E元素,即:当鼠标划过时E元素的样式。需要注意的是,在IE6中:hover只能用于链接元素。
E:focus  匹配获得当前焦点的E元素--最常用于表单元素
E:lang(c)  匹配lang属性等于c的E元素
例如:


五、CSS 2.1中的伪元素/伪对象 [兼容性:IE6、IE7与IE8(怪异模式Quirks mode)不支持此伪元素,兼容浏览器IE9+、Firefox、Chrome、Safari、Opera]
E::first-line  匹配E元素的第一行
E::first-letter  匹配E元素的第一个字母
E::before  在E元素之前插入生成的内容
E::after  在E元素之后插入生成的内容
例如:


六、CSS 3的同级元素通用选择器(兼容浏览器:IE7+、Firefox、Chrome、Safari、Opera)
E ~ F 相邻选择器,与前面提到的E+F不同的是,E~F匹配与E相同级别的所有F元素,而E+F只匹配第一个。
例如:


七、CSS 3中与用户界面有关的伪类(兼容浏览器:IE9+、Firefox、Chrome、Safari)
E:enabled   匹配表单中激活的元素(比如,文本输入框)和 checked 或unchecked 状态(radio单选按钮和checkbox复选框)
E:disabled  匹配表单中禁用的元素(同上)
E:checked  匹配处于选定状态的界面元素(同上)
E::selection   定义用户鼠标已选择内容的样式
例如:


八、CSS 3中的结构性伪类(兼容浏览器:IE9+、Firefox、Chrome、Safari)
E:root   匹配文档的根元素,对于HTML文档,就是HTML元素
E:nth-child(n)  匹配其父元素的第n个子元素,第一个编号为1
E:nth-last-child(n)   匹配其父元素的倒数第n个子元素,第一个编号为1
E:nth-of-type(n)   与:nth-child()作用类似,不同的是它匹配的不是某个序列元素,而是元素类型
E:nth-last-of-type(n)  与:nth-last-child() 作用类似,但是仅匹配使用同种标签的元素
E:last-child  匹配父元素的最后一个子元素,等同于:nth-last-child(1)
E:first-of-type  匹配父元素下使用同种标签的第一个子元素,等同于:nth-of-type(1)
E:last-of-type   匹配父元素下使用同种标签的最后一个子元素,等同于:nth-last-of-type(1)
E:only-child  匹配父元素下仅有的一个子元素,等同于:first-child:last-child或 :nth-child(1):nth-last-child(1),这个伪类用的比较少
E:only-of-type  匹配父元素下使用同种标签的唯一一个子元素,等同于:first-of-type:last-of-type或 :nth-of-type(1):nth-last-of-type(1)
E:empty  匹配一个不包含任何子元素的元素,注意,文本节点也被看作子元素
例如:


九、CSS 3的反选伪类/否定伪类选择器(兼容浏览器:IE9+、Firefox、Chrome、Safari)
E:not(value)   否定伪类选择器用来在匹配元素时排除某些元素,匹配不符合当前选择器的任何元素
例如:


十、CSS 3中的 :target 伪类(不支持IE全系列)
E:target  匹配文档中特定 id 点击后的效果
例如:


扩展阅读:
1、如何写出简洁、高效的CSS?
• 不要在ID选择器前使用标签名
  一般写法:DIV#divBox
  更好写法:#divBox
  解释: 因为ID选择器是唯一的,加上div反而增加不必要的匹配。
• 不要再class选择器前使用标签名
  一般写法:span.red
  更好写法:.red
  解释:同第一条,但如果你定义了多个.red,而且在不同的元素下是样式不一样,则不能去掉
• 尽量少使用层级关系
  一般写法:#divBox p .red{color:red;}
  更好写法:.red{..}
• 使用class代替层级关系
  一般写法:#divBox ul li a{display:block;}
  更好写法:.block{display:block;}

2、样式表中定义CSS兼容IE6、IE7、FF


PS:另一点,我们在使用javascript类库的选择器时,例如jquery,要尽可能的使用这些原生的css3选择器,因为类库的选择器引擎会通过浏览器内置解析它们,这样会获得更快的速度。

CSS3选择器W3C参考手册:
http://www.w3school.com.cn/cssref/css_selectors.asp
DiscuzX游客查看帖子提示没有找到帖子解决方法
兼容版本:X2/X2.5/X3/X3.1
故障描述:常见为从X2/2.5升级到X3新版本后遇到该错误

排查思路:
1、检查后台相关权限配置是否允许游客查看帖子(或数据表中的记录是否也正常)
2、关闭所有的插件、关闭伪静态后测试
3、后台->站长->数据库->升级、优化、校验,根据结果对相关数据表进行处理
4、重新升级帖子表(如果pre_forum_post和pre_forum_post_bak同时存在,将forum_post_bak命名为fourm_post重新升级)
5、检查程序文件table_forum_post/forum_viewthread.php
启用Gzip压缩后访问文章页面报如下错误信息:
引用
内容编码错误
您尝试查看的页面无法显示,因为它使用了无效的或者不支持的压缩格式

排查思路:
1.后台关闭所有的插件,然后测试
2.模板切换到默认模板,然后测试
经排查未来往事博客在启用Gzip压缩后遇到这个错误是由于插件addcopyright下entrycontentend.php文件引起的,经分析该文件引起该错误的原因为该文件在php结束符后存在几行空白行,删除后恢复正常!

关于Nginx启用Gzip模块可以参考本博这篇文章《Nginx启用Gzip压缩模块

Nginx启用Gzip压缩模块 不指定

Rinald 本站原创 Apache/Nginx 2013/11/07 18:05
Nginx的gzip模块是内置的,在http中添加如下配置
gzip on;
gzip_min_length  5k;
gzip_buffers     4 16k;
gzip_http_version 1.0;
gzip_comp_level 3;
gzip_types       text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary on;

注  释:
gzip on|off
# 默认值: gzip off
# 开启或者关闭gzip模块

gzip_static on|off
# nginx对于静态文件的处理模块
# 该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。该模块启用后,nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。为了要兼容不支持gzip的浏览器,启用gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件。
# 可以google"nginx gzip_static"了解更多

gzip_comp_level 4
# 默认值:1(建议选择为4)
# gzip压缩比/压缩级别,压缩级别 1-9,级别越高压缩率越大,当然压缩时间也就越长(传输快但比较消耗cpu)。

gzip_buffers 4 16k
# 默认值: gzip_buffers 4 4k/8k
# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
# 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。

gzip_types mime-type [mime-type ...]
# 默认值: gzip_types text/html (默认不对js/css文件进行压缩)
# 压缩类型,匹配MIME类型进行压缩
# 不能用通配符 text/*
# (无论是否指定)text/html默认已经压缩
# 设置哪压缩种文本文件可参考 conf/mime.types
+阅读全文
配置Nginx支持ThinkPHP PATHINFO URL_MODEL=1模式

Nginx默认是不支持PATHINFO的,也就是说不支持ThinkPHP设置URL_MODEL=1的情况,这时候简单的方法,让Nginx迅速搭建TP的方法是,设置URL_MODEL=3,即兼容模式。但是要让Nginx支持ThinkPHP PATHINFO需要做如下配置:

1、设置ThinkPHP URL模式 URL_MODEL=1;
2、修改Nginx配置文件
location / {
   if (!-e $request_filename) {
   rewrite  ^(.*)$  /index.php?s=$1  last;
   break;
  }
}

上面的设置Nginx的伪静态方法, 其实内部是转发到了ThinkPHP提供的兼容模式的URL,利用这种方式,可以解决不支持PATHINFO的WEB服务器环境。
此处需要注意的是,如果你的ThinkPHP是安装在二级目录,Nginx的伪静态方法设置如下,其中youdomain是所在的目录名称

location /youdomain/ {
    if (!-e $request_filename){
      rewrite  ^/youdomain/(.*)$  /youdomain/index.php?s=$1  last;
    }
  }

再添加如下配置
location ~ .+.php($|/) {
      set $script $uri;
      set $path_info "/";
      if ($uri ~ "^(.+.php)(/.+)") {
          set $script $1;
          set $path_info $2;
      }
      include fastcgi_params;
      fastcgi_param PATH_INFO $path_info;
      fastcgi_index index.php?IF_REWRITE=1;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_param SCRIPT_FILENAME $document_root/$script;
      fastcgi_param SCRIPT_NAME $script;
  }
3、重新加载Nginx配置文件或重启Nginx服务让配置生效。

GPT与MBR分区表格式类型转换 不指定

Rinald 本站原创 PC知识 2013/10/30 16:34
本文讨论:
MBR GPT ESP MSR 概念作用及区别
GPT与MBR分区表格式类型转换

首先,我们来理解下几个概念?MBR、GPT、ESP、MSR 都是些什么?都有些什么区别?

分区表格式类型:MBR  GPT 区别 ?
▷ MBR分区表:Master Boot Record,即硬盘主引导记录分区表,只支持容量在 2.1TB 以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只支持4个主分区或三个主分区和一个扩展分区,扩展分区下可以有多个逻辑分区。
▷ GPT分区表:GPT,全局唯一标识分区表(GUID Partition Table),与MBR最大4个分区表项的限制相比,GPT对分区数量没有限制,但Windows最大仅支持128个GPT分区,GPT可管理硬盘大小达到了18EB。只有基于UEFI平台的主板才支持GPT分区引导启动。
补充:不幸的是GPT分区表格式类型在Windows系统激活方面会给我们带来一些麻烦(当然 未来往事 建议你使用正版系统)。

分区类型:ESP  MSR区别 ?
▷ ESP分区:EFI system partition,该分区用于采用了EFI BIOS的电脑系统,用来启动操作系统。分区内存放引导管理程序、驱动程序、系统维护工具等。如果电脑采用了EFI系统,或当前磁盘用于在EFI平台上启动操作系统,则应建议ESP分区。UEFI 系统分区 (ESP) ,简单的说 ESP 是 EFI 的启动分区,在 EFI 启动的机器上是必须的,你可以理解为就是普通分区,就是我们常用的分区格式。
▷ MSR分区:即 Microsoft 保留 (MSR) 分区,是GPT磁盘上用于保留空间以备用的分区,例如在将磁盘转换为动态磁盘时需要使用这些分区空间。是每个 GUID 分区表 (GPI) 磁盘都要求的分区。系统组件可以将 MSR 分区的部分分配到新的分区以供它们使用。例如,将基本 GPT 磁盘转换为动态磁盘后,系统分配的 MSR 分区将被用作“逻辑磁盘管理器”(LDM) 元数据分区。MSR 分区的大小会因 GPT 磁盘的大小不同而发生变化。对于小于 16 GB 的磁盘,MSR 分区为 32 MB。对于大于 16 GB 的磁盘,MSR 分区为 128 MB。MSR 分区在“磁盘管理”中不可见,用户也无法在 MSR 分区上存储或删除数据。

废话不多说了,接下来进入本文的正题,GPT与MBR分区表格式类型转换
(这里我们需要准备一个可启动的WinPe U盘,本例中 未来往事 准备的是老毛桃WinPe U盘)
1、进入BIOS修改第一启动项为U盘
2、修改完成后,把做好的WinPe U盘插到机器上
3、接下来进入WinPe系统,然后对磁盘进行如下操作:
删除当前磁盘所有已有分区:
  A.打开DG(DiskGenius)删除所有的分区
  注意:此时不要点击保存更改,否则你会收到如下错误:“保存分区表时出现错误。(00000001)函数不正确
  B.将硬盘分区表类型由GPT转换为MBR格式(硬盘--转换分区表类型为MBR格式)
重新分区:

不过,值得补充的是 UEFI 模式加 GPT 分区表格式类型安装 Windows 8 / Windows Server 2008 R2 是大势所趋!

ASUS S200E Win8系统改为Win7系统 不指定

Rinald 本站原创 PC知识 2013/10/30 08:27
本文讨论:
MBR GPT ESP MSR 概念作用及区别
GPT与MBR分区表格式类型转换
ASUS S200E Win8系统改为Win7系统

首先,我们来理解下几个概念?MBR、GPT、ESP、MSR 都是些什么?都有些什么区别?

分区表格式类型:MBR  GPT 区别 ?
▷ MBR分区表:Master Boot Record,即硬盘主引导记录分区表,只支持容量在 2.1TB 以下的硬盘,超过2.1TB的硬盘只能管理2.1TB,最多只支持4个主分区或三个主分区和一个扩展分区,扩展分区下可以有多个逻辑分区。
▷ GPT分区表:GPT,全局唯一标识分区表(GUID Partition Table),与MBR最大4个分区表项的限制相比,GPT对分区数量没有限制,但Windows最大仅支持128个GPT分区,GPT可管理硬盘大小达到了18EB。只有基于UEFI平台的主板才支持GPT分区引导启动。
补充:不幸的是GPT分区表格式类型在Windows系统激活方面会给我们带来一些麻烦(当然 未来往事 建议你使用正版系统)。

分区类型:ESP  MSR区别 ?
▷ ESP分区:EFI system partition,该分区用于采用了EFI BIOS的电脑系统,用来启动操作系统。分区内存放引导管理程序、驱动程序、系统维护工具等。如果电脑采用了EFI系统,或当前磁盘用于在EFI平台上启动操作系统,则应建议ESP分区。UEFI 系统分区 (ESP) ,简单的说 ESP 是 EFI 的启动分区,在 EFI 启动的机器上是必须的,你可以理解为就是普通分区,就是我们常用的分区格式。
▷ MSR分区:即 Microsoft 保留 (MSR) 分区,是GPT磁盘上用于保留空间以备用的分区,例如在将磁盘转换为动态磁盘时需要使用这些分区空间。是每个 GUID 分区表 (GPI) 磁盘都要求的分区。系统组件可以将 MSR 分区的部分分配到新的分区以供它们使用。例如,将基本 GPT 磁盘转换为动态磁盘后,系统分配的 MSR 分区将被用作“逻辑磁盘管理器”(LDM) 元数据分区。MSR 分区的大小会因 GPT 磁盘的大小不同而发生变化。对于小于 16 GB 的磁盘,MSR 分区为 32 MB。对于大于 16 GB 的磁盘,MSR 分区为 128 MB。MSR 分区在“磁盘管理”中不可见,用户也无法在 MSR 分区上存储或删除数据。

废话不多说了,接下来进入本文的正题,ASUS S200E Win8系统改为Win7系统
(这里我们需要准备一个可启动的WinPe U盘,本例中 未来往事 准备的是老毛桃WinPe U盘)
1、进入BIOS修改以下信息(在出现ASUS(华硕)图标界面时按DEL进入BIOS):
+阅读全文

select分组与默认选择项 不指定

Rinald 本站原创 PHP 2013/10/25 17:57
select分组与默认选择实现方式 php

第13页 / 共35页 第一页 « 上一页 8 9 10 11 12 13 14 15 16 17 下一页 » 最后页 [ 显示模式: 摘要 | 列表 ]