如何让用户知道该名称已存在
问题描述:
新程序员 - 我创建了一个将用户添加到数据库的功能。这个功能可以在USER类中找到。我已经建立了mysql,让user_name成为唯一的密钥。如果用户试图输入一个已经存在的名字,它不会被输入到mysql数据库中,但是我的表单表示确定它已经被提交并且移动到下一页。我想让用户知道名称已经存在,并在注册表单上创建错误。有没有办法将它附加到这个函数?如何让用户知道该名称已存在
function add_member($name, $email, $password)
{
global $mysqli;
$query = "INSERT INTO members
SET
user_name = '".addslashes($name)."',
user_email = '".addslashes($email)."',
password = '". md5($password) ."'";
$success = $mysqli->query ($query);
if (!$success || $mysqli -> affected_rows == 0)
{
echo "<p> An error occurred: you just are not tough enough!!! </p>";
return FALSE;
}
$uid = $mysqli -> insert_id;
return $uid;
if (!$found_error)
{
header("location: homepage.php");
}
答
为了防止重定向,你必须通知你的前端,还有的是一个错误。
无论何时用户点击“提交”,您的表单都会尝试“移至下一页”。它会做任何行动。
在这一行动(我假设是在这个过程中的下一个页面),你应该有页面处理错误 - 即:
<?php //results.php
if(false === add_member($name, $email, $password)){
//you may want to write code that sends post data with error type here...
header("location:create_user.php");
}
?>
注意,标题运用重定向是有些不雅,但如何处理错误的最佳做法超出了这个问题的范围...
我的观点是,您必须捕获结果页面上的错误,并让该页面处理失败的尝试。
答
为什么在用户输入他想要的用户名以检查它是否可用之后,您不会进行Ajax调用。更准确地说,它可以是这样的:
<form id="registration_form" action="register">
<input id="username" type="text" onchange="checkAvailability();"/>
<div id="availability"></div>
</form>
<script type="text/javascript>
function checkAvailability()
{
$.ajax({
type: "GET",
url: "checkAvailability.php",
data: $("username").val(),
success: function(response) {
var status = $(response).find('status').text();
if (status == 'failed') $("#availability").html("This username is not available!");
else $("#availability").html("This username is available!");
},
dataType: "xml"
});
}
</script>
答
你接近,但不是只是在做刀片,尝试做一个选择上的名字第一次检查用户。如果记录数大于零,则知道它已经存在。
然后,要么提出一个JavaScript警报或发送到antother页面,如果它已经存在,否则继续前进,并插入。通过这种方式,您不依赖数据库来为您做检查,然后您可以更好地控制接下来会发生的情况。
祝你好运,HTH - 乔
我没有亲自使用MySQLi,所以我会将它作为注释:您需要使用用户提供的电子邮件地址查询数据库。如果它返回的行数多于零,则它是重复的,并且以一种很好的方式告诉它们:-) – Bojangles
不要**使用'addslashes'来转义数据库输入!永远不能。 (使用'mysqli :: real_escape_string()'或[prepared statements](http://php.net/mysqli_prepare)来代替,并且为了避免使用md5并使用腌过的散列) – knittl
@pst:更新注释以提供准备好的语句 – knittl