网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > SQL语法 > 正文

[ASP]数据库操作技巧

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

【网学网提醒】:网学会员为广大网友收集整理了,[ASP]数据库操作技巧,希望对大家有所帮助!


    几个注意事项:
    1、
    没有事先声明过的变量,或由request取得的值,判断是否为空时,应该使用如下格式:
    ifrequest("name")&;""=""then...
    否则可能会得到错误的结果
    2、
    以"H"开头的变量,在用"&;"做串接运算时,一定要加上空格,下面的写法是错误的:
    ...
    Hits=request.form("hits")
    sql="select*fromtablewhereHits="&;Hits
    ...
    复制代码
    在VBScript中,&;H是代表16进制常数,比如&;H5fac90相当于C++中的0x5fac90
    因此,要用下面的写法:
    ...
    Hits=request.form("hits")
    sql="select*fromtablewhereHits="&;Hits
    ...
    复制代码
    3、
    添加和修改文本型字段记录时,不推荐使用下列SQL语句:
    insertintotable(...)values(...)
    updatetableset......
    这类SQL语句本身构造起来非常麻烦,而且容易出错,最重要的是存在SQL注入的隐患,只要数据检测稍有不慎,整个系统有可能崩溃。
    创建一个recordset对象,用
    rs("xxx")=xxxx
    ...
    rs.update
    的方式,代码清晰,又没有危险,即使出现错误,也不会影响到数据库安全。所以大家不要为了节省一个recordset对象的空间而冒如此大的风险。
    另外,在用rs.addnew添加记录时,千万要一条结果为空的SQL语句,比如:
    "select*fromtablewhereid<0"
    因为我们需要的只是这个表的结构,而不用管它是否有记录,以节省资源。
    4、
    recordset对象可以用字段索引值来代替字段名
    setrs=server.createobject("adodb.connection")
    sql="selectusername,age,cityfromuserdef"
    rs.opensql,conn,1,1
    ...
    复制代码
    这里
    rs(0)等价于rs("username")
    rs(1)等价于rs("age")
    rs(2)等介于rs("city")
    批量删除记录
    如一个相册网站,会员登录后批量删除自己照片程序:
    表A是会员及相册,表B照片
    tableA字段:
    ID------编号
    total---------总照片数量
    username-------用户名
    tableB字段:
    picID-----------照片ID
    bookID---------相册编号,对应tableA.ID
    title---------照片名称
    用checkbox取得要删除的照片编号:
    
    
    
    
    ...
    关于复选框,大家注意一定要给相同的名称
    这样,在处理页面中,request.form("ids")的值会是一个字符串(有网友说是数组,我没有验证过)
    如果前一个页面勾选了第1、2、3项,那么response.writerequest.form("ids")结果是1,2,3逗号是自动添加的
    其实在
中只要name相同的两个控件,request.form都会用逗号把两个值串起来,只是实际用途不大。
    删除时,从严格安全上讲,不仅没办法,而且不能批量删除,因为不敢保证传递过来的ids中所有项目都对应tableB的picID(伪造
    太容易了),删除之前要做两次检查:
    1、当前图片是否存在
    2、当前图片拥有者是否属于当前登录的会员
    满足这两个条件才可以删除。因此,要用循环一个一个地比较、删除。
    <%
    ...
    ids=split(request.from("ids"),",")
    selsum=ids.count'选择的图片数量
    delsum=0'表二删除数量计数器
    nondel=""'未删除ID记录
    foreachidinids
    sql="selectbookIDfromtableBwherepicID="&;id
    setrs=conn.execute(sql)
    ifnotrs.eofthen'----------图片是否存在
    ifrs(0)=session("userID")then'------是否属于当前会员
    sql="deletefromtableBwherepicID="&;id
    conn.execute(sql)
    delsum=delsum+1
    else
    nondel=nondel&;id&;","
    endif
    else
    nondel=nondel&;id&;","
    endif
    next
    sql="updatetableAsettotal=total-"&;delnum&;"whereid="&;session("userID")
    conn.execute(sql)
    response.write"共选择了"&;selsum&;"条记录,成功删除"&;delsum&;"条记录"
    ifnondel<>""thenresponse.write"未删除ID:"&;nondel
    ...
    %>
    复制代码
    有人说,如果用request.servervariables("http_referer")先做来源判定,若数据不是本站提交则转到错误处理,这里就只需要3条SQL语句:
    sql="deletefromtableBwherepicIDin("&;ids&;")"
    conn.execute(sql)
    sql="selectcount(picID)fromtableBwherebookID="&;session("userID")
    setrs=conn.execute(sql)
    delnum=rs(0)
    sql="updatetableAsettotal=total-"&;delnum&;"whereid="&;session("userID")
    conn.execute(sql)
    复制代码
    然而referer也是可以伪造的,如网际快车、讯雷这类软件就是通过伪造REFERER来突破某些防盗链网站的限制进行下载,不过这不是一般人能干的事情,对于一个普通的相册网站肯花大力气来攻击的人,我只能表示强烈的谴责和遗憾...
    运用SQL语句会使用程序变得简单,但这是以牲牺安全性为代价
    严格检测,提高安全性,则是以牺牲效率为代价
    按不同字段排序
    一个数据表有username,city,age,address等字段,点击不同字段则按此字段排序:
    <%
    orderby=request("orderby")
    selectcaseorderby
    case"fld1"
    orderby="username"
    ordertxt="用户名"
    case"fld2"
    orderby="city"
    ordertxt="城市"
    case"fld3"
    orderby="age"
    ordertxt="年龄"
    case"fld4"
    orderby="address"
    ordertxt="地址"
    caseelse
    orderby="username"'默认排序字段
    ordertxt="用户名"
    endselect
    href="xxx.asp?orderby="
    sql="select*fromtablewhere...orderby"&;orderby
    ...
    %>
    ...
    
    当前排序:<%=ordertxt%>
    
    
    用户
    名
    城市
    年龄
    地址
    
    ...
    复制代码
    排序参数传递的时候不要用数据库字段名
    当然,还可以再加一个参数,用于控制顺序或倒序,这个交给大家,我就不写了。
    构造搜索页面的SQL语句
    搜索页面的核心是构造一个WHERE子句,一般的写法是:
    sql="select*fromtablewhere"
    sql=sql&;"like'%"&;username&;"%'"
    sql=sql&;"and城市like'%"&;city&;"%'"
    sql=sql&;"and年龄="&;age
    sql=sql&;"orderbyuserIDdesc"
    复制代码
    这里有一个问题,就是不管用户什么输入几个条件,都会搜索程序中列出来的所有字段,降低了效率。
    如果稍做修改,注意第一句:
    sql="select*fromtablewhere1"
    ifusername<>""thensql=sql&;"andlike'%"&;username&;"%'"
    ifcity<>""thensql=sql&;"and城市like'%"&;city&;"%'"
    ifage<>""thensql=sql&;"and年龄="&;age
    sql=sql&;"orderbyuserIDdesc"
    复制代码
    如果用户什么都没有输入,生成的WHERE子句是:
    ...where1orderbyfldX
    如果用户搜索为"张三",年龄为25的记录,生成的WHERE子句是:
    ...where1andlike'%张三%'andage=25
    对于全部由"and"连接的搜索条件,"where1"对后面的搜索完全无影响,好比数学上的连乘算式:1*M*N其结果仍是M*N
    其实也可以写成这种形式:wheretrue,where1=1,where"abc"="abc"等等,只要是逻辑上值为“真”的表达式都可以,它的作用就是让后面跟的"and"合法,只不过where1是最简便的写法。(不理解的朋友可以看看《逻辑代数》的有关知识,很简单也很有趣)
    无关的字段都排除了,只搜索需要的字段,无疑提高了效率。
    可以做一个“查看全部记录”的链接,直接链接到本页名称,什么参数都不加,那全部列表和搜索一起都实现了,我想这也许对要做相册、日记这类网站的朋友有所帮助吧。
    OA系统多部门权限判定
    一个公司内部的办公网站,职员登录之后只能查看自己部门的资料,经理可以浏览所有部门资料,另有只能经理进入的页面
    做法:
    在用户表每添加权限字段,逻辑类型,有几个部门就添加几个
    再加上经理权限字段,比如:
    isJSB技术部
    isYFB研发部
    isCHB策划部
    ...
    isBOSS经理
    如果某人同时属于研发部和策划部,那就把相应的字段设为TRUE
    经理权限判断:
    ifnotrs("isBOSS")then错误处理过程"非经理"
    部门权限判断(技术部为例):
    ifnotrs("isBOSS")then
    ifnotrs("isJSB')then错误处理过程"非技术部人员"
    endif
    复制代码
    不推荐用SESSION
    保存权限,可以在用户登录时写入COOKIES,过期时间设为浏览器进程,进入部门页面时从COOKIES读取相应权限进行判断
    几个常用函数,很简单,但是很方便。
    <%
    subWriteJs(JS)
    response.write("")
    response.writejs
    response.write("")
    endsub
    subJsAlert(msg)
    dimjs
    js="alert('"&;msg&;"');"
    callWriteJs(js)
    endsub
    '功能:弹出信息并跳转到指定页面
    '参数:
    'msg---信息内容,若为""则不弹出信息
    'url-----指定跳转页面,若为"BACK"则返回前一页
    subMsgOut(msg,url)
    dimjs
    ifmsg<>""thencallJsAlert(msg)
    ifurl="BACK"then
    js="history.back();"
    else
    js="location="""&;url&;""";"
    endif
    WriteJs(js)
    response.end
    endsub
    '功能:关闭当前页,弹出信息,并对父窗口进行操作
    '参数:
    'msg---信息内容,若为""则不弹出信息
    'url-----指定父窗口链接
    '若为""则只关闭当前窗口
    '若为"BACK"则父窗口返回前一页
    '若为"RELOAD"则父窗口刷新一次
    subJsExit(msg,url)
    dimjs
    ifmsg<>""thencallJsAlert(js)
    selectcaseurl
    case""
    js=""
    case"BACK"
    js="opener.history.back();"
    case"RELOAD"
    js="opener.location.reload();"
    caseelse
    js="opener.location="""&;url&;""";"
    endselect
    js=js&;"opener=null;window.close();"
    callWriteJs(js)
    response.end
    endsub
    functionmklink(url,txt,nwd,cls)
    dimlnk
    lnk="    ifcls<>""thenlnk=lnk&;"class="&;cls
    lnk=lnk&;">"
    lnk=lnk&;txt&;""
    mklink=lnk
    endfunction
    functionfntcolor(txt,clr)
    fntcolor=""&;txt&;""
    endfunction
    复制代码
    
设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师