错误:ASP 0156 : 80004005

今天一客户联系我说使用的网站添加新闻等操作时候突然报错,提示为
答复对象 错误 ‘ASP 0156 : 80004005’
头错
/nanraocheng/news/admin_news_add_save.asp,行146
HTTP头已经写入到客户浏览器。任何 HTTP 头的修改必须在写入页内容之前。
到达现场后调试发现该ASP程序在本机调试错误,上传后即出现改错误,检测后得出结论为缓冲输出的错误,解决方法及原理如下:
原因是
iis5.0   默认使用网页缓存,pws或iis4.0(winnt系统)   默认不使用网页缓存   。
所以<%response.buffer   =   true%>放在顶部或response.redirect   语句放在任何html语句前面。即在使用Response.Redirect之前不要输出任何客户端(Browse)的   HTML   或   Script!
一般都是在最前面加上 <%response.buffer=true%>
 

使用ASP的Scripting.Dictionary对象打造完美购物车

一直不习惯用Dictionary,但是有时候却很有用。
Dictionary 对象
Dictionary 对象用于在结对的名称/值中存储信息((等同于键和项目)。Dictionary 对象看似比数组更为简单,然而,Dictionary 对象却是更令人满意的处理关联数据的解决方案。
比较 Dictionary 和数组:

  • 键用于识别 Dictionary 对象中的项目
  • 无需调用 ReDim 来改变 Dictionary 对象的尺寸
  • 当从 Dictionary 删除一个项目时,其余的项目会自动上移
  • Dictionary 不是多维,而数组是
  • Dictionary 与数组相比,有更多的内建对象
  • Dictionary 在频繁地访问随机元素时,比数组工作得更好
  • Dictionary 在根据它们的内容定位项目时,比数组工作得更好

Dictionary 对象的属性和方法描述如下:

属性
CompareMode:设置或返回用于在 Dictionary 对象中比较键的比较模式。
Count:返回 Dictionary 对象中键/项目对的数目。
Item:设置或返回 Dictionary 对象中一个项目的值。
Key:为 Dictionary 对象中已有的键值设置新的键值。
方法
Add:向 Dictionary 对象添加新的键/项目对。
Exists:返回一个逻辑值,这个值可指示指定的键是否存在于 Dictionary 对象中。
Items:返回 Dictionary 对象中所有项目的一个数组。
Keys:返回 Dictionary 对象中所有键的一个数组。
Remove:从 Dictionary 对象中删除指定的键/项目对。
RemoveAll:删除 Dictionary 对象中所有的键/项目对。

<%
Dim oDic,aItems,aKeys 
Set oDic = Server.CreateObject("Scripting.Dictionary")  '添加 
oDic.Add "aaa",111 
oDic.Add "bbb",222 
oDic.Add "ccc",333 
oDic.Add "ddd",444  '修改 
If oDic.Exists("aaa") Then 
  oDic.key("aaa") = "eee" 'key属性,只读 
  oDic.item("eee") = 555 'item属性,可读写 
End If  '列表 
aKeys = oDic.Keys 
aItems = oDic.Items
For i=0 To oDic.Count-1 
 Response.Write(aKeys(i) & "," & aItems(i)) 
Next  '删除 
Response.Write(oDic.Count) 
oDic.Remove("eee") '从 Dictionary 对象中删除键和项目对 
Response.Write(oDic.Count) 
oDic.RemoveAll() '删除 Dictionary 对象中的所有键和项目对 
Response.Write(oDic.Count)
Set oDic = Nothing
%>

购物车具体用法:

1、为客户建立购物车,名为shop
set session(“shop”)= CreateObject(“Scripting.Dictionary”)
2、检查客户当前购物车商品个数
session(“shop”).count=0
如果为0,那么自然表示购物车现在是空的
3、客户订购某一商品
session(“shop”).add id,num
id表示数据库中商品的ID或编号等,num表示客户订购此商品的
个数
4、客户查看购物车列表(客户确认当前已购买了的商品列表)
id=session(“shop”).keys
num=session(“shop”).items
以上2句均返回的是数组型数据,分别付给id(商品ID组)和num(
商品数量组)这2个变量
聪明的你马上就会想到只要通过循环把它们一一对应起来就OK了:
for i=0 to session(“shop”).count-1
…id(i)
…这里可以结构操作数据库把商品的信息取出来,通过操作商品编
号数组id(i)
do while not rs.eof
…num(i)
…然后循环结果集,使价格等与商品对应,通过操作商品个数数组
num(i)
rs.movenext
loop
next
数组的下标是从0开始,所以要count-1哦
这部可能有点乱,不过如果你有点经验的话应该是很容易读懂的。
5、客户更改某一商品的订购数量
session(“shop”)(id)=num
太简单了,我不多解释了。
6、客户删除某一商品
session(“shop”).remove(id)
7、客户清空购物车
session(“shop”).removeall
 

MySql的常用Engine

MyISAM:它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,
对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打开也可以),将大大提高性能。

MySQL检查表是否存在

1. SHOW TABLES LIKE ‘%tb_bp_d_case%’;
2. select `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` where `TABLE_SCHEMA`=’dbname’ and `TABLE_NAME`=’tablename’ ;
3. 如果表不存在就建立这个表,那么可以直接用 create table if not exists tablename 这样的指令来建立,不需要先去查询表是否存
4. 从模板表创建表:create table if not exists like old_table_name;

--
-- 表的结构 `iweb_admin`
--
DROP TABLE IF EXISTS `iweb_admin`;
CREATE TABLE `iweb_admin` (
`id` int(11) NOT NULL auto_increment COMMENT '管理员ID',
`admin_name` varchar(20) NOT NULL COMMENT '用户名',
`password` varchar(32) NOT NULL COMMENT '密码',
`role_id` int(11) NOT NULL COMMENT '角色ID',
`create_time` datetime default NULL COMMENT '创建时间',
`email` varchar(255) default NULL COMMENT 'Email',
`last_ip` varchar(30) default NULL COMMENT '最后登录IP',
`last_time` datetime default NULL COMMENT '最后登录时间',
`is_del` tinyint(1) NOT NULL default '0' COMMENT '删除状态 1删除,0正常',
PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COMMENT='管理员用户表';

还不错的Js模拟弹出框

直接把代码都Copy下来运行一下

<script language="javascript">
function getPosition() {
var top    = document.documentElement.scrollTop;
var left   = document.documentElement.scrollLeft;
var height = document.documentElement.clientHeight;
var width  = document.documentElement.clientWidth;
return {top:top,left:left,height:height,width:width};
}
function showPop(){
var width  = 300;  //弹出框的宽度
var height = 160;  //弹出框的高度
var obj    = document.getElementById("pop");
obj.style.display  = "block";
obj.style.position = "absolute";
obj.style.zindex   = "999";
obj.style.width    = width + "px";
obj.style.height   = height + "px";
var Position = getPosition();
leftadd = (Position.width-width)/2;
topadd  = (Position.height-height)/2;
obj.style.top  = (Position.top  + topadd)  + "px";
obj.style.left = (Position.left + leftadd) + "px";
window.onscroll = function (){
var Position   = getPosition();
obj.style.top  = (Position.top  + topadd)  +"px";
obj.style.left = (Position.left + leftadd) +"px";
};
}
function hidePop(){
document.getElementById("pop").style.display = "none";
}
</script>

PHP die() 函数

die() 函数输出一条消息,并退出当前脚本。该函数是 exit() 函数的别名。
die(status)
status 必需。规定在退出脚本之前写入的消息或状态号。状态号不会被写入输出。
如果 status 是字符串,则该函数会在退出前输出字符串。
如果 status 是整数,这个值会被用作退出状态。退出状态的值在 0 至 254 之间。退出状态 255 由 PHP 保留,不会被使用。状态 0 用于成功地终止程序。
注释:如果 PHP 的版本号大于等于 4.2.0,那么在 status 是整数的情况下,不会输出该参数。
一个例子:

<?php
$site = "http://www.hec8.com/";
fopen($site,"r") or die("Unable to connect to $site");
?>

ASP读取xls格式的Excel文件

Excel也是一种数据库,跟Access类似,其读取方法也类似。
这里有一个简单的Excel表,文件名字为Excel.xls:

咱就这个为例子来说明。
创建Excel连接代码:

Dim XlsConn,xrs
Set XlsConn=Server.CreateObject("Adodb.Connection")
XlsConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("Excel.xls")&";Extended Properties=Excel 8.0"

是不是跟连接Access文件很像呢?呵呵~
连接创建好了,就可以创建记录集查询Excel里面的数据了。

Set xrs=XlsConn.Execute("Select * From [Sheet1$]")

跟其他数据库的查询几乎是一样的,要注意的地方就是表名,Excel里面,默认会有三张表,Sheet1、Sheet2、Sheet3,从上面的例子也可以看到,需要注意查询时表名后面要加“$”符;查询结果:

xrs(0)="数据列0"
xrs(1)="1"
xrs(2)="2"
xrs(3)="3"
xrs(4)="4"
xrs(5)="5"

这里有一点需要注意,如果一列中有多行,有的行的值是数字,有的行是字符,ASP去取值的时候数字行会读取出错,是为空的。所以得想办法把数字行也变成字符型,比如加个’号去,读取出来之后再替换回去。
 
多行自然是用xrs.Movenext去循环取得了。够简单吧!
最后贴一段代码:

Dim rs
Set rs=Server.CreateObject("Adodb.Recordset")
rs.Open "Select Top 1 * From Pro Where 1=2",Conn,3,2
Dim XlsConn,xrs
Set XlsConn=Server.CreateObject("Adodb.Connection")
XlsConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("Excel.xls")&";Extended Properties=Excel 8.0"
Set xrs=XlsConn.Execute("Select * From [Sheet1$]")
Do While Not xrs.Eof
rs.Addnew
rs("iClear")= xrs(0)
rs("Detail")= xrs(1)
rs.Update
xrs.Movenext
Loop
xrs.Close()
Set xrs=Nothing
XlsConn.Close()
Set XlsConn=Nothing
rs.Close()
Set rs=Nothing

The system cannot locate the resource specified.

ASP网站采集程序用的好好的,今天突然出现这问题。本地能正常采集,就是服务器上死活不让采。

The system cannot locate the resource specified.

这个是捕捉到的Err.Description提示。程序如下:

Set xmlHttp = CreateObject("Msx"&"ml2.XM"&"LHT"&"TP.6.0")
xmlHttp.Open "POST", PostUrl, False 
XmlHTTP.setRequestHeader "Content-Length",Len(PostData)  
xmlHttp.setRequestHeader "Content-Type","application/x-www-form-urlencoded" 
xmlHttp.setRequestHeader "Referer", RefererUrl
xmlHttp.Send PostData

Google之,错误原因及其解决方法有不少,罗列一下:

(一)那就是最基本的了,你的服务器不支持xmlhttp或组件版本态低,需要下载相应的组件。这个一般服务器都不需要的,大多数情况下都支持xmlhttp,所以这个情况较少。
(二)msxml3.dll文件可能损坏或该文件使用权限不够(权限这个情况可能性较小),如果是文件损坏的话,你可以到网上下载相应系统环境的msxml3.dll文件替换下(2003系统好像在c:windowssystem32下),需要关闭相应的服务例如iis等才能覆盖。
(三)防火强或杀毒软件禁用了相应的端口,具体该怎么设置要根据不同的软件而定,你可以试着关闭防火墙或杀毒软件后再测试确定是否是这个问题。
(四)重新注册下该组件试试看。开始>>运行: regsvr32 msxml3.dll
(五)DNS解析错误,检查你的网络设置或正确的域名解析访问
(六)检查你的IP筛选的设置(这个不是太了解)
(七)对方资源失效,比如采集某条信息时,对方该条信息不存在导致程序终止错误,也可能是这种情况。这种错误都是出现在调用了 xmlhttp 组件的 Open方法,接着再用Send方法后造成的。当open方法的的 url 参数无法访问时,就会造成 8000005 错误。并且一旦产生这种错误,就会导致应用程序终止,无法继续操作。
(八)进入服务器设置您的IE安全选项(把等级设中或低试试看),在受信任网站里加入您要获取的域名即可。
(九)去微软下载了MSXML 4.0 Service Pack 2 (Microsoft XML Core Services)和Hotfix for MSXML 4.0 Service Pack 2 – KB832414 – 简体中文(KB832414_MSXML4.0_x86.exe)安装后,问题解决了!

仔细看了一下,貌似讲的都跟我这不一样,因为我同个服务器另外一个采集程序能正常采集。于是上服务器上查看,期待能找到点端倪。
将采集网站的网址放服务器上浏览器运行,居然打不开。猜测应该是对方把我的IP给屏蔽掉了。
知道原因就好办了,于是本地采集数据,然后远程插入服务器数据库。搞定。 本地的IP是动态的,每天都变,看你怎么屏蔽,要想彻底搞定我,他只能修改网站代码不让采集了。
道高一尺,魔高一丈~! 嘿嘿~