2006年02月09日
前些时间写了几篇关于XMLHTTP运用的实例.
(可以到http://dev.csdn.net/user/wanghr100看之前的几编关于XMLHTTP的介绍.)

近来看论坛上经常有人提问关于如何无刷新,自动更新数据.
传统上,我们浏览网页,如果加入最新的数据.只能是等我们重新向服务器端请求时才能显示出来.
但是,对于一些时效性很强的网站.传统的这种做法是不能满足的.

我们可以让程序自动刷新.定时向服务器请求数据.5秒取一次数据,10秒取一次数据.
利用XMLHTTP发出请求并取得数据.传到客户端,客户端重新组织并显示数据.

demo.htm 前台显示.

<script language="JavaScript">
function GetResult()
{
/*
*————— GetResult() —————–
* GetResult()
* 功能:通过XMLHTTP发送请求,返回结果.
* 参数:str,字符串,发送条件.
* 实例:GetResult();
* author:wanghr100(灰豆宝宝.net)
* update:2004-5-27 19:02
*————— GetResult() —————–
*/
var oBao = new ActiveXObject("Microsoft.XMLHTTP");
//特殊字符:+,%,&,=,?等的传输解决办法.字符串先用escape编码的.
//Update:2004-6-1 12:22
oBao.open("POST","Server.asp",false);
oBao.send();
//服务器端处理返回的是经过escape编码的字符串.
var strResult = unescape(oBao.responseText);
//将字符串分开.
var arrResult = strResult.split("###");
RemoveRow(); //删除以前的数据.
//将取得的字符串分开,并写入表格中.
for(var i=0;i<arrResult.length;i++)
{
arrTmp = arrResult[i].split("@@@");
num1 = arrTmp[0]; //字段num1的值
num2 = arrTmp[1]; //字段num2的值
row1 = tb.insertRow();
cell1 = row1.insertCell();
cell1.innerText = num1;
cell2 = row1.insertCell();
cell2.innerText = num2;
}
}

function RemoveRow()
{
//保留第一行表头,其余数据均删除.
var iRows = tb.rows.length;
for(var i=0;i<iRows-1;i++)
{
tb.deleteRow(1);
}
}

function MyShow()
{
//2秒自动刷新一次,2秒取得一次数据.
timer = window.setInterval("GetResult()",2000);
}
</script>

<body onload="MyShow()">
<p>
</p>
<table width="47%" height="23" border="0" cellpadding="1" cellspacing="0" id="tb">
<tr>
<td>num1</td>
<td>num2</td>
</tr>
</table>


Server.asp 后台读取数据

<% @Language="JavaScript" %>
<%
function OpenDB(sdbname)
{
/*
*————— OpenDB(sdbname) —————–
* OpenDB(sdbname)
* 功能:打开数据库sdbname,返回conn对象.
* 参数:sdbname,字符串,数据库名称.
* 实例:var conn = OpenDB("database.mdb");
* author:wanghr100(灰豆宝宝.net)
* update:2004-5-12 8:18
*————— OpenDB(sdbname) —————–
*/
var connstr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(sdbname);
var conn = Server.CreateObject("ADODB.Connection");
conn.Open(connstr);
return conn;
}
var sResult = new Array();
var oConn = OpenDB("data.mdb");
//特殊字符:+,%,&,=,?等的传输解决办法.客户端字符是经过escape编码的
//所以服务器端先要经过unescape解码.
//Update:2004-6-1 12:22
var sql = "select num1,num2 from nums order by id";
var rs = oConn.Execute(sql);
while(!rs.EOF)
{
//一条记录用"###"隔开.每列数据用"@@@"隔开. 这是以只有两个列数据的情况.
sResult[sResult.length] = rs("num1").Value + "@@@" + rs("num2").Value
rs.MoveNext();
}
//escape解决了XMLHTTP。中文处理的问题.
Response.Write(escape(sResult.join("###")));
%>


数据库data.mdb
表 nums
id,自动编号
num1,文本
num2,文本

测试数据

id num1 num2
1 20.70 20.810
2 10.5 20.5
3 12.3 300
4 132 323
5 563 56
6 20 10
2006年02月05日

 

‘*****************************************************************
‘ function
‘ 作用 :利用流保存文件
‘ 参数 :from(远程文件地址),tofile(保存文件位置)
‘*****************************************************************
Private Function SaveFiles(byref from,byref tofile)
 Dim Datas
 Datas=GetData(from,0)
 Response.Write "保存成功:<font color=red>"&formatnumber(len(Datas)/1024*2,2)&"</font>Kb"
 response.Flush
 if formatnumber(len(Datas)/1024*2,2)>1 then
  ADOS.Type = 1
  ADOS.Mode =3
  ADOS.Open
  ADOS.write Datas
  ADOS.SaveToFile server.mappath(tofile),2
  ADOS.Close()
 else
  Response.Write "保存失败:<font color=red>文件大小"&formatnumber(len(imgs)/1024*2,2)&"Kb,小于1K</font>"
  response.Flush
 end if
end function

‘*****************************************************************
‘ function(私有)
‘ 作用 :利用fso检测文件是否存在,存在返回true,不存在返回false
‘ 参数 :filespes(文件位置)
‘*****************************************************************
Private Function IsExists(byref filespec)
 If (FSO.FileExists(server.MapPath(filespec))) Then
 IsExists = True
 Else
 IsExists = False
 End If
End Function

‘*****************************************************************
‘ function(私有)
‘ 作用 :利用fso检测文件夹是否存在,存在返回true,不存在返回false
‘ 参数 :folder(文件夹位置)
‘*****************************************************************
Private Function IsFolder(byref Folder)
 If FSO.FolderExists(server.MapPath(Folder)) Then 
 IsFolder = True
 Else
 IsFolder = False
 End If
End Function

‘*****************************************************************
‘ function(私有)
‘ 作用 :利用fso创建文件夹
‘ 参数 :fldr(文件夹位置)
‘*****************************************************************
Private Function CreateFolder(byref fldr)
 Dim f
 Set f = FSO.CreateFolder(Server.MapPath(fldr))
 CreateFolder = f.Path
 Set f=nothing
End Function

‘*****************************************************************
‘ function(公有)
‘ 作用 :保存文件,并自动创建多级文件夹
‘ 参数 :fromurl(远程文件地址),tofiles (保存位置)
‘*****************************************************************
Public Function SaveData(byref FromUrl,byref ToFiles)
 ToFiles=trim(Replace(ToFiles,"//","/"))
 flName=ToFiles
 fldr=""
 If IsExists(flName)=false then
  GetNewsFold=split(flName,"/")
 For i=0 to Ubound(GetNewsFold)-1
  if fldr="" then
   fldr=GetNewsFold(i)
  else
   fldr=fldr&"\"&GetNewsFold(i)
  end if
  If IsFolder(fldr)=false then
   CreateFolder fldr
  End if
 Next
 SaveFiles FromUrl,flName
 End if
End function
‘*****************************************************************
‘ function(公有)
‘ 作用 :取得远程数据
‘ 参数 :url(远程文件地址),getmode (模式:0为二进制,1为中文编码)
‘*****************************************************************
Public Function GetData(byref url,byref GetMode)
 ’on error resume next
 SourceCode = OXML.open ("GET",url,false)
 OXML.send()
 if OXML.readystate<>4 then exit function
 if GetMode=0 then
 GetData = OXML.responseBody
 else
 GetData = BytesToBstr(OXML.responseBody)
 end if
 if err.number<>0 then err.Clear
End Function

‘*****************************************************************
‘ function(公有)
‘ 作用 :格式化远程图片地址为本地位置
‘ 参数 :imgurl(远程图片地址),imgfolder (本地图片目录),fristname(加入的前缀名称)
‘*****************************************************************
Public Function FormatImgPath(byref ImgUrl,byref ImgFolder,byref FristName,byref noimg)
 strpath=""
 ImgUrl=ImgUrl
 if instr(ImgUrl,"Nophoto") or lenb(GetData(ImgUrl,0))<=0 then
  strpath=noimg
  Response.Write "<a href="&strpath&">"&strpath&"</a>" &vbcrlf
 else
  if Instr(ImgUrl,".asp") then
   strpath=FristName&"_"&Mid(ImgUrl, InStrRev(ImgUrl, "=")+1)&".jpg"
  else
   strpath=FristName&"_"&Mid(ImgUrl, InStrRev(ImgUrl, "/")+1)
  end if
  strpath = ImgFolder&"/"&strpath
  strpath = Replace(strpath,"//","/")
  if left(strpath,1)="/" then strpath=right(strpath,len(strpath)-1)
  strpath = trim(strpath)
  Response.Write "<a href="&strpath&">"&strpath&"</a>" &vbcrlf
  savedata ImgUrl,strpath
 end if
 FormatImgPath = strpath
End function


实例:具体功能见“我爱博客(http://www.woiblog.com)”里有相关使用介绍!

1,要实现的功能就是在浏览器加一个右键快捷方式提交所选的网页或图片内容!实例应用在博客程序里,就是在你已登陆的情况下,浏览网页时看到比较好的新闻或图片!你就可以选中内容–》点右键 出现“加入我的网摘”,这时就会弹出一个IE窗口,自动将网页标题加入表单的对应标题内容,及选中内容加入相应内容项,还有引用网址等!如下图:
如果你已登陆则显示下图:

最后你提交一下表单就OK了!

2,现在 我们来看一下这个功能如何实现的!

   首先我们用文本编辑器写入:
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt]

[HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\将此页加到我的网摘]
@="http://www.woiblog.com/UserManage/addblog.asp"

。另存为.REG文件,即写入注册表项添加右键菜单

http://www.woiblog.com/UserManage/addblog.asp为处理页
源文件如下:

<html>
<head>
<meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">
<title></title>
</head>
<body lang="zh-CN">
<form id=form1 action="User_Post_Blog2.asp" method="post">
<P>
<input type="hidden" name="title" id=title1>
<input type="hidden" name="url" id=url1>
<input type="hidden" name="js" id=js1>
<TEXTAREA id=content1 style="DISPLAY: none" name="content"></TEXTAREA> </P>
</form>
</body>
</html>

<script language="Javascript">

  var oWin = external.menuArguments;
  var oDoc = oWin.document;
  var titlestr;
  var start, end;
  var getzy;
  start = end = -1;
  titlestr = oWin.document.selection.createRange().text;
  for( var i = 0; i < titlestr.length; i++ )
  {
   if( start == -1 )
    if( titlestr.charAt( i ) == ‘\n’ || titlestr.charAt( i ) == ‘\r’ )
     continue;
    else
     start = i;
   else if( titlestr.charAt( i ) == ‘\n’ || titlestr.charAt( i ) == ‘\r’ )
   {
    end = i;
    break;
   }
    
  }
  
  if( start != -1 && end != -1 && start < end )
   form1.title1.value = oDoc.title;
  else
   form1.title1.value = oDoc.title;
   

  for( var i = 0; i < oDoc.images.length; i++ )
  {
   oDoc.images( i ).src = oDoc.images( i ).src;
  }

  for( var i = 0; i < oDoc.links.length; i++ )
  {
   oDoc.links( i ).href = oDoc.links( i ).href;
  }

  form1.url1.value =  oDoc.URL ;
  getzy = oDoc.selection.createRange().text;
  form1.js1.value =  getzy.substr(0, 250)+"…" ;
  form1.content1.innerText = oWin.document.selection.createRange().htmlText;  
  
  form1.submit();
</script>
相信很多人都看懂了,上面是一个普通的表单,下面是一个script,关键还在下面
oDoc.title  网页标题
oDoc.URL网页地址
  getzy = oDoc.selection.createRange().text;   ‘以文本方式取得所选 的内容
  form1.js1.value =  getzy.substr(0, 250)+"…" ;   ‘取得前250个字符,之…结束,作为简介
 form1.content1.innerText = oWin.document.selection.createRange().htmlText;  HTML方式取得所选内容
 form1.submit();   自动提交表单到FORM里的ACTION即:User_Post_Blog2.asp
到这里已经做到了信息的获取!之后就是普通的ASP表单处理了!
像标题的VALUE就用value=<%=request("title")%>
其它的照样子搬就是了!

出处:第五网络(http://www.d5web.com)转载请注明


2006年01月24日

Norton Gost作为一个克隆应用工具软件,使用简单,功能强大,能大幅度缩减PC机的软件安装与升级的时间,从而达到降低企业成本。同样,对于个人用户,用Ghost来恢复系统可说是轻松加愉快,因而也深受欢迎。
  一般来说,用Ghost 来恢复系统的话十来分钟就能搞定。可也不时地在BBS 上看到有人因恢复时头脑发热误操作,结果造成保存有重要数据的分区被覆盖,可说是损失惨重,欲哭而无泪。一个主要原因是平常我们习惯上称的C盘,D 盘,E 盘,实际上指的是分区。比如讲,把装有Windows 系统的C 盘备份成Image文件,保存到E 盘上,就应是选Local \Partition\To Image 。同样,在恢复时应选local \partition \from image 。这时,如果一时糊涂,该选partition 时选了Disk的话,那可就完蛋了。

  我看过一些网络版杂志上介绍的都是简版Ghost (我没见过的东西太多了,没法子),介绍时也是图文并茂,浅显易懂。因为该软件的用法非常简单,使用时保持头脑清醒,每一个选项都在有百分之百把握时才按回车,否则退出确认后再进行。这样的话,不会出问题的。

  不久前,发现了一个很有用的功能,那就是象DOS下的命令一样,可以敲入行命令的方式完成Ghost的备份与恢复功能。如果把命令做成bat 文件,那么操作时,只要执行这个文件就行了。而且,如果把命令加到启动软盘的autoexec.bat文件,有条件的把备份的Image文件,Ghost 烧到可启动光盘上,那么,即使喝醉了,还知道按电源的话,就能恢复你的系统。(重要备注:写bat文件时可不能是酒后)

1. 实际使用例
下面是我的硬盘分区情况:Disk 1
Partition Type Volume label
C: 1: PRI DOS Pwin98
E: 2: PRI DOS Jwin98
3: EXT DOS
D: 4: LOG DOS Data

1) 备份
  ghost.exe -clone,mode=pdump,src=1:1,dst=D:\back\pwin98b.gho -z9 -sure
功能:把第一物理硬盘的第一分区(1:1) ,以最高压缩形式(-z9 )备份到D 盘的back 文件夹下,并取备份的Image 文件名为pwin98.gho,且在程序执行备份前,不出现最后确认的窗口(-sure) 。

2) 恢复

  ghost.exe -clone,mode=pload,src=d:\back\pwin98b.gho:1,dst=1:1 -sure -rb
功能:把保存在D 盘的back 文件夹下,名为pwin98.gho 的Image 备份文件中的第一分区内容(pwin98b.gho:1),恢复到第一物理硬盘的第一分区(1:1),且在程序执行恢复前,不出现最后确认的窗口(-sure),恢复完成后,自动重新启动系统(-rb) 。

除蟑螂小窍门

  1.洋葱驱蟑螂,蟑螂怕切开的洋葱浓刺激味,如果您放一盘切好的洋葱片在蟑螂出没处,保证蟑螂立即逃走。

  2.药品灭蟑螂,目前许多地方都卖灭蟑螂药,您可买点,按说明书去放置,也是灭蟑螂的好办法。

  3.糖水瓶子捕蟑螂,用罐头瓶1~2个,放3匙糖水加开水化开, 将瓶放在蟑螂活动的地方,蟑螂闻到香甜味,就会掉进罐头“陷井”,此法用于蟑螂少时。

  4.桐油灭蟑螂,买150克桐油,熬成粘性胶体,涂在木板或纸板上,中间放上带油香味的食物作诱饵,其它食物加盖,蟑螂一上来觅食,立即粘住。

5.配毒饵杀蟑螂,取硼砂、面粉各一份,糖少许,调匀做成米粒大的诱饵,蟑螂吃后即毒死。注意别让幼儿或宠物吃到。

  6.蟑螂怕鲜黄瓜和鲜桃叶,若是食品柜中有蟑螂,可放鲜黄瓜片或鲜桃叶,蟑螂闻到气味便避而远之。

  7.蟑螂喜暗怕光,打开电灯会立即将其惊跑。如果用红布包住电筒寻之,就能用蝇拍打个痛快。

  8.蟑螂喜欢在蜂窝煤里做窝产卵,因此可以买几块蜂窝煤放在一个地方,以便诱杀蟑螂。在厨房、碗柜内放些夹竹桃叶、黄瓜皮,可以起到驱赶蟑螂的作用。用硼砂和糕点搅拌混合,放置在蟑螂经常出没的地方,可以毒杀蟑螂。蟑螂喜欢啃食砧板上的残渣,可以将报纸剪成砧板大小,用蟑螂药笔在报纸上面画个同心圆,圆中心放一些蛋糕粉末等食物,天黑以后,把它放在砧板上,便可诱杀蟑螂。

灭臭虫小窍门

  1.按树叶粉、按树油各适量,加适量肥皂水,松节油调匀,抹在臭虫爬扰处即可。

  2.煤油洒在床的边沿,臭虫闻了即死,其它虫也能被杀灭。注意别有明火。

  3.买灭臭虫的药洒在床缝隙中,也能杀灭臭虫。

  4.将生有臭虫的床用开水烫,用煤油擦也能杀灭臭虫。

除蚊蝇小窍门

  1.在室内燃干桔皮,可代替卫生香,即能除异味,又能驱除蚊蝇。

  2.夏天蚊子多的地方,可用空瓶装3-5毫升糖水或啤酒, 放在室内,蚊子闻到甜酒味就会往瓶里钻,碰上糖水或啤酒就粘住,在蚊子多的地方,一昼夜可除蚊子几十只。

  3.将晒干的野艾草点燃,不出明火,只有烟,夜里室外乘凉时,蚊子不叮人。

  4.电坟香盒除蚊。目前市面上有多种灭菌用具,如灭蚊灯、电蚊香等效果均好。

  5.盘生灭蚊。用一只铁夹子将蚊香夹上一段,待烧至此处,蚊香自灭,又灭蚊又节约蚊香。

防虫蛀小窍门

  辣椒晒干磨粉缝在布包中,代替樟脑放在箱柜中,能防虫蛀;中药店中的细辛,用手帕包好,放在衣箱中或衣柜中,可驱逐或麻醉蛀虫,其挥发油还具有抑制霉菌的作用,衣物放细辛后,可起灭菌防腐的效果。

灭虫蚁的小窍门

  1.在放碗、盘的柜子里撒点花椒粉,可除虫蚁,还能驱鼠避疫;

  2.将鸡蛋壳烧焦研粉,撒在墙角或蚂蚁穴处,可杀死蚂蚁

杀鼻涕虫的小窍门

  将鸡蛋壳晒干研碎,撒在厨房墙根四周或菜窖及下水道周围,鼻涕虫不敢再到这里来。

驱蝇的小窍门

  1.在厨房内多放切碎的葱、葱头、大蒜,苍蝇不敢来叮;

  2.室内喷洒一些食醋,苍蝇远远避开;

  3.室内放盘西红柿,苍蝇吓得赶快跑。

2006年01月19日

 PHP4.0中共有超过30个新的数组相关函数。其中很多通用函数允许你检查给定数组中是否存在特定对象、对数组元素计数、增加或删除元素,或对元素排序。


如果你有很大的一个数组,而所要完成的仅是找出一个存在的给定值,你可以使用in_array()以返回true 或 false。如下代码将输出“Not found in this array”——因为你将在$namesArray中寻找一个并不存在的“Alber ”。

<? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John");

$lookingFor = "Albert";

if (in_array($lookingFor, $namesArray)) {

echo "You’ve found it!";

} else {

echo "Not found in this array!";

}

?>

<? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John");

$lookingFor = "Albert";

if (in_array($lookingFor, $namesArray)) {

echo "You’ve found it!";

} else {

echo "Not found in this array!";

}

?>

如果你改变了$lookingFor的值,将其变为“Mary”,你将得到消息“You’ve found it!”——因为“Mary”是$namesArray的一部分。

如果希望对数组元素计数,你可以使用count()函数:

<? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John");

$count = count($namesArray); ?>

$count值将为7。

<? $namesArray = array("Joe", "Jane", "Bob", "Mary", "Paul", "Eddie", "John");

$count = count($namesArray); ?>

$count值将为7。

你可以对任何数组添加元素,无论是在已存在数组的开始或末尾。你也可以使用函数以创建一个包含两个或多个数组元素的新数组。合并时每个数组将按需要的顺序排列。如果你的数组已经有内部的排序,你需要对新的合并数组重排序。

 让我们从对已存在数组的末尾增添元素开始,使用函数array_push(): 

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 加入到原始数组中 */

array_push($fruitArray, "grape", "pineapple", "tomato");

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

?>

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 加入到原始数组中 */

array_push($fruitArray, "grape", "pineapple", "tomato");

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

?>

这将显示:

0 : apple

1 : orange

2 : banana

3 : kiwi

4 : pear

5 : grape

6 : pineapple

7 : tomato

当你需要对数组开头添加元素时,代码非常类似。不同处只是函数名:array_unshift() 而不是array_push()。

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

/* 加入到原始数组中 */

 array_unshift($fruitArray, "grape", "pineapple", "tomato");

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

?>

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear"); 

/* 加入到原始数组中 */

 array_unshift($fruitArray, "grape", "pineapple", "tomato");

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

?>

这将显示:

0 : grape

1 : pineapple

2 : tomato

3 : apple

4 : orange

5 : banana

6 : kiwi

7 : pear

函数array_merge()合并两个或更多的数组。

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

<? /* 创建第二个数组 */

$vegArray = array("carrot", "green beans", "asparagus", "artichoke", "corn");

/* 合并为一个数组 */

$goodfoodArray = array_merge($fruitArray, $vegArray);

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($goodfoodArray)) {

echo "$key : $value<br>";

}

?>

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

<? /* 创建第二个数组 */

$vegArray = array("carrot", "green beans", "asparagus", "artichoke", "corn");

/* 合并为一个数组 */

$goodfoodArray = array_merge($fruitArray, $vegArray);

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($goodfoodArray)) {

echo "$key : $value<br>";

}

?>

这将显示:

0 : apple

1 : orange

2 : banana

3 : kiwi

4 : pear

5 : carrot

6 : green beans

7 : asparagus

8 : artichoke

9 : corn

现在已经对数组进行了增加元素和合并,现在来练习删除元素函数。你可以使用函数array_pop()从一数组末尾删除一个元素。如果使用函数 array_shift(),则从一数组开头删除一个元素。而实际上当你从数组删除元素时,此元素对你而言仍然可用——当你从已存在的数组中对元素进行 pop 或 shift时。

使用array_pop()函数从数组末尾删除一个值:

<?

/* 创建一数组*/

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 在末尾弹出某值 */

$popped = array_pop($fruitArray);

/* 列出新数组内容,以及弹出的值*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

echo "<br>and finally, in $popped: $popped";

?>

<?

/* 创建一数组*/

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 在末尾弹出某值 */

$popped = array_pop($fruitArray);

/* 列出新数组内容,以及弹出的值*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

echo "<br>and finally, in $popped: $popped";

?>

 这将显示: 

0 : apple

1 : orange

2 : banana

3 : kiwi

and finally, in $popped: pear

Next, delete an element from the end of an array: ???????????

下面,从数组末尾删除某值:

<?

/* 创建一数组*/

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 从数组头部移出某值 */

$shifted = array_shift($fruitArray);

/* 列出新数组的内容以及移出的值*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

echo "<br>and finally, in $shifted: $shifted";

?>

<?

/* 创建一数组*/

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 从数组头部移出某值 */

$shifted = array_shift($fruitArray);

/* 列出新数组的内容以及移出的值*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

echo "<br>and finally, in $shifted: $shifted";

?>

这将显示:

0 : orange

1 : banana

2 : kiwi

3 : pear

and finally, in $shifted: apple

有很多函数可以帮助你对数组元素排序。但我将会演示基本的排序以帮助你了解其过程:

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 排序 */

sort($fruitArray);

/* 对其重设以正确从头到尾显示数组 */

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

?>

<? /* 创建原始数组 */

$fruitArray = array("apple", "orange", "banana", "kiwi", "pear");

/* 排序 */

sort($fruitArray);

/* 对其重设以正确从头到尾显示数组 */

/* 通过其键值列出每个元素*/

while (list($key,$value) = each($fruitArray)) {

echo "$key : $value<br>";

}

?>

这将显示:

0 : apple

1 : banana

2 : kiwi

3 : orange

4 : pear

2006年01月16日

        目前有很多无组件上传类,大多写的相当复杂,有的居然还只能传文本,最关键的是没有10行代码以下的。
  其实无组件上传最核心的代码就是ADODB.Stream,实际只用五行代码就可以实现了无组件上传。

  Set objStream = Server.CreateObject("ADODB.Stream")
  objStream.Type = 1
  objStream.Open
  objStream.LoadFromFile Request("upfilename")
  objStream.SaveToFile Server."test.gif",2

  使用方法:

  把上面的代码写成upload.asp,在浏览器里面输入:http://localhost/upload.asp?file1=c:\test\test.gif

  localhost为你的主机地址,执行完后你会看到你的目录下面多了一个test.gif,他就是你要文件拉。

  根据原理我们可以扩展以下代码,算一个最小的ASP木马吧,有一点值得注意,上传的本地文件路径不能包含中文字符,否则会出错。

  upload.asp文件

<%
  Function GetFileName(ByVal strFile)
  If strFile <> "" Then
   GetFileName = mid(strFile,InStrRev(strFile, "\")+1)
  Else
   GetFileName = ""
  End If
  End  function
  
  strFileName = Request.Form("upfilename")
  If strFileName<>"" Then 
  Set objStream = Server.CreateObject("ADODB.Stream")
  objStream.Type = 1
  objStream.Open
  objStream.LoadFromFile strFileName
  objStream.SaveToFile Server.MapPath(GetFileName(strFileName)),2
  objStream.Close
  response.write "OK!"
  Else
%>
  <form action=’<%= Request.ServerVariables("URL") %>’ method=’post’>
  <input type=’file’ name=’upfilename’> <input type=’submit’></form>
<%
  End if
%>

2006年01月13日

当联接表时,创建的联接类型影响出现在结果集内的行。可以创建下列联接类型:

  • 内联接   仅显示两个联接表中的匹配行的联接。(这是查询设计器中的默认联接类型。)例如,可以联接 titles 表和 publishers 表以创建显示每个书名的出版商名称的结果集。在内联接中,结果集内不包含没有出版商信息的书名,也不包含没有书名的出版商。这类联接所得到的 SQL 可能象下面这样:
    SELECT     title, pub_name
    FROM         titles INNER JOIN
    publishers ON titles.pub_id = publishers.pub_id

    注意   当创建内联接时,包含 NULL 的列不与任何值匹配,因此不包括在结果集内。空值不与其它的空值匹配。

    外联接   甚至包括在联接表中没有相关行的行的联接。可以创建外联接的三个变化形式来指定所包括的不匹配行:

    • 左向外联接   包括第一个命名表("左"表,出现在 JOIN 子句的最左边)中的所有行。不包括右表中的不匹配行。例如,下面的 SQL 语句说明 titles 表和 publishers 表之间的左向外联接包括所有的书名,甚至包括那些没有出版商信息的书名:
      SELECT titles.title_id,
             titles.title, 
             publishers.pub_name
      FROM titles LEFT OUTER JOIN publishers
                  ON titles.pub_id
                   = publishers.pub_id
    • 右向外联接   包括第二个命名表("右"表,出现在 JOIN 子句的最右边)中的所有行。不包括左表中的不匹配行。例如,在 titles publishers 表之间的右向外联接将包括所有的出版商,甚至包括那些在 titles 表中没有书名的出版商。所得到的 SQL 可能象下面这样:
      SELECT titles.title_id,
             titles.title, 
             publishers.pub_name
      FROM titles RIGHT OUTER JOIN publishers
                  ON titles.pub_id
                   = publishers.pub_id
    • 完整外部联接   包括所有联接表中的所有行,不论它们是否匹配。例如,titles 表和 publishers 表之间的完整外部联接显示所有书名和所有出版商,甚至包括那些在另一个表中没有匹配值的书名和出版商。
      SELECT titles.title_id,
             titles.title, 
             publishers.pub_name
      FROM titles FULL OUTER JOIN publishers
                  ON titles.pub_id
                   = publishers.pub_id
  • 交叉联接   在这类联接的结果集内,两个表中每两个可能成对的行占一行。例如,在通过作者 CROSS JOIN 出版商输出的结果集内,每个可能的作者/出版商组合占一行。所得到的 SQL 可能象下面这样:
    SELECT *
    FROM authors CROSS JOIN publishers 

一、简单查询
   简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。
它们分别说明所查询列、查询的
表或视图、以及搜索条件等。
例如,下面的语句查询testtable表中姓名为“张三”的nickname字段和email字段。
SELECT nickname,email
FROM testtable WHERE name=’张三’

(一)选择列表
  选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变 量和全局变量)等构成。

   1、选择所有列 例如,下面语句显示testtable表中所有列的数据: SELECT * FROM testtable

   2、选择部分列并指定它们的显示次序 查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。
例如: SELECT nickname,email FROM testtable

   3、更改列标题 在选择列表中,可重新指定列标题。定义格式为: 列标题=列名 列名 列标题 如果指定的列标题不是标准的标识符格式时,应使用引号定界符。
例如,下列语句使用汉字显示列 标题: SELECT 昵称=nickname,电子邮件=email FROM testtable

   4、删除重复行 SELECT语句中使用ALL或DISTINCT选项来显示表中符合条件的所有行或删除其中重复的数据行,默认 为ALL。使用DISTINCT选项时,对于所有重复的数据行在SELECT返回的结果集合中只保留一行。

   5、限制返回的行数 使用TOP n [PERCENT]选项限制返回的数据行数,TOP n说明返回n行,而TOP n PERCENT时,说明n是 表示一百分数,指定返回的行数等于总行数的百分之几。
例如: SELECT TOP 2 * FROM testtable SELECT TOP 20 PERCENT * FROM testtable

(二)FROM子句
  FROM子句指定SELECT语句查询及与查询相关的表或视图。在FROM子句中最多可指定256个表或视图, 它们之间用逗号分隔。 在FROM子句同时指定多个表或视图时,如果选择列表中存在同名列,这时应使用对象名限定这些列 所属的表或视图。
例如在usertable和citytable表中同时存在cityid列,在查询两个表中的cityid时应使用下面语句格式加以限定:

 SELECT username,citytable.cityid
 FROM usertable,citytable
 WHERE usertable.cityid=citytable.cityid

在FROM子句中可用以下两种格式为表或视图指定别名: 表名 as 别名 表名 别名
例如上面语句可用表的别名格式表示为:

SELECT username,b.cityid
FROM usertable a,citytable b
WHERE a.cityid=b.cityid

SELECT不仅能从表或视图中检索数据,它还能够从其它查询语句所返回的结果集合中查询数据。
例如:
  SELECT a.au_fname+a.au_lname
 FROM authors a,titleauthor ta (SELECT title_id,title FROM titles WHERE ytd_sales>10000 ) AS t
 WHERE a.au_id=ta.au_id AND ta.title_id=t.title_id
 此例中,将SELECT返回的结果集合给予一别名t,然后再从中检索数据。

(三)使用WHERE子句设置查询条件
  WHERE子句设置查询条件,过滤掉不需要的数据行。
例如下面语句查询年龄大于20的数据:
  SELECT *
  FROM usertable
   WHERE age>20

  WHERE子句可包括各种条件运算符:
  比较运算符(大小比较):>、>=、=、<、<=、<>、!>、!<
  范围运算符(表达式值是否在指定的范围):BETWEEN…AND… NOT BETWEEN…AND…
  列表运算符(判断表达式是否为列表中的指定项):IN (项1,项2……) NOT IN (项1,项2……)
  模式匹配符(判断值是否与指定的字符通配格式相符):LIKE、NOT LIKE
  空值判断符(判断表达式是否为空):IS NULL、NOT IS NULL
  逻辑运算符(用于多条件的逻辑连接):NOT、AND、OR

1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30
2、列表运算符例:country IN (‘Germany’,'China’)
3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。
 可用于char、 varchar、text、ntext、datetime和smalldatetime等类型查询。
 可使用以下通配字符: 百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%。 下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。 方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 [^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
  例如: 限制以Publishing结尾,使用LIKE ‘%Publishing’ 限制以A开头:LIKE ‘[A]%’ 限制以A开头外:LIKE ‘[^A]%’ 4、空值判断符例WHERE age IS NULL 5、逻辑运算符:优先级为NOT、AND、OR

(四)查询结果排序
  使用ORDER BY子句对查询返回的结果按一列或多列排序。
 ORDER BY子句的语法格式为: ORDER BY {column_name [ASC|DESC]} [,…n]
 其中ASC表示升序,为默认值,DESC为降序。
 ORDER BY不能按ntext、text和image数据类型进行排序。
 例如: SELECT * FROM usertable ORDER BY age desc,userid ASC 另外,可以根据表达式进行排序。

二、联合查询
  UNION运算符可以将两个或两个以上上SELECT语句的查询结果集合合并成一个结果集合显示,即执行联 合查询。UNION的语法格式为: select_statement UNION [ALL] selectstatement [UNION [ALL] selectstatement][…n]
其中selectstatement为待联合的SELECT查询语句。 ALL选项表示将所有行合并到结果集合中。不指定该项时,被联合查询结果集合中的重复行将只保留一行。
  联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语句中定义。要对联合查询结果排序时,也必须使用第一查询语句中的列名、列标题或者列序号。
  在使用UNION 运算符时,应保证每个联合查询语句的选择列表中有相同数量的表达式,并且每个查询选 择表达式应具有相同的数据类型,或是可以自动将它们转换为相同的数据类型。在自动转换时,对于数值类 型,系统将低精度的数据类型转换为高精度的数据类型。 在包括多个查询的UNION语句中,其执行顺序是自左至右,使用括号可以改变这一执行顺序。
例如: 查询1 UNION (查询2 UNION 查询3)

三、连接查询
  通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型 数据库管理系统的一个标志。
  在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在 一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作给用户带 来很大的灵活性,他们可以在任何时候增加新的数据类型。为不同实体创建新的表,尔后通过连接进行查询。
  连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。
   SQL-92标准所定义的FROM子句的连接语法格式为:
     FROM join_table join_type join_table
      [ON (join_condition)]
  其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一 个表操作的连接又称做自连接。
  join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比 较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用 的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。
   外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN) 和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹 配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。
   交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的 数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
   连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑 运算符等构成。
   无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接 连接。
  例如:
    SELECT p1.pub_id,p2.pub_id,p1.pr_info
       FROM pub_info AS p1 INNER JOIN pub_info AS p2
       ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)
  (一) 内连接 内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值。
内连接分 三种:
1、等值连接:在连接条件中使用等于号(=)运算符比较被连接列的列值,其查询结果中列出被连接 表中的所有列,包括其中的重复列。
2、不等连接: 在连接条件使用除等于运算符以外的其它比较运算符比较被连接的列的列值。
这些 运算符包括>、>=、<=、<、!>、!<和<>。
3、自然连接:在连接条件中使用等于(=)运算符比较被连接列的列值,但它使用选择列表指出查询 结果集合中所包括的列,并删除连接表中的重复列。
   例,下面使用等值连接列出authors和publishers表中位于同一城市的作者和出版社:
  SELECT * FROM authors AS a INNER JOIN publishers AS p
     ON a.city=p.city
又如使用自然连接,在选择列表中删除authors 和publishers 表中重复列(city和state):
  SELECT a.*,p.pub_id,p.pub_name,p.country
    FROM authors AS a INNER JOIN publishers AS p
    ON a.city=p.city
(二) 外连接 内连接时,返回查询结果集合中的仅是符合查询条件( WHERE 搜索条件或 HAVING 条件)和连接条件 的行。而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行,而且还包括左表(左外 连接时)、右表(右外连接时)或两个边接表(全外连接)中的所有数据行。
如下面使用左外连接将论坛内容和作者信息连接起来:
   SELECT a.*,b.* FROM luntan LEFT JOIN usertable as b
    ON a.username=b.username
下面使用全外连接将city表中的所有作者以及user表中的所有作者,以及他们所在的城市:
   SELECT a.*,b.* FROM city as a FULL OUTER JOIN user as b
    ON a.username=b.username
(三) 交叉连接 交叉连接不带WHERE 子句,它返回被连接的两个表所有数据行的笛卡尔积,返回到结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。
例,titles表中有6类图书,而publishers表中有8家出版社,则下列交叉连接检索到的记录数将等 于6*8=48行。
SELECT type,pub_name FROM titles CROSS JOIN publishers
ORDER BY type

2006年01月12日

1.常吃宵夜.会得胃癌.因为胃得不到休息

2. 一个星期只能吃四颗蛋.吃太多.对身体不好

3. 鸡屁股含有致癌物,不要吃较好

4. 饭后吃水果是错误的观念.应是饭前吃水果

5. 女生月经来时.不要喝绿茶.反正茶类不要喝就对了.多吃可以补血的东西

6. 喝豆?#123;时不要加鸡蛋及糖.也不要喝太多

7.空腹时不要吃蕃茄,最好饭后吃

8.早上醒来.先喝一杯水.预防结石

9.睡前三小时不要吃东西.会胖

10.少喝奶茶.因为高热量.高油.没有营养价值可言.长期饮用.易罹患高血压.糖尿病.等疾病

11.刚出炉的面包不宜马上食用

12.远离充电座.人体应远离30公分以上.切忌放在床边

13.天天喝水八大杯

14.每天十杯水.膀胱癌不会来

15.白天多喝水.晚上少喝水

16.一天不要喝两杯以上的咖啡.喝太多易导致失眠,胃痛

17.多油脂的食物少吃.因为得花5~7小时去消化,并使脑中血液集中到肠胃.易昏昏欲睡

18.下午五点后.大餐少少吃,因为五点后身体不需那么多能量

19.10种吃了会快乐的食物:深海鱼,香蕉,葡萄柚,全麦面包,菠菜,大蒜,南瓜,低脂牛奶,鸡肉,樱桃

20.睡眠不足会变笨,一天须八小时睡眠,有午睡习惯较不会老

21.最佳睡眠时间是在晚上10点~清晨6点

22.每天喝酒不要超过一杯,因为酒精会抑制制造抗体的B细胞,增加细菌感染的机会

23.服用胶囊应以冷水吞服(可以第一个吃),睡前30分先服药.忌立即躺下

24.酸梅具防止老化作用,青春永驻;肝火有毛病者宜多食用

25.掉发因素:熬夜,压力,烟酒,香鸡排.麻辣锅.油腻食物.?#123;味过重的料理

26.帮助头发生长:多食用包心菜,蛋.豆类;少吃甜食(尤其是果糖)

27.每天一杯柠檬汁,柳橙汁.不但可以美白还可以淡化黑斑

28.苹果是机车族、瘾君子、家庭主妇的常备良药,一天一颗,才能让自己有个干干净净的肺

29.抽烟又吃维他命(B胡萝卜素-A维他命的一种),会致癌,尽早戒烟.才是最健康的做法

30.女性不宜喝茶的五个时期:月经来时,孕妇,临产前.生产完后,更年期

31.抽烟,关系最大的是肺癌,唇癌,舌癌,喉癌,食道癌,也与膀胱癌有关

32.饮酒导致肝硬化.引发肝癌

33.吃槟榔会导致口腔纤维化,口腔癌

34.食物过于精细,缺乏纤维;含大量脂肪,尤其是胆固醇会引发胃癌

35.食物过于粗糙,营养不足时导致食道癌,胃癌

36.食品中的黄曲毒素.亚硝酸类物皆具有致癌性

37.不抽烟.拒吸二手烟

38.适量饮酒,不拚久.不醉酒

39.减少食用盐腌.烟熏,烧烤的食物

40.每天摄取新鲜的蔬菜与水果

41.每天摄取富含高纤维的五谷类及豆类

42.每天摄取均衡的饮食,不过量

43.维持理想体重.不过胖

44.保持规律的生活与运动

45.保持轻松愉快的心情

46.正确饮食习惯:早上吃的像皇帝,中午吃的像平民,晚上吃的像乞丐