一个关于数据库更新的问题

lubing7683 2008-04-09 11:54:48
今天在更新数据库的时候,发现程序出错,想要更新一条记录,结果却把一大把的记录更新。。

因为网页需要,物品需用户认领,所以用户名和密码初始为NULL,申请物品时才修改用户名和密码
程序如下:(修改用户名、密码)
......
......
goods_id=request.QueryString("goods_id")
.....
user=request.form("user")
pwd=request.form("pwd")
set rs=Server.CreateObject("adodb.recordset")
sql="Select id from 用户表 where 用户名='"&user&"'"
rs.Open sql,conn,1,1
if rs.eof and rs.bof then
rs.close
set rs=nothing
set rs=Server.CreateObject("adodb.recordset") '这里更改对象名和'sql'名也没用
sql="Select user,pwd from 物品表 where ID=&"goods_id
rs.Open sql,conn,1,2
rs("user")=user
rs("pwd")=pwd
rs.update
rs.close
set rs=nothing
conn.close
set conn=nothing
else
rs.close
set rs=nothing
conn.close
set conn=nothing
response.write("用户名已存在")
end if
我需要的结果是修改指定物品的用户名和密码
网页执行结果是:把所有用户名和密码都为空的记录都修改了。
仔细检查了半天,还是没有发现错误,只好请各位高手帮忙了!!!

...全文
109 点赞 收藏 22
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lubing7683 2008-04-14
heshengfen123
谢谢了,已经结贴给你分了,呵呵。
回复
heshengfen123 2008-04-11
测试代码,自己执行一下吧
1,this.asp

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
</head>

<body>
<form name="myForm" action="untitled.asp?goods_id=1" method="post">
<input type="text" name="text1" value="" />
<input type="Submit" name="submit" value="确定">
</form>
</body>
</html>
2.untitled.asp

<style type="text/css">
<!--
TD {
FONT-SIZE: 12px;
}

-->
</style>
<%
dim conn,strcon
strcon="Provider=Sqloledb;User ID=sa;Password=sa;Initial Catalog =test;Data Source=(local);"
Set conn = Server.CreateObject("ADODB.Connection")
conn.open strcon
%>
<title>物品认领 </title>

</head>

<body>

<%
dim goods,goods_id,rs,sql,user,cs_err
goods_id=trim(request.QueryString("goods_id"))
response.write goods_id
set rs=Server.CreateObject("adodb.recordset")
sql="Select 用户名 from 物品表 where ID="&goods_id
response.write sql

rs.Open sql,conn,1,1

if rs.eof and rs.bof then
response.write sql
response.end
rs.close
set rs=nothing
conn.close
set conn=nothing
set hx=nothing
response.Write(" <table width='100%' border='1' cellpadding='0' cellspacing='0' bordercolor='#cccccc'> <tr> <td height='50' bgcolor='#FBF9EA' align='center'> 请不要进行本店外操作!!! </td> </tr> </table>")
response.End()
end if


user=trim(rs("用户名"))
response.write "ddfdf"
rs.close
set rs=nothing
if trim(request.Form("hiddenField")) ="ture" then
cs_err=""
dim cs_user,cs_pwd1,cs_pwd2,phone,cs_code
cs_user=trim(request.Form("user"))
'if cs_user="" or isnull(cs_user) or isempty(user) then
' cs_err="请输入用户名"
' end if
' if len(cs_user)>20 or len(cs_user) <6 then
' cs_err="用户名为6~20字符"
' end if
' cs_pwd1=trim(request.Form("pwd1"))
' if cs_pwd1="" or isnull(cs_pwd1) or isempty(cs_pwd1) then
' cs_err="请输入密码"
' end if
' if len(cs_pwd1)>18 or len(cs_pwd1) <6 then
' cs_err="密码为6~18字符"
' end if
' cs_pwd2=trim(request.Form("pwd2"))
' if cs_pwd2="" or isnull(cs_pwd2) or isempty(cs_pwd2) then
' cs_err="请输入密码"
' end if
' if cs_pwd1 <>cs_pwd2 then
' cs_err="密码和确认密码不相符"
' end if
' if cs_err <>"" then
' conn.close
' set conn=nothing
' set hx=nothing

'response.End()
'end if


response.write "234"

set rs=Server.CreateObject("adodb.recordset")
sql="Select * from 物品表 where 用户名='"&cs_user&"'"
response.write sql

rs.Open sql,conn,3,1
dim uq
if rs.eof and rs.bof then
uq=0
else
uq=1
end if
response.write uq

rs.close
set rs=nothing
if uq=0 then
dim srs,ussql
set srs=Server.CreateObject("adodb.recordset")
ssql="Select 用户名,密码 from 物品表 where ID="&goods_id
response.write ssql

response.write ssql
srs.open ssql,conn,1,3
srs("用户名")=cs_user
srs("密码")=cs_pwd1
srs.update
response.write "更新"
response.end
srs.close
set srs=nothing
conn.close
set conn=nothing
set hx=nothing
response.Write(" <script>alert('物品申请成功,本站将在12小时内审核。现在将返回首页。');window.location.href='index.asp'; </script>")
response.End()
else
conn.close
set conn=nothing
set hx=nothing
response.Write(" <script LANGUAGE='javascript'>alert('用户名已存在');history.go(-1); </script>")
response.End()
end if



end if
if user="" or isnull(user) or isempty(user) then

%>
<form id="form1" name="form1" method="post" action="untitled.asp?goods_id=<%=goods_id%>">
<table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#cccccc">
<tr>
<td height="33" colspan="3" align="center" background="images/h2dhbg.jpg"> - <%=goods%>-物品认领 </td>
</tr>
<tr>
<td height="10" colspan="3" align="right" bgcolor="#FBF9EA">  </td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">用户名: </td>
<td height="40" colspan="2" bgcolor="#FBF9EA"> <label>
<input name="user" type="text" id="user" />
</label> <font color="#ff0000">(*必须为数字、字母、下划线组成) </font> </td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">密码: </td>
<td height="40" colspan="2" bgcolor="#FBF9EA"> <label>
<input name="pwd1" type="password" id="pwd1" size="16" />
</label> <font color="#ff0000">(*必须为数字、字母组成) </font> </td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">确认密码: </td>
<td height="40" colspan="2" bgcolor="#FBF9EA"> <label>
<input name="pwd2" type="password" id="pwd2" size="16" />
</label> <font color="#ff0000">(*) </font> </td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">联系电话: </td>
<td height="40" colspan="2" bgcolor="#FBF9EA"> <label>
<input name="telph" type="text" id="telph" />
</label> <font color="#ff0000">(*) </font> </td>
</tr>

<tr>
<td height="40" colspan="3" align="center" bgcolor="#FBF9EA"> <label>
<input type="hidden" name="hiddenField" value="ture"/>
<input type="submit" name="Submit" value="提 交" />
</label> </td>
</tr>
</table>

</form>
<%
else
conn.close
set conn=nothing
set hx=nothing
response.Write(" <tr> <td align='center'bgcolor='#FBF9EA' height='50'> <b>您申请的物品已被认领,如有疑问,请联系本站,我们将进行查证。 </b> </td> </tr> </table>")
end if
%>
</body>
</html>
回复
lubing7683 2008-04-10
[Quote=引用 6 楼 dogfish 的回复:]
rs.Open sql,conn,3,3,1

当然,使用直接execute最好。
[/Quote]

我把rs.open的参数改为conn,3,3,1还是不行,一样更新其他用户名和密码为NULL的记录

看了你的回复还以为找到原因,谁知道。。。。
回复
lubing7683 2008-04-10
[Quote=引用 2 楼 wlwqw 的回复:]
使用conn.execute("update 物品表 set user='"&user&"',pwd='"&pwd&"' where ID="&goods_id)试试
[/Quote]

我改用conn.execute("update....")后倒是没问题了,得到我想要得结果,问题是我开始的写法为什么会更新其他记录呢?为了避免以后出错,我想弄个明白
回复
lubing7683 2008-04-10
[Quote=引用 1 楼 hookee 的回复:]
sql="Select user,pwd from 物品表 where ID=&"goods_id
改为
sql="Select [user],pwd from 物品表 where ID=" & goods_id
rs.Open sql,conn,1,3
[/Quote]

呵呵,对不起,我写帖子的时候写倒了,程序是where ID=" & goods_id
回复
小逗狗 2008-04-10
[Quote=引用 1 楼 hookee 的回复:]
sql="Select user,pwd from 物品表 where ID=&"goods_id
改为
sql="Select [user],pwd from 物品表 where ID=" & goods_id
rs.Open sql,conn,1,3
[/Quote]
1楼正解!我也没看见!
回复
小逗狗 2008-04-10
使用conn.execute("update 物品表 set user='"&user&"',pwd='"&pwd&"' where ID="&goods_id)试试
回复
liyong888_8 2008-04-10
仔细再仔细
回复
lubing7683 2008-04-10
把sql="Select user,pwd from 物品表 where ID=&"goods_id 改成
sql="Select * from 物品表 where ID=&"goods_id 以后只更新指定的记录,达到我想要的结果。
各位高手,谁能告诉我这是为什么呢?
回复
Dogfish 2008-04-10
rs.Open sql,conn,3,3,1

当然,使用直接execute最好。
回复
lubing7683 2008-04-10
以上是原程序,现在工作去了。。。
回复
lubing7683 2008-04-10
<style type="text/css">
<!--
TD {
FONT-SIZE: 12px;
}

-->
</style>
<!--#include file="conn.asp" -->
<!--#include file="setup.asp" -->
<!--#include file="admin/md5.asp" -->
<title>物品认领</title>
<script language="javascript">
function CheckData()
{
var errMsg = "";
var user=document.getElementById('user').value;
var pwd1= document.getElementById('pwd1').value;
var pwd2=document.getElementById('pwd2').value;
var telph=document.getElementById('telph').value;
var codes=document.getElementById('codes').value;

//用户名、密码、验证都不能为空
if(user == "")
errMsg = "请输入用户名"
else if((user.length>20) ||(user.length<6))
errMsg = "用户名为6~20字符"
else if(pwd1 == "")
errMsg = "请输入密码"
else if((pwd1.length>18 ) ||(pwd1.length<6))
errMsg = "密码为6~18字符"
else if(pwd2 == "")
errMsg = "请输入确认密码"
else if(pwd1 != pwd2)
errMsg = "密码和确认密码不相符"
else if(telph == "")
errMsg = "请输入联系电话"
else if(telph.length>21)
errMsg = "您的联系电话实在是太长了"
else if(codes=="")
errMsg = "请输入验证码"
else if(codes.length !=4)
errMsg = "验证码错误"
if(errMsg == "")
return true;
else
{
//提示错误信息
window.alert(errMsg);
return false;
}
}


function SubmitForm()
{
//在提交表单时检验数据有效性
if(CheckData())
document.getElementById('form1').submit();
}



</script>
</head>

<body>

<%
dim goods,goods_id,rs,sql,user,cs_err
goods_id=cint(trim(request.QueryString("goods_id")))
set rs=Server.CreateObject("adodb.recordset")
sql="Select 用户名,物品 from 物品表 where ID="&goods_id
rs.Open sql,conn,1,1
if rs.eof and rs.bof then
rs.close
set rs=nothing
conn.close
set conn=nothing
set hx=nothing
response.Write("<table width='100%' border='1' cellpadding='0' cellspacing='0' bordercolor='#cccccc'><tr><td height='50' bgcolor='#FBF9EA' align='center'> 请不要进行本店外操作!!!</td></tr></table>")
response.End()
end if
goods=SafeRequest(trim(rs("物品")),0)
user=SafeRequest(trim(rs("用户名")),0)
rs.close
set rs=nothing
if trim(request.Form("hiddenField")) ="ture" then
cs_err=""
dim cs_user,cs_pwd1,cs_pwd2,phone,cs_code
cs_user=trim(request.Form("user"))
if cs_user="" or isnull(cs_user) or isempty(user) then
cs_err="请输入用户名"
end if
if len(cs_user)>20 or len(cs_user)<6 then
cs_err="用户名为6~20字符"
end if
cs_pwd1=trim(request.Form("pwd1"))
if cs_pwd1="" or isnull(cs_pwd1) or isempty(cs_pwd1) then
cs_err="请输入密码"
end if
if len(cs_pwd1)>18 or len(cs_pwd1)<6 then
cs_err="密码为6~18字符"
end if
cs_pwd2=trim(request.Form("pwd2"))
if cs_pwd2="" or isnull(cs_pwd2) or isempty(cs_pwd2) then
cs_err="请输入密码"
end if
if cs_pwd1<>cs_pwd2 then
cs_err="密码和确认密码不相符"
end if
phone=trim(request.Form("telph"))
if phone="" or isnull(phone) or isempty(phone) then
cs_err="请输入联系电话"
end if
if len(phone)>21 then
cs_err="联系电话最多21字符"
end if
phone=SafeRequest(phone,0)
cs_code=trim(request.Form("codes"))
if cs_code="" or isnull(cs_code) or isempty(cs_code) then
cs_err="请输入验证码"
end if
if len(cs_code)<>4 or cs_code<>Session("GetCode") then
cs_err="验证码不正确"
end if
if isuser(cs_user)<>true then
cs_err="用户名由数字、字母、下划线组成"
end if
if cs_err<>"" then
conn.close
set conn=nothing
set hx=nothing
response.Write("<script LANGUAGE='javascript'>alert('"&cs_err&"');history.go(-1);</script>")
response.End()
end if

cs_user=SafeRequest(cs_user,0)
cs_pwd1=SafeRequest(cs_pwd1,0)
cs_pwd1=md5(cs_pwd1)

set rs=Server.CreateObject("adodb.recordset")
sql="Select 物品 from 物品表 where 用户名='"&cs_user&"'"
rs.Open sql,conn,3,1
dim uq
if rs.eof and rs.bof then
uq=0
else
uq=1
end if
rs.close
set rs=nothing
if uq=0 then
dim srs,ussql
set srs=Server.CreateObject("adodb.recordset")
ssql="Select 用户名,联系电话,密码 from 物品表 where ID="&goods_id
srs.open ssql,conn,3,3,1
srs("用户名")=cs_user
srs("联系电话")=phone
srs("密码")=cs_pwd1
srs.update
srs.close
set srs=nothing
conn.close
set conn=nothing
set hx=nothing
response.Write("<script>alert('物品申请成功,本站将在12小时内审核。现在将返回首页。');window.location.href='index.asp';</script>")
response.End()
else
conn.close
set conn=nothing
set hx=nothing
response.Write("<script LANGUAGE='javascript'>alert('用户名已存在');history.go(-1);</script>")
response.End()
end if



end if
if user="" or isnull(user) or isempty(user) then

%>
<form id="form1" name="form1" method="post" action="?goods_id=<%=goods_id%>">
<table width="100%" border="1" cellpadding="0" cellspacing="0" bordercolor="#cccccc">
<tr>
<td height="33" colspan="3" align="center" background="images/h2dhbg.jpg"> -<%=goods%>-物品认领</td>
</tr>
<tr>
<td height="10" colspan="3" align="right" bgcolor="#FBF9EA"> </td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">用户名:</td>
<td height="40" colspan="2" bgcolor="#FBF9EA"><label>
<input name="user" type="text" id="user" />
</label> <font color="#ff0000">(*必须为数字、字母、下划线组成)</font></td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">密码:</td>
<td height="40" colspan="2" bgcolor="#FBF9EA"><label>
<input name="pwd1" type="password" id="pwd1" size="16" />
</label> <font color="#ff0000">(*必须为数字、字母组成)</font></td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">确认密码:</td>
<td height="40" colspan="2" bgcolor="#FBF9EA"><label>
<input name="pwd2" type="password" id="pwd2" size="16" />
</label> <font color="#ff0000">(*)</font></td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">联系电话:</td>
<td height="40" colspan="2" bgcolor="#FBF9EA"><label>
<input name="telph" type="text" id="telph" />
</label> <font color="#ff0000">(*)</font></td>
</tr>
<tr>
<td width="20%" height="40" align="right" bgcolor="#FBF9EA">验证码:</td>
<td height="40" colspan="2" align="left" bgcolor="#FBF9EA"><label>
<input name="codes" type="text" id="codes" size="6" />
</label> <img src='inc/getcode.asp' border=0 onClick="this.src='inc/getcode.asp?t='+Math.random()"> <font color="#ff0000">(如果看不清验证码,请点图片刷新)</font></td>
</tr>
<tr>
<td height="40" colspan="3" align="center" bgcolor="#FBF9EA"><label>
<input type="hidden" name="hiddenField" value="ture"/>
<input type="button" name="Submit" value="提 交" onClick="SubmitForm()" />
</label></td>
</tr>
</table>

</form>
<%
else
conn.close
set conn=nothing
set hx=nothing
response.Write("<tr><td align='center'bgcolor='#FBF9EA' height='50'><b>您申请的物品已被认领,如有疑问,请联系本站,我们将进行查证。</b></td></tr></table>")
end if
%>
</body>
</html>
回复
lubing7683 2008-04-10
[Quote=引用 16 楼 heshengfen123 的回复:]
sql="Select user,pwd from 物品表 where ID=&"goods_id
这个ID应该改成物品ID
[/Quote]

数据库是ID,我在写帖子的时候写成物品id,方便查看和理解

输出sql也尝试过,sql语句正确,id的类型为INT,我在接收参数的时候也做了格式化处理,goods_id=cint(goods_id),
我在想是不是接收的参数goods_id 出错,出现goods_id为空的情况,问题是输出SQL显示正确,参数也用cint格式化,并且尝试执行语句:select count(*) from 物品表 where id="&goods_id后返回也为一条记录,搞得我头都大了。

回复
heshengfen123 2008-04-10
sql="Select user,pwd from 物品表 where ID=&"goods_id
这个ID应该改成物品ID

回复
heshengfen123 2008-04-10
我先说一下我对你的程序的理解,你是先判断用户表中有没有该用户,如果没有才更新物品表
1,先用response.write goods_id 输出goods_id
2,sql="Select user,pwd from 物品表 where ID=&"goods_id
response.write sql
再输出这个看看是sql语句
回复
itzhiren 2008-04-10
也就是加上 用户名和密码不为空 的判断
回复
itzhiren 2008-04-10
sql="Select user,pwd from 物品表 where user is not null and pwd is not null and ID="&goods_id
回复
lubing7683 2008-04-10
[Quote=引用 9 楼 xiaojian 的回复:]
goods_id=request.QueryString("goods_id")

这句修改为:

goods_id=request("goods_id")


-----------------------------------------------------------
爱找房(http://www.izfang.com)
 我的个人网站,免费的房屋租赁网站,大家要多多捧场哦。
[/Quote]

应该不是这问题吧,改为request("goods_id")也是同样问题。
而且用request("goods_id")会增加服务器处理时间吧,我是看一篇关于ASP优化提到的
回复
lubing7683 2008-04-10
物品ID 用户名 密码 联系电话 email 时间
24 caitd123 45EC902AF5CAA54E53880FC0BB95ECE4 13800000000 abc@sina.com 2007-12-9
25 null null null null 2007-12-10
26 null null null null 2007-12-11
....
40 null null null null 2007-12-12
回复
heshengfen123 2008-04-10
把 用户表,物品表 的一些你认为正确的初始记录贴上来看看
回复
加载更多回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2008-04-09 11:54
社区公告
暂无公告