头像

【原创】PHP做的网站顶部多出一块空白区域的解决方法

网站顶部多出一块空白区域,怎么找都没找到页面哪里有输出内容,在审查元素时发现以下特征:

QQ20150831112903

在BODY内容区域顶部出现&#65279。

其实出现这原因是由于页面文件BOM引起。

下面来讲解一下处理方法,以DreamWeaver 为例:

打开要修改的页面,点击菜单【修改】,选择第一项【页面属性】,在弹出的页面属性窗口中再选择【标题/编码】,取消【包括Unicode签名(BOM)(S)】勾选,再点击确定保存即可。

QQ20150831114231

刷新页面就能看到效果了。

转载请注明此出处:http://www.june-fj.com/?p=102 谢谢!!

 

头像

javascript cookie 读写操作

<script language=javascript>

//获得coolie 的值
function cookie(name){   
   var cookieArray=document.cookie.split("; "); //得到分割的cookie名值对   
   var cookie=new Object();   
   for (var i=0;i<cookieArray.length;i++){   
      var arr=cookieArray[i].split("=");       //将名和值分开   
      if(arr[0]==name)return unescape(arr[1]); //如果是指定的cookie,则返回它的值   
   }
   return "";
}
function delCookie(name)//删除cookie
{
   document.cookie = name+"=;expires="+(new Date(0)).toGMTString();
}
function getCookie(objName){//获取指定名称的cookie的值
    var arrStr = document.cookie.split("; ");
    for(var i = 0;i < arrStr.length;i ++){
        var temp = arrStr[i].split("=");
        if(temp[0] == objName) return unescape(temp[1]);
   }
}
function addCookie(objName,objValue,objHours){      //添加cookie
    var str = objName + "=" + escape(objValue);
    if(objHours > 0){                               //为时不设定过期时间,浏览器关闭时cookie自动消失
        var date = new Date();
        var ms = objHours*3600*1000;
        date.setTime(date.getTime() + ms);
        str += "; expires=" + date.toGMTString();
   }
   document.cookie = str;
}
function SetCookie(name,value)//两个参数,一个是cookie的名子,一个是值
{
    var Days = 30; //此 cookie 将被保存 30 天
    var exp = new Date();    //new Date("December 31, 9998");
    exp.setTime(exp.getTime() + Days*24*60*60*1000);
    document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
}
function getCookie(name)//取cookies函数       
{
    var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
     if(arr != null) return unescape(arr[2]); return null;
}
function delCookie(name)//删除cookie
{
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    var cval=getCookie(name);
    if(cval!=null) document.cookie= name + "="+cval+";expires="+exp.toGMTString();
}
</script>
头像

屏蔽防止别的网站嵌入框架代码

<SCRIPT LANGUAGE=javascript> 
if (top.location != self.location)top.location=self.location;
</SCRIPT>

说明:

top.location   是指当前页面所属的父页面的url
self.location 指的是当前页面的url

if (top.location != self.location)    父窗口url与当前url不一样 ,说明被嵌入

top.location=self.location;   把嵌入的窗体的url设成和本窗体一样
头像

2款Javascript脚本判断是否手机浏览器自动跳转WAP手机网站

随着移动设备的普及,企业的网络宣传已经不能局限在PC端,而需要同时在移动端有所建树。对于公司网站来说,以前都是做的PC端的,当然手机等移动端也可以访问,但是用户体验肯定不如完全适合的手机端来的方便。我们在给自己的网站做了WAP手机网站之后,如果有用户通过手机访问我们的企业顶级域名网站,那就判断跳转到专为的WAP网站。

第一种:直接JS脚本


<script type="text/javascript">
try {
var urlhash = window.location.hash;
if (!urlhash.match("fromapp"))
{
if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad)/i)))
{
window.location="http://www.19ze.com/wap/(更换成自己的WAP网站)";
}
}
}
catch(err)
{
}</script>

第二种,引用JS


function uaredirect(murl){
try {
if(document.getElementById("bdmark") != null){
return;
}
var urlhash = window.location.hash;
if (!urlhash.match("fromapp")){
if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iPad)/i))) {
location.replace(murl);
}
}
} catch(err){}
}

上述的脚本保持到mobile.js文件,然后在需要调用的页面引用下面2个JS调用文件。


<script src="mobile.js" type="text/javascript"></script>
<script type="text/javascript">uaredirect("http://www.19ze.com/wap/(更换成自己的WAP网站)");</script>

两种方法都已测试可用!

头像

SqlServer2005高效分页sql查询语句汇总

sqlserver2005不支持关键字limit ,所以它的分页sql查询语句将不能用mysql的方式进行,幸好sqlserver2005提供了top,rownumber等关键字,这样就能通过这几个关键字实现分页。

下面是本人在网上查阅到的几种查询脚本的写法:

几种sqlserver2005高效分页sql查询语句

top方案:

sql codeselect top 10 * from table1

where id not in(select top 开始的位置 id from table1)

max:

sql codeselect top 10 * from table1

where id>(select max(id)

from (select top 开始位置 id from table1order by id)tt)

row:

sql codeselect *

from (

select row_number()over(order by tempcolumn)temprownumber,*

from (select top 开始位置+10 tempcolumn=0,* from table1)t

)tt

where temprownumber>开始位置

3种分页方式,分别是max方案,top方案,row方案

效率:

第1:row

第2:max

第3:top

缺点:

max:必须用户编写复杂sql,不支持非唯一列排序

top:必须用户编写复杂sql,不支持复合主键

row:不支持sqlserver2000

测试数据:

共320万条数据,每页显示10条数据,分别测试了2万页、15万页和32万页。

页码,top方案,max方案,row方案

2万,60ms,46ms,33ms

15万,453ms,343ms,310ms

32万,953ms,720ms,686ms

是一种通过程序拼接sql语句的分页方案,

用户提过的sql语句不需要编写复杂的sql逻辑

诺用户提供sql如下

sql code

select * from table1

 

从第5条开始,查询5条,处理后sql变为

sql code

select *

from (

select row_number()over(order by tempcolumn)temprownumber,*

from (select top 10 tempcolumn=0,* from table1)t

)tt

where temprownumber>5

 

这是什么意思呢?分解一下

首先将用户输入的sql语句转稍稍修改

在select后添加top 开始位置+条数变成

再外加一列tempcolum,变成这样

sql code

select top 20 tempcolumn=0,* from clazz

嵌套一层,这样便可查询出行号

刚才那个列就是用来这里order by用的

(也不知道sqlserver的row_number函数为什么必须要order by)

sql code

select row_number()over(order by tempcolumn)temprownumber,*

from (修改过的查询)t

再套一层,过滤掉行号小于开始位置的行

sql code

select * from (第二层)tt

where temprownumber>10

头像

Asp.net 模板引擎 NVelocity 的基本用法

NVelocity是一个基于.NET的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象。从而使得界面设计人员与.NET程序开发人员基本分离。

一、nVelocity的常用功能简介

1、 在页面中定义变量,并进行简单的运算。

2、 在页面中获得对后台程序实体对象的引用。

3、 在页面中迭代实体对象集合。

4、 在页面中获得实体对象的属性,及其方法。

5、 对逻辑判断语句的支持。

6、 对外部文件的引用。

7、 对外部文件的解析。

二、nVelocity的工作原理

可以使用.NET的反射实现。以下是nVelocity对迭代实体类的简单实现步骤:

1、 定义People类,并拥有Name与Sex属性。表示一个人。

2、 在页面中列出人物列表,则输入以下代码:

#foreach($p in $ps)

<p>欢迎您:$p.Name</p>

#end

3、 获取人物列表,保存在_List中。并指定页面中的字符串“ps”对应_List。

4、以文本方式读取模板文件,并匹配#foreach…#end段,如果匹配到则继续匹配$X in $XX 段,分别记录用于保存集合与单项的字符,本次为“p”与“ps”。

5 、用Type对象的GetProperties()方法获取_list中每一项的所有属性,并在#foreach  #end段中循环将$p + 属性名称替换为当前对象的当前属性的值。当然如果要调用对象的方法也可以用同样的方式获得。

三、基本语法

1、特殊字符介绍

A、“#”:表示开始做什么事情。

B、“$”:表示用于获得什么。(以$开头的表示“引用”意思是取得一些东东.可引用变量,属性,方法)

C、“##“:单行注释。

D、 “#*… …*#”:多行注释。

2、关键字

A、 Set:开始做什么事情,比如定义变量,给变量重新赋值等。(注意:如果右边的操作数是一个属性或命令的引用而返回null,那么赋值将不会成功,且在随后的VTL中也不能再取出使用,如果要用做if条件,一个解决办法是,先给变量赋一个值,然后再将一个属性或命令的引用赋给该变量)

B、 Foreach:迭代语句

C、 If:条件判断语句

D、 Elseif

E、 Else

F、 Include:对外部文件的引用,开始位置为模板路径。

G、 Parse:对外部文件的引用,并用nVelocity方式解析。

H、 Macro:创建宏,可以重复做某件事,类似于方法。

I、  Even:双数执行

J、  Odd :单数执行

K、 Each:每次都执行

(备注:所有变量在未定义之前不能使用(因为我们习惯了有全局变量的习惯),一个合法的VTL标示符是以一个字母开头的。.NET后台定义的对象除外。模板语言区分大小写,所有的关键字必须为小写,默认情况下,NVelocity解析是不分大小写的,当然可以通过设置runtime.strict.math=true,采用严格解析模式。)

四、使用示例

1、  在页面中使用变量

定义变量:#set($a = “CNF”)

引用变量:欢迎光临:$a

定义变量:#set($a = 1)

运算:#set($a = $a + 1)

输出:$a   ##得:2

运算:#set($a = $a*5)

输出:$a   ##得:10

#set( $criteria = [“name”, “address”] )

#foreach( $criterion in $criteria )

#set( $result = false )  //先设置默认值

#set( $result = $query.criteria($criterion) )

#if( $result )

Query was successful

#end

#end

(备注:从以上可以看出nVelocity的替换顺序与.NET程序代码的执行基本一致,如果放在Foreach语句块中可以实现累加。并用If语句获得行号,对特殊行号的内容特殊处理。所有变量在未定义之前不能使用,.NET后台对象除外,最好采用正规引用格式,${a},正规引用格式一般用于在模板中直接调整字符串内容;静态引用输出:NVelocity遇到一个不能处理的引用时,一般他会直接输出这个引用$email的写法,页面上会看到的是$email,我们可以在$后面加上一个!号,那么就会输出空白.$!{email}如果不能处理会输出空白。如果email己定义了 (比如它的值是 foo),而这里你却想输出 $email. 这样一个字符串,就需要使用转义字符”\”,如:\$email)

2、  在页面中使用条件判断语句

#if ($p.StrSex == “女”)

#set($Sex = “女士”)

#elseif ($p.StrSex == “男”)

#set($Sex = “先生”)

#elseif ($p.StrSex == “无”)

#set($Sex = “人妖”)

#else

#set($Sex = “怪物”)

#end

(备注:可以嵌套在Foreach语句块中,用于对每个列表对象进行特殊显示处理。)

3、  创建宏,可以当做方法使用。

 

创建:#macro(Add $a $b)

#set($c = $a + $b)

<p>最后结果:$c</p>

#end

调用:#Add(1 2)

 

(备注:模板引擎的初始化方法有3种,一种参数为模板文件内容,一种是带模板文件地址。结果发现带模板文件内容的,在应用宏的时候好像有点问题。另外一个就是假如在宏里面加入一个判断语句,则可以实现递归调用。)

4、使用对象方法

定义变量:#set($str = “CNF”)

调用方法:$str.SubString(0,1)

输出:C

定义变量:#set($a = 123)

调用方法:$a.GetType()

输出:System.Int32

(备注:不管是.NET代码定义的对象,还是设计人员在页面中定义的变量,都可以使用对象的方法及属性,这一点非常强大。)

5、使用even与odd简化代码,each辅助

如上面所说用IF语句可以在列表中为每行创建不同的样式,但如果只需要区分单行与双行的话,可以使用even与odd简化代码。如下:

 

#foreach($p in $ps)

#even

<p>双行:$p.StrName</p>

#odd

<p>单行:$p.StrName</p>

#end

(备注:在使用这两个关键字时,出现了与创建宏一样的问题,即在初始化模板引引擎的时候,如果是用模板文件内容初始化的,会出现问题)

6、引用外部文件

Include与parse都有引入外部文件的作用,不同的是parse会根据nVelocity模板语言解析外部文件。也就是说如果引入当前模板,则会出现死循环。

#include 脚本元素让模板设计者可以在模板中引入一个本地文件, 这个被引入的文件将不会经过NVelocity的解析. 安全起见,可以引放的文件只是是配置参数TEMPLATE_ROOT所定义目录下的,默认为当前目录下.

#include( “head.html” )

如果需要引入多个文件,可以像下面这样.

#include( “one.gif”,”two.txt”,”three.htm” )

当然,还可用一个变量名来代替文件名引入.

#include( “greetings.txt”, $seasonalstock )

#parse 元素指示可以引入一个包含TVL的本地文件,这个文件将被NVeloict engine解析输出。

#parse( “me.vm” )

与 #include 指令不同, #parse 可以从引入的模板中得到变量引用.但#parse指令只能接受一个参数.VTL templates 被#parse 的模板中还可以再包含#parse声明,默认的深度为10,这是由配置参数directive.parse.max.depth在文件velocity.properties中决定的,你可以修改它以适合项目要求。

7、使用Foreach语句

上面多次列出Foreach语句,相信已经知道它的作用。即循环列出一组对象集合。比如:#foreach($p in $ps),其中$ps需要与后台代码中具体的实体类名称对应,$p代表$ps中的其中一项。上面已经提到过,即$p可以调用实体类的属性和方法。

(备注:#foreach 语句必须以#end结束,通过引用变量$velocityCount可以访问到NVelocity提供的计数器:)

8、创建数组

创建:#set($List = [“男”,”女”])

遍历:#foreach($Item in $List)

<p>List成员:$Item</p>

#end

输出:List成员:男

List成员:女

提供一个NVelocity 操作类VelocityHelper,方便大家使用(已包含NVelocity.dll):点击下载

VelocityHelper调用如下:

VelocityHelper vh = new VelocityHelper();

vh.Init(“~/template/”);    //模板路径

vh.Put(“templateVariable”, Variable);

vh.Display(“index.htm”);

附:NVelocity常用语法指令

对变量的引用:$ [ ! ][ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ][ } ]。

在NVelocity中,对变量的引用都是以$开头加上变量名称。当使用!时表示当此变量值为空时,显示空字符串。比如当$article为空,那会显示“$article“,而$!article会显示为“”。{}为变量名称限定,有时候变量名称后会有字符串,这是就需要用到{}了。比如$articleshow,想引用$article,这时只要修改为${article}就可以。其实,NVelocity对整个模板解析后都会变成这种模式。

对属性的引用:$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[a..z, A..Z ][ a..z, A-Z, 0..9, -, _ ]* [ } ] 。

例如$article.Title或者${article.Title}。

对方法的引用:$ [ { ][ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]* .[ a..z, A..Z ][ a..z, A..Z, 0..9, -, _ ]*( [ optional parameter list…  ] ) [  } ]。

例如:$article.GetListByTitle(‘nvelocity’)或${article.GetListByTitle(‘nvelocity’)}。其实对对象的属性值也可以用$article.get_Title()获得。

赋值指令#set:# [ { ] set [ } ]  ( $ref = [ “, ‘ ]arg[ “, ‘ ] )。

例如:$article.Title=’NVelocity’,$$article.Categories=[1,2,3],当然右侧也可以使用复杂的表达式:$article.Title=$otherArticle.Title.SubString(0,3),算术表达式:$article.Page=4/3等等。属性赋值也可以用$article.set_Title(‘NVelocity’)。

条件指令#if:# [ { ] if [ } ] ( [condition] ) [output] [ # [ { ] elseif [ } ] ( [condition] ) [output] ]* [ # [ { ] else [ } ] [output] ] # [ { ] end [ } ] 。

条件可以是返回bool的复查表达式。例如:#if($article.Total>1) $article.Title #else 没有数据 #end。

循环指令#foreach:# [ { ] foreach [ } ] ($refinarg)statement# [ { ] end [ } ]。

例如:#foreach($article in $articles) $article.Title #end。

引用静态资源指令#include:# [ { ] include [ } ] ( arg[ arg2 … argn] )。

例如:#include(‘tmp.js’),会把tmp.js文件内容插入当前流。当然可以使用表达式:#include($article.Url)。

引用并解析资源指令#parse:# [ { ] parse [ } ] ( arg )。

例如:#parse(‘tmp.js’),与#include不同是,假如tmp.js文件中有NVelocity的指令,变量会进行处理,并把结果插入到当前流。

停止指令#stop:# [ { ] stop [ } ] 。

当NVelocity解析到此指令时,会停止解析过程。一般用户调试。

计算指令#evaluate:# [ { ] evaluate [ } ] ( arg )。

例如:#evaluate(‘$article.Title’),会在当前输出$article.Title

NVelocity的$与Jquery的$发生冲突时的解决方法有以下几个: 
1、
使用jQuery.noConflict。 如:var j = jQuery.noConflict(); j.ajax();
缺点:当使用jQuery的相关插件时,会使得插件失效哦!
2、
使用jQuery代替$. 如:jQuery.ajax();
缺点:不适合扩展,一旦替换成第三方库时,那就麻烦大发
3、
wrap jQuery中的冲突方法。
如$.ajax()在Velocity中会冲突,则重新定义如下:
function dw(){}
dw.ajax=function(s){ jQuery.ajax(s); } dw.ajax();
4、
定义一个$JQ为$. 以后在js 中就可以用${JQ}AJAX了.
在前台这样写(定义):#set($JQ=”$.”)

头像

帝国CMS验证码不显示的解决方法

最近做一个站(www.fmfruit.cn),本地测试的好好的,验证码什么的都显示的非常正常,上传到服务器后,发现文章详细页面中评论的验证码显示不了。

在网上搜索出来的解决方案有如下几条:

1、修改一下评论表单,然后重新提交就可以了

  这个方法我确实第一次试了,管用,但是后面就不行了,具体是为什么我在后面会讲

2、空间不支持GD库,让服务商解决一下

3、去掉<?php后面的空格,和?>前面的空格

4、由编码引起的

5、由BOM头引起的

最后 想起我改过 config.php 数据库配置文件。

用NotePad++打开e/class/config.php页面,发现config.php页面并不是无BOM的UTF-8编码格式,而是带了BOM的,就是在我修改记事本时默认添加了BOM头,使用NotePad++将config.php将其转换成无BOM的文件然后上传,刷新一下,OK!验证码出来了!真是一个小BOM浪费了半天的时间。

头像

Asp.Net 在Server端如何使用非系统默认安装字体生成图片

在做一个小玩意,需要将文字写到图片,但文字字体可自定义,下面是示例代码:


Bitmap image = new Bitmap(width, height);

        Graphics g = Graphics.FromImage(image);        

        System.Drawing.Text.PrivateFontCollection pfc = new System.Drawing.Text.PrivateFontCollection();

        string fontpath = Server.MapPath("~/Cards/Font/华康娃娃体W5.TTF");//相对于虚拟目录的字体文件路径

        pfc.AddFontFile(fontpath);

        Font font = new System.Drawing.Font(pfc.Families[0], fontsize, FontStyle.Bold);   

        //Font font = new Font("华康娃娃体W5(P)", fontsize, FontStyle.Regular);        

        SolidBrush brush = new SolidBrush(color);

        g.Clear(Color.Transparent);

        StringFormat format = new StringFormat();

        g.DrawString(outputString, font, brush, 0, 0, format);

        System.IO.MemoryStream ms = new System.IO.MemoryStream();

        image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);


        Response.ClearContent();

        Response.ContentType = "image/png";  //image/gif

        Response.BinaryWrite(ms.ToArray());
头像

各种实现页面301跳转的程序代码

1、ASP下的301转向代码

<%@ Language=VBScript %>
<%
Response.Status=”301 Moved Permanently”
Response.AddHeader “Location”, “http://www.fmfruit.cn/articles/301/”
%>

2、ASP.Net下的301转向代码

<script runat=”server”>
private void Page_Load(object sender, System.EventArgs e)
{
Response.Status = “301 Moved Permanently”;
Response.AddHeader(”Location”,”http://www.19ze.com/articles/301/“);
}
</script>

3、PHP下的301转向代码

header(”HTTP/1.1 301 Moved Permanently”);
header(”Location: http://www.64hi.com/articles/301/”);
exit();

4、CGI Perl下的301转向代码

$q = new CGI;
print $q->redirect(”http://www.june-fj.com/”);

5、JSP下的301转向代码

<%
response.setStatus(301);
response.setHeader( “Location”, “http://www.1pkg.com/” );
response.setHeader( “Connection”, “close” );
%>