Microsoft VBScript 运行时错误 '800a0009' 下标越界: '[number: 1]'的解决方法

本文最后更新于 2018.07.22,总计 2475 字 ,阅读本文大概需要 1 ~ 3 分钟
本文已超过 2272天 没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

从年初开始准备考研,已经很久没有更新自己的博客了。假期帮学校搞服务器,遇到了一个有趣的问题,记录一下吧。

起因

在服务器数据迁移完毕,环境搭建好,正式运行后,学校官网首页出现了这个问题
1.png

打开文件,找到问题行:

<%
    sql="select top 10 d_id,d_title,class_id,d_time,is_url,url from a_detail where class_id = 12 or class_id = 18 or class_id = 19 order by d_id desc"
    set rs=server.createobject("adodb.recordset")
    rs.open sql,conn,1,1
    if not rs.eof and not rs.bof then
    Do While Not rs.eof
        dim class_id,d_id,d_time,d_year,d_month,d_day
        class_id = rs("class_id")
        d_id = rs("d_id")
        d_time_text = CStr(rs("d_time"))
        d_time_arr = Split(d_time_text,"-")
        d_year = d_time_arr(0)
        
        if d_time_arr(1) <= 9 then   // 问题行
            d_month = "0"&d_time_arr(1)            
        else
            d_month = d_time_arr(1)
        end if
        
        if d_time_arr(2) <= 9 then
            d_day = "0"&d_time_arr(2)
        else
            d_day = d_time_arr(2)            
        end if
        
        if rs("is_url") = true then
            Response.Write("<tr><td><img src='pic/row.png' align='absmiddle'><font class='NewsTitledy'>"&d_month&"-"&d_day&"</font>&nbsp;|&nbsp;<a class='NewsTitledy' href='"&rs("url")&"' target='_blank'>"&rs("d_title")&"</a><td></tr>")
        else
            Response.Write("<tr><td><img src='pic/row.png' align='absmiddle'><font class='NewsTitledy'>"&d_month&"-"&d_day&"</font>&nbsp;|&nbsp;<a class='NewsTitledy' href='page/page/"&class_id&"/"&d_year&"-"&d_month&"-"&d_day&"-"&d_id&".html' target='_blank'>"&rs("d_title")&"</a><td></tr>")
        end if        
        rs.movenext
    Loop    
    end if    
    rs.close
%>

这段代码的功能不难理解,就是从top表中取出相应的字段,然后调用各个字段的值,在组合列出链接目录。
从代码看,没有任何问题,文件是从原服务器上直接拷贝下来的,在原来的环境下,没有任何问题,那么现在问题出现在哪里了呢?

寻找原因

根据提示,发现是数组下标越界了,尝试将d_time_arr(1) <= 9 改成 d_time_arr(0) <= 9 :

2.png

再结合一下代码,瞬间明白了!!!

看这一行

       d_time_arr = Split(d_time_text,"-")

我们知道split() 方法用于把一个字符串分割成字符串数组,在这里的分割依据是“-”符号,但是服务器的时间格是“yyyy/M/d”!

解决

知道问题就容易解决了。
方法有两种,第一种就是将服务器的时间格式改为yyyy-M-D,步骤如下:

** 运行 --> 输入 regedit

** 找到 HKEY_USERS.DEFAULTControl PanelInternational

** 找到右侧的 sDate和sShortDate,将其中的“/” 改为“-”

** 重启IIS

第二种简单点,直接修改代码,将d_time_arr = Split(d_time_text,"-")改成d_time_arr = Split(d_time_text,"/")
以上,成功解决了“Microsoft VBScript 运行时错误 '800a0009' 下标越界: '[number: 1]' ”的问题。

「感谢老板送来的软糖/蛋糕/布丁/牛奶/冰阔乐!」

panda

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码打赏

版权属于:

Panda | 热爱安全的理想少年

本文链接:

https://cnpanda.net/talksafe/188.html(转载时请注明本文出处及文章链接)

暂时无法评论哦~

暂无评论