前几天做了一个后台管理页面,其中一个主要功能就是在线新建文章并把文章信息添加到服务器的数据库里,后来觉得不妥,因为大家都知道现在的虚拟主机很不稳定,安全也让人不太放心,说不定哪天早上起来就打不开了。为了不让自己辛辛苦苦敲键盘写的东西脆弱地付之东流,每写几篇文章就得备份一次,文章倒是好说,FTP点几下就搞定,数据库又备份又还原的就显得有些麻烦。所以,萌生了一个新建文章时也顺便就把文章存一份到本地,让本地数据库也同时更新的想法。思路很简单,实现起来也比较顺利,无非就是用javascript客户端脚本FSO和读写数据库操作而已。
form表单内容大体如下:
<form action="manger.asp" method="post" name="form1" id="form1" target="_self" style="font-size:12px">
标识:<input name="artid" id="artid" type="text" maxlength="20">
内容:<textarea name="phx" id= "phx" cols="118" rows="25" margin-bottom:5px;">
标题:<input name="caption" id="caption" type="text" maxlength="30" style="width:375;">
来源:<input name="comefrom" id="comefrom" type="text" maxlength="50" value="洗米器网站">
作者:<input name="author" id="author" type="text" maxlength="18" value="阿零">
<script language="javascript" src="scripttome.js" type="text/javascript">
<input type="button" value="生成本地文章" name="tome" id="tome" onClick="creatart()" />
<input type="button" value="添加信息到本地数据库" name="tomydbbase" id="tomydbb" onClick="addtomybd()" />
</form>
javascript脚本操作客户端数据库的主要代码如下:
var conn = new ActiveXObject("ADODB.Connection");
conn.Open("provider=sqloledb;data source=127.0.0.1;User id=sa; pwd=sa;Initial Catalog=article");
var rs = new ActiveXObject("ADODB.Recordset");
var glstr="select * from articles where artid = '"+document.getElementById('artid').value+"'";
rs.Addnew();
rs("artid")=document.getElementById('artid').value; rs("caption")=document.getElementById('caption').value;
rs("author")=document.getElementById('author').value;
rs("comefrom")=document.getElementById('comefrom').value;
但在后来检查本地数据库数据完整性是发现了一个很隐蔽的错误:文章数据表的一个作者字段(author)既然是空值!呜呼哀哉。查验服务器端asp执行正常,使用的是request.form("author")获取文章作者。客户端使用以下代码显示正常:
alert (document.getElementById('caption').value);
alert (document.getElementById('comefrom').value);
但是使用如下代码则显示“undefine”(未定义):
alert (document.getElementById('author').value);
几经折腾,多方查阅资料,问题依然没有得到解决,无奈之下,更改form表单的作者输入框名称为“zuozhe”,使用以下代码终于显示正常:
alert (document.getElementById('zuozhe').value);
仔细分析之后,觉得错误出现的原因可能是网页的<meta name="Author" Content="洗米器网站,(邮箱地址)" />在作祟。于是更改为:<meta name="Author" Content="洗米器网站,(邮箱地址)" value="哈哈哈哈哈"/> 使用以下代码来测试,显示“哈哈哈哈哈”:
alert (document.getElementById('author').value);
推断正确,客户端javascript脚本不能获取表单作者项(author)的原因原来是表单项命名与网页的<meat>标签发生冲突导致的。
经验总结:在实际的代码编写过程中,应该尽量避免使用特殊的英文关键字来命名表单项和变量,对于这些特殊关键字,实在不行就使用拼音,这样做无非就是代码的可读性差一点,但相比之下,排除这些隐蔽性很强的错误可能要花费更多时间。并且,抓臭虫(bug)实在是一个让人恶心又崩溃的事情!!