php用户重名检测的问题!! 代码如下 那位大侠帮我看看错在哪里啊?

<?phpinclude("conn.php");if($_POST['submit']){$sql="insertintouser(user_id,user_name,... <?php

include("conn.php");
if($_POST['submit']){

$sql="insert into user (user_id,user_name,user_pw,user_type)".
"values ('','$_POST[username]','$_POST[userpw]','$_POST[usertype]')" ;
mysql_query($sql);

}

$sql="select user_name from user where user_name='$_POST[username]'";
$test = mysql_query($sql);
$rows = mysql_fetch_array($test);
if($rows){
echo "window.alert(用户名已经存在!)";}

?>

<form name="myform" action="" method="post" text-align="center">
<p align="center">会员名:<input type="text" name="username">
<p align="center">密  码:<input type="password" name="userpw">
<p align="center">重输密码:<input type="password" name="pw2"><br><br>

<p align="center">
<select name="usertype">
<option value="administor" selected="selected">管理员</option>
<option value="teacher" >教师</option>
<option value="student" >学生</option>
</select>

<p align="center">
<input type="submit" name="submit" value="注册" onclick="return CheckPost()">
</p>
</form>
展开
 我来答
匿名用户
2011-05-05
展开全部
代码原理有问题。先插入后读取。
即使不考虑原理问题,那么假设原来存在,插入失败,读取结果为有。假设不存在,插入成功,读取结果还是有。
原理如果修正,应该先读取后插入。即使这样,你的原理本来的问题在于,如果两个用户同时提交相同的名字,可能都能通过读取,然后才分别执行插入,导致第一个用户的资料被覆盖掉。
这里提供两个可行的原理:
1.用户名字段设置为UNIQUE KEY,那么插入失败的mysql_query将直接返回FALSE表示已经存在。
2.在mysql_query插入之后,执行mysql_affected_rows,如果得到1,就是插入成功。
这两个原理都不需要预先检查。简单地说,就是把“插入”和“检查”两个东西在同一条SQL中实现,这样得到的结果可以避免“两个用户同时提交什么”的问题
更多追问追答
追问
非常谢你的回答 
我是新手所以还很菜哦
要是我想在用户重名后点击注册后会出现提示 如何修改以上代码
追答
自己去查一下UNIQUE KEY,好像是叫“唯一键”。没法在这里做到,需要在数据库表结构的地方设置。设置好之后:
0, 'teacher' => 1, 'student' => 2);
if (isset($_POST['username']) && isset($_POST['userpw']) && isset($_POST['username']) && isset($_POST['usertype']) && isset($validUserTypes[$_POST['usertype']])){
$result = mysql_query("insert into `user` (`user_id`,`user_name`,`user_pw`,`user_type`)".
"values ('','".
mysql_real_escape_string($_POST[username])."','".
mysql_real_escape_string($_POST[userpw])."','".
mysql_real_escape_string($_POST[usertype])."');";
if ($result) {
echo "window.alert('注册成功!')";
} else {
echo "window.alert('注册用户名已经存在!')";
}
}
?>
另外,楼下说的是错的。不加单引号是错的,这个错误被PHP报告之后会被忽略掉,但是完全打开PHP的错误报告就可以看到。
寿司带你看宠物
2011-05-05 · 猫猫狗狗的情感和咨讯分享
寿司带你看宠物
采纳数:2 获赞数:1

向TA提问 私信TA
展开全部
$_POST[username] 这东西是变量,不要加单引号
另外判断应该放在插入记录之前吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
失路者穷人
2011-05-05 · TA获得超过364个赞
知道小有建树答主
回答量:165
采纳率:64%
帮助的人:64.8万
展开全部
①查询数据库语句应该在插入数据库之前执行
②$sql变量用了两次不安全,两句SQL应该赋值给两个变量,如$sql_select $sql_insert
③SQL里的$_POST[]没用引号,建议先把$_POST[“username”]等赋值给变量$username,再在SQL语句中引用,如
$username=$_POST["username"];
$sql="select user_name from user where user_name=$username";
php操作数据库的sql语句最好去phpmyadmin里面复制来修改一下用,自己在php中写的sql语句可能不能被正常执行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式